文档章节

rocketmq中的jvm配置分析

ihuotui
 ihuotui
发布于 2017/04/07 09:12
字数 2268
阅读 658
收藏 9
点赞 0
评论 5
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
粉丝 8
博文 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番外篇(一):开发命令行

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

匠心零度
04/17
0
0
RocketMQ与Kafka对比

RocketMQ与Kafka对比(18项差异) 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步...

莫问viva
2015/05/08
0
0
Druid配置Filter(非spring下)

🙂🙂🙂关注微信公众号:【芋艿的后端小屋】有福利: 1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 3. 您...

芋道源码
2013/07/11
0
0
RocketMQ在windows上安装和开发使用

概述 RocketMQ是alibaba公司开源的一个纯java的开源消息中间件。 开发测试环境搭建 1. 安装&启动 进入到RocketMQ下载包解压的路径下 D:machineRocketMQ-3.0.8RocketMQ-3.0.8> 接下来安装 执行...

偶尔诗文
2015/08/25
0
2
RocketMQ 消息队列简单部署

RocketMQ 是alibaba开源的消息队列。 本文使用的是开源版本v3.18 系统: centos6.x最小化安装 需要用到的软件包: jdk-7u67-linux-x64.tar.gz alibaba-rocketmq-3.1.8.tar.gz 开始安装 #tar x...

Firxiao
2014/09/17
0
5
CentOS7.3安装rocketmq

安装环境 安装 编译克隆 构建速度较慢 最好自己搭建一个nexus, 感兴趣的参考博客 配置jvm内存 配置启动mqnamesrv 配置启动broker 关闭服务器 配置windows控制台github rocketmq-console 文件...

paascloud
2017/09/04
0
0
消息中间件—RocketMQ的RPC通信(二)

文章摘要:如何设计RPC通信层模型是任何一款性能强劲的MQ所要重点考虑的问题 在(一)篇中主要介绍了RocketMQ的协议格式,消息编解码,通信方式(同步/异步/单向)、消息发送/接收以及异步回调...

癫狂侠
07/01
0
0
编译OpenJDK时碰到的问题

🙂🙂🙂关注微信公众号:【芋艿的后端小屋】有福利: 1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 3. 您...

芋道源码
2013/07/11
0
0
linux下RocketMQ的安装

下载和构建 从 https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.2.0/rocketmq-all-4.2.0-source-release.zip 下载 4.2.0 的源码版本,执行以下命令来解压4.2.0源码版本并构建二进制文...

yushiwh
05/21
0
0
整理出一些使用比较广或者个人觉得比较好的java开源项目和资料供参考

1.整理出一些使用比较广或者个人觉得比较好的java开源项目和资料供参考。 2. 如果你觉得好但是我没有列出的开源项目请告诉我,方便我添加到列表里。 3. 如果你发现信息描述有误请联系我,我会及...

写代码的奥特曼
2017/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部