文档章节

rocketmq中的jvm配置分析

ihuotui
 ihuotui
发布于 2017/04/07 09:12
字数 2268
阅读 820
收藏 9
jvm

broker的jvm参数分析(rocketmq地址

  • rocketmq的broker.sh中的jvm参数。

# JVM Configuration
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:+DisableExplicitGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"

分析

  • 1.内存大小设置

-Xmx:设置JVM最大可用内存.
-Xms:设置JVM初始内存.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存.
-Xmn:设置年轻代大小.

  • 2.GC回收设置

-XX:+UseG1GC 使用G1垃圾回收器
-XX:G1HeapRegionSize=16m 设置的 G1 区域的大小。值是 2 的幂,范围是 1 MB 到 32 MB 之间。目标是根据最小的 Java 堆大小划分出约 2048 个区域。
-XX:G1ReservePercent=25 设置作为空闲空间的预留内存百分比,以降低目标空间溢出的风险。默认值是 10%。增加或减少百分比时,请确保对总的 Java 堆调整相同的量。Java HotSpot VM build 23 中没有此设置。
-XX:InitiatingHeapOccupancyPercent=30 设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。
-XX:SoftRefLRUPolicyMSPerMB=0 这个参数比较有用的,官方解释是:Soft reference在虚拟机中比在客户集中存活的更长一些。其清除频率可以用命令行参数 -XX:SoftRefLRUPolicyMSPerMB=<N>来控制,这可以指定每兆堆空闲空间的 soft reference 保持存活(一旦它不强可达了)的毫秒数,这意味着每兆堆中的空闲空间中的 soft reference 会(在最后一个强引用被回收之后)存活1秒钟。注意,这是一个近似的值,因为  soft reference 只会在垃圾回收时才会被清除,而垃圾回收并不总在发生。系统默认为一秒,我觉得没必要等1秒,客户集中不用就立刻清除,改为 -XX:SoftRefLRUPolicyMSPerMB=0;
-XX:SurvivorRatio=8 两个survivor:eden=2:8,就是一个survivor占eden的十分之一。
-XX:+DisableExplicitGC 标志自动将System.gc()调用转换成一个空操作,就是应用中调用System.gc()会变成一个空操作。

  • 3.日志设置

JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" 不作详细介绍
-XX:-OmitStackTraceInFastThrow 
强制要求JVM始终抛出含堆栈的异常(-XX:-OmitStackTraceInFastThrow)
它跟JDK5的一个新特性有关,对于一些频繁抛出的异常,JDK为了性能会做一个优化,即JIT重新编译后会抛出没有堆栈的异常,而在使用-server模式时,该优化选项是开启的,因此在频繁抛出某个异常一段时间后,该优化开始起作用,即只抛出没有堆栈的异常信息

  • 4.初始化设置

-XX:+AlwaysPreTouch 
启动时访问并置零内存页面-XX:+AlwaysPreTouch
启动时就把参数里说好了的内存全部舔一遍,可能令得启动时慢上一点,但后面访问时会更流畅,比如页面会连续分配,比如不会在晋升新生代到老生代时才去申请页面使得GC停顿时间加长。不过这选项对32G之类的大堆才会更有感觉一点。

  • 5.直接内存设置

-XX:MaxDirectMemorySize=15g 直接内存大小,因为使用netty作为tcp框架,netty使用的内存不经过jvm管理。

  • 6.内存页面

-XX:-UseLargePages 大页面

   在计算机系统中,内存被分为固定大小的区块,这个区块就叫做页(page)。内存的存取是通过程序把虚拟内存地址转换成物理内存地址实现的。虚拟到物理地址是在一个块表里面映射的。为了减少每次存取内存的时候使用页表的消耗,通常会使用一种快速的虚拟到物理地址转换的缓存。这个缓存叫做转换后备缓冲区(translation lookaside buffer),简称TLB。

通过TLB来满足虚拟到物理地址的映射请求,会比遍历页表来找到映射关系快很多,一个TLB通常包含指定数量的条目。一个TLB条目是一个基于页大小虚拟到物理地址映射,因此,更大的页大小允许一个条目或者一个TLB有更大的内存地址范围。在TLB中有更广泛的地址,更少的地址转换请求在TLB中不命中,就可以减少遍历页表(page table)操作。使用大页的目的就是减少TLB的不命中。

 Oracle solariz,Linux 以及Windows都支持HotSpot VM使用大页。通常处理器可以支持几种页大小,不过不同的处理器各不相同。另外,操作系统配置需要使用大页。下面说说怎么样在Linux下使用大页(Large Page)

Linux下的大页面
  在写作本书的时候,在Linux下使用大页,除使用-XX:+UseLargePages命令选项以外,需要修改操作系统配置。Linux的修改操作具体和发行版本以及内核有关系。为了合理的启用Linux下的大页,可以征询Linux管理员的意见或者阅读Linux发行文档。一旦使用了Linux操作系统配置已经修改,-XX:+UseLargePage命令行选项就必须要使用了。比如:
1. $ java -server -Xmx1024m -Xms1024m -Xmn256m -XX:+UseLargePages ...  
  如果大页没有被合理设置,HotSpot VM同样会接受-XX:+UseLargePages是一个有效的选项,不过会报告无法获取大页,而且会退回操作系统的默认页大小。

  • 7.线程优化

-XX:-UseBiasedLocking
有偏见的锁

   有偏见的锁是使得锁更偏爱上次使用到它线程。在非竞争锁的场景下,即只有一个线程会锁定对象,可以实现近乎无锁的开销。

   有偏见的锁,是在Java 5 update 6引入的。通过HotSpot VM的命令选项-XX:+UseBiasedLocking启用。

   Java 5 HotSpot JDK需要明确的命令来启用这个特性,在使用-XX:+AggressiveOpts选项,有偏见的锁会Java 5中会被自动启用。在Java 6中是默认启用的。

   各种经历告诉我们这个特性对大多数应用还是非常有用的。然后,有一些应用使用这个属性不一定能够表现的很好,比如,锁被通常不被上次使用它的同一个线程使用。对于Java应用来说,由于stop-the-world安全点操作需要取消偏见,这样可以通过使用-XX:-UseBiaseLocking来获得好处。如果你不清楚你的应用是什么情况,可以通过分别设置这两个选项来测试。

  • 推导

broker特点:1线程不多,追求吞吐量,追求低延时,数据量大。

broker的作用是,接收生产者的消息,保存和分发消息给消费者。

broker工作,使用tcp长链接,使用大量内存作为缓冲,然后还有大量数据。有偏向锁,在少线程情况下(broker就是线程少,要求吞吐量大),就是非公平锁那样,会比公平锁线程切换少,吞吐量大,(注意,线程多就不要这样设置了)。在大量对象创建和销毁,g1堆被划分成 许多个连续的区域(region),这样的机制在内存产生碎片时,更加高效,详细请阅读g1的文章

 

server的jvm参数分析

# JVM Configuration
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g -XX:PermSize=128m -XX:MaxPermSize=320m"
JAVA_OPT="${JAVA_OPT}

-XX:+UseConcMarkSweepGC 对老年代使用并发标记扫描收集。

-XX:+UseCMSCompactAtFullCollection 对老年代使用并发回收。

-XX:CMSInitiatingOccupancyFraction=70 默认CMS是在tenured generation沾满70%(默认68%)的时候开始进行CMS收集

-XX:+CMSParallelRemarkEnabled 为了减少第二次暂停的时间,开启并行remark

-XX:SoftRefLRUPolicyMSPerMB=0

-XX:+CMSClassUnloadingEnabled 相对于并行收集器,CMS收集器默认不会对永久代进行垃圾回收。如果希望对永久代进行垃圾回收,可用设置标志-XX:+CMSClassUnloadingEnabled。

-XX:SurvivorRatio=8

-XX:+DisableExplicitGC

-XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT}  -XX:-UseLargePages"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"

 

  • 推导

nameserver的对象没有broker的对象那么活跃,因为在mq中,nameserver的作用只是作为broker的地址信息传递,不象broker有不断的消息进来,和传送。可见采用cms收集器足以,优化一下,减少stop-the-world的时间。

  • 资料来源

http://www.importnew.com/11336.html
http://blog.csdn.net/zhoutao198712/article/details/7842659

http://www.blogjava.net/killme2008/archive/2009/09/22/295931.html

http://ifeve.com/useful-jvm-flags-part-7-cms-collector/

http://www.oracle.com/technetwork/cn/articles/java/g1gc-1984535-zhs.html

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

© 著作权归作者所有

共有 人打赏支持
ihuotui
粉丝 9
博文 18
码字总数 7672
作品 0
广州
程序员
私信 提问
加载中

评论(5)

ihuotui
ihuotui

引用来自“小股儿”的评论

分析的很棒~希望多出rmq的文章~来些源码分析最爽!

@小股儿 在参考rocketmq然后写一个小mq例子
没人给撸就自己撸码
没人给撸就自己撸码
分析的很棒~希望多出rmq的文章~来些源码分析最爽!
ihuotui
ihuotui

引用来自“sunhusj”的评论

是分析哪个版本的rocketmq,我记得最近的版本用的不是+UseG1GC 回收
http://rocketmq.apache.org/release_notes/release-notes-4.0.0-incubating/
s
sunhusj
是分析哪个版本的rocketmq,我记得最近的版本用的不是+UseG1GC 回收
s
sunhusj
是分析哪个版本的rocketmq,我记得最近的版本用的不是+UseG1GC 回收
RocketMQ在windows环境下的安装与配置

1、下载RocketMQ 2、解压下载的安装包rocketmq-all-4.3.0-bin-release.zip 3、配置环境变量 变量名:ROCKETMQ_HOME 变量值:MQ解压路径 ROCKETMQ_HOME=D:devtoolsrocketmq-all-4.3.0-bin-rel...

技术小能手
10/22
0
0
rocketmq番外篇(一):开发命令行

匠心零度 转载请注明原创出处,谢谢! 说在前面 虽然是以rocketmq引出的开发命令行,但是任何java应用如果需要都可以借鉴引用,也是通用技术。 主题 rocketmq使用例子 Apache Commons CLI简介...

匠心零度
10/29
0
0
RocketMQ 在window下部署出错

在http://rocketmq.apache.org/下载Binary: rocketmq-all-4.3.0-bin-release.zip 解压后配置环境变量ROCKET_HOME 接着启动namesrv.cmd报下面的错,不懂问题是出在哪里。。。求大神指出。 PS...

ykLi
08/21
0
0
RocketMQ初探(二)之RocketMQ3.26版本搭建(含Demo测试)

  作为一名程序猿,要敢于直面各种现实,脾气要好,心态要棒,纵使Bug虐我千百遍,我待它如初恋,方法也有千万种,一条路不行,换条路走走,方向对了,只要前行,总会上了罗马的道。   A...

Hello____JAVA
07/27
0
0
说说MQ之RocketMQ(二)

原文出处:Valleylord RocketMQ 的 Java API RocketMQ 是用 Java 语言开发的,因此,其 Java API 相对是比较丰富的,当然也有部分原因是 RocketMQ 本身提供的功能就比较多。RocketMQ API 提供...

Valleylord
10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java8之stream流的基本操作

一、stream流简介 Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。 Stream的优点:声明性,可复合,可并行。这三个特性使得stream操作更简洁,更灵活,更高效。 Stre...

嘴角轻扬30
24分钟前
1
0
Docker 可视化管理工具 Panama

Panamax 是一个开源的项目,可以通过简单的拖拉操作就可以实现发布复杂的 Docker 容器应用。Panamax 为 Docker, Fleet & CoreOS 提供友好的管理界面。 容器技术是下一代的虚拟机,但使用该技...

linuxprobe16
25分钟前
2
0
scala中hdfs文件的操作

对于org.apache.hadoop.fs.Path来说, path.getName只是文件名,不包括路径 path.getParent也只是父文件的文件名,同样不包括路径 path.toString才是文件的全路径名 创建文件 hdfs.createNew...

hblt-j
40分钟前
2
0
Eureka 和 zookeeper 的比较

小小小施爷
50分钟前
0
0
c++ 开源算法库 (持续更新)

最近在做算法方面的研究,发现很难找到一个全面而优质的科学计算算法库。不过还是找到一些,在此记录一下,将来也许自己写一个把所有这些整合在一起。本列表会持续不定期更新。 GSL http://w...

propagator
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部