JAVA_OPT理解及调优理论
以RocketMQ的namesrv和broker启动为例,理解CMS和G1垃圾收集器下的jdk参数
CMS垃圾收集器
以RocketMQ中runserver.cmd为例,这是启动NameSrv的命令行文件
set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
set "JAVA_OPT=%JAVA_OPT% -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
set "JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:"%USERPROFILE%\rmq_srv_gc.log" -XX:+PrintGCDetails"
set "JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow"
set "JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages"
set "JAVA_OPT=%JAVA_OPT% -Djava.ext.dirs=%BASE_DIR%lib"
set "JAVA_OPT=%JAVA_OPT% -cp "%CLASSPATH%""
"%JAVA%" %JAVA_OPT% %*
-server
-sever:在多个CPU时可优化性能
-Xms和-Xmx设置为 FullGC之后的老年代内存占用的3-4倍
-Xms:初始heap大小,使用的最小内存,CPU性能高时此值应设大一些;一般和Xmx一样,避免每次gc后JVM重新分配内存
-Xmx:heap的最大值
-Xmn:为年轻代配置一个大堆(可以并行收集),再次利用大内存系统。它有助于防止短期对象过早地被提升到旧一代,垃圾收集更加昂贵。
-XX:MetaspaceSize -XX:MaxMetaspaceSize
前言:Metaspace即元数据空间,1.8之后用来替代Perm永久代的。perm是用来存储klass(class文件在jvm里的运行时数据)等信息的;jvm在启动时会根据配置的-XX:MaxPermSize及-XX:PermSize来分配一块连续的内存块,但随之动态类加载增加,这块内存如果小了就会出现内存溢出,多了又会浪费内存。所以出现了元数据区Metaspace希望能解决内存管理的问题。
Metaspace由Klass Metaspace和NoKlass Metaspace组成。这两块均是由类加载共享的。当类加载时,其类加载器拥有的SpaceManager管理属于自己内存空间,这样很容易将Klass Metaspace使用完,即出现OOM,不过一般情况下不会,NoKlass Mestaspace是由一块块内存慢慢组合起来的,在没有达到限制条件的情况下,会不断加长这条链,让它可以持续工作。
MetaspaceSize:用于控制metaspaceGC发生的初始阈值,默认是20.8M左右
MaxMetaspaceSize:默认基本是无限大,但如果不设置metaspace是会被无限使用的,如果设置了数值,与MaxPermSize不同,在jvm启动时,不会创建很大的Metaspace,但Permspace会。
-XX:+UseConcMarkSweepGC
使用CMS收集器,通过多线程并发进行垃圾回收,尽量减少垃圾回收带来的停顿。
-XX:+UseCMSCompactAtFullCollection
CMS收集器的一个开关,默认为true;用于在Full GC(不是CMS并发GC)之后增加一个碎片的管理过程;因为CMS是基于“标记-清除”算法实现的收集器,这种算法会导致大量的碎片,如果遇到给大对象分配内存空间时,可能会出现找不到连续的空间来分配而不得不提前触发Full GC
-XX:CMSInitiatingOccupancyFraction=70
指设定CMS在对内存占用率达到70%时开始GC,默认是68%,因为CMS的垃圾算法会产生碎片所以一般提早GC
-XX:+CMSParallelRemarkEnabled
开启并行标记,减少停顿的时间
-XX:+CMSClassUnloadingEnabled
只有在使用CMS垃圾收集器的情况下,表示在使用CMS垃圾回收时是否启动类卸载功能,默认不启用,如果启用,垃圾回收就会清除持久代,移除不再使用的class
-XX:SoftRefLRUPolicyMSPerMB
因为soft reference软引用对象只有在垃圾回收的时候才被清除,但垃圾回收不总是执行。所以设置对象存货的毫秒数,这里为0即不被引用就清除
-XX:SurvivorRatio=8
表示新生代的eden区:from区:to区= 8:1:1
-XX:-UseParNewGC
关闭年轻代的并行GC,因为当前使用-XX:+UseConcMarkSweepGC,所以-XX:UseParNewGC默认是开启的。
-verbose:gc
用于垃圾收集时的信息打印,和-XX:+PrintGC功能相同
-XX:-OmitStackTraceInFastThrow
关闭JVM优化抛出堆栈异常:对于一些频繁抛出的异常,jdk会为了性能而做出优化,jit重编译后会抛出没有堆栈的异常;在-sever模式下,该优化是默认开启的。也就是说JIT重新编译前,log中是能看见旧有堆栈的异常。
-XX:-UseLargePages
不使用内存分页;因为现代CPU是通过寻址来访问内存的。现引入了MMU(内存管理单元)用来解决比如32位的CPU的物理内存为4G,一般可用小于4G,当程序需要使用4G内存时,程序不得不降低内存占用。
而内存分页就是在MMU基础上提出的一种内存管理机制。它将虚拟地址和物理地址按照固定的大小分割成页和页帧,并保证页与页帧大小相同,这种机制保证访问内存的高效性,并使系统支持使用非连续的内存空间。这时候物理地址与虚拟地址需要同过映射来寻址,而映射关系存储在页表中,而页表存在于内存中。因为CPU通过总线访问存在于内存中页表效率仍旧不高,所以引入TLB页表缓冲寄存器,用来缓冲部分经常访问的页表内容。而我们设置的内存分页就是页表缓冲寄存器是否能支持大内存分页。如果启用,则通过设置-XX:LargePageSizeInBytes=10m设置大小
G1垃圾收集器
以RocketMQ中runbroker.cmd为例,这是启动Broker的命令行文件
set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g"
set "JAVA_OPT=%JAVA_OPT% -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"
set "JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:%USERPROFILE%\mq_gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
set "JAVA_OPT=%JAVA_OPT% -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
set "JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow"
set "JAVA_OPT=%JAVA_OPT% -XX:+AlwaysPreTouch"
set "JAVA_OPT=%JAVA_OPT% -XX:MaxDirectMemorySize=15g"
set "JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages -XX:-UseBiasedLocking"
set "JAVA_OPT=%JAVA_OPT% -Djava.ext.dirs=%BASE_DIR%lib"
set "JAVA_OPT=%JAVA_OPT% -cp %CLASSPATH%"
-XX:+UseG1GC
G1垃圾收集器,jdk1.7后出现,为了代替CMS收集器。G1收集器是一个并行的,并发的,增量式压缩停顿短暂的垃圾收集器。G1与其他收集器不一样,不区分年轻代和老年代空间。被用于多处理器和大容量内存的环境,且整理空闲空间更快。
相比较于CMS收集器,G1垃圾收集的同时整理内存,不会产生很多内存碎片。G1的停顿时间可预测,用户可以在指定期望时间停顿。
-Xmn
设置年轻代大小会干预G1,无法根据需要增大或缩小年轻代的大小。
-XX:G1HeapRegionSize=16m
Region大小。其他GC将连续的内存空间划分为新生代,老年代和永久代(元空间),但G1根据其垃圾收集机制会将每一代用多个不连续相同大小的区域称为region存储,除了为三代划分空间,G1还新提供存储巨大对象的功能-H-objs,为减少H-objs分配对GC的影响,需要把大对象变为普通对象建议增大Region size。G1HeapRegionSize的取值范围2^0--2^6M,如果不设定G1将根据heap大小自动决定。
-XX:G1ReservePercent=25
增大堆内存大小,默认是10,因为JVM在回收存活或晋升对象的时候,栈区溢出就会发生失败,因为堆的使用已经到达极限。
-XX:MaxGCPauseMillis=200
设置目标最大暂停时间,JVM会尽可能完成它,但不一定实现;如果设置了-Xmn说明禁用目标暂停时间
-XX:InitiatingHeapOccupancyPercent=30
整个堆栈使用达到百分之30的时候,启动GC周期,0表示一直GC
-XX:+PrintGCDetails
堆栈溢出异常,可以用于打印to-space overflow日志
-XX:+UseGCLogFileRotation
打开GC日志滚动记录功能,默认为0(即不限制)
-XX:NumberOfGCLogFiles=5
日志文件数量
-XX:GCLogFileSize=30m
日志文件大小
-XX:+AlwaysPreTouch
在调用main函数之前,使用所有可用的内存分页,这个选项可用于测试长时间运行的系统
-XX:-UseBiasedLocking
JVM默认启用偏向锁,但竞争激烈时,偏向锁会增加系统负担(锁会偏向当前已经占用锁的线程)
JAVA_OPT理解及调优理论的更多相关文章
- Jvm调优理论篇
Jvm实战调优 OOM(Out Of Memory) 内存溢出错误 ps:由于Java虚拟机有许多实现,本文主要阐述的是OpenJDK的HotSpot虚拟机,JDK版本是8. 一.首先要明白造成OOM ...
- 16-MySQL DBA笔记-调优基础理论和工具
第五部分 性能调优与架构篇 本篇将为读者介绍性能调优的一些背景知识和理论,然后介绍一些工具的运用,最后介绍从应用程序到操作系统.到数据库.到存储各个环节的优化. 性能调优是一个高度专业的领域,它需要一 ...
- JVM调优参数、方法、工具以及案例总结
这种文章挺难写的,一是JVM参数巨多,二是内容枯燥乏味,但是想理解JVM调优又是没法避开的环节,本文主要用来总结梳理便于以后翻阅,主要围绕四个大的方面展开,分别是JVM调优参数.JVM调优方法(流程) ...
- JVM | 第1部分:自动内存管理与性能调优《深入理解 Java 虚拟机》
目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃 ...
- 性能调优:理解Set Statistics IO输出
性能调优是DBA的重要工作之一.很多人会带着各种性能上的问题来问我们.我们需要通过SQL Server知识来处理这些问题.经常被问到的一个问题是:早上这个存储过程运行时间还是可以的,但到了晚上就很慢很 ...
- 性能调优:理解Set Statistics Time输出
在性能调优:理解Set Statistics IO输出我们讨论了Set Statistics IO,还有如何帮助我们进行性能调优.这篇文章会讨论下Set Statistics Time,它会告诉我们执 ...
- mysql监控、性能调优及三范式理解
原文:mysql监控.性能调优及三范式理解 1监控 工具:sp on mysql sp系列可监控各种数据库 2调优 2.1 DB层操作与调优 2.1.1.开启慢查询 在My.cnf文件中添加如 ...
- 2-2-sshd服务安装管理及配置文件理解和安全调优
大纲: 1. 培养独自解决问题的能力 2. 学习第二阶段Linux服务管理的方法 3. 安装sshd服务 4. sshd服务的使用 5. sshd服务调优 6. 初步介绍sshd配置文件 ###### ...
- 深入理解java:1.3.2 JVM监控与调优
学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之. 本篇,来看看[ 如何监控和优化GC机制.] 通过学习,我觉得JVM监控与调优,主要在3个着眼点上: 1,如何配置 ...
随机推荐
- Java并发理论简介
这些文字来自于Java程序员修炼之道,记录一下 一. java线程模型 Java线程模型建立在两个基本概念之上 共享的,默认可见的可变状态 抢占式线程调度 我们从侧面思考一下这两个概念 所有线程可以很 ...
- sql server if else
DECLARE IF (@sex = '1')BEGIN PRINT '2'END ELSE BEGIN PRINT(1) END begin... end可以省略 declare @sex int ...
- @RequestMapping-限定请求方法的映射
限定请求方法的映射 测试: 如果非指定的请求方法访问时会出现405状态:
- pl/sql 笔记之基础(上)
由于公司中使用 oracle,而本人对存储过程一直也懵懵懂懂,故一周时间学习了一遍 pl/sql,在此记下笔记!!! 一.前提,pl/sql 是啥? 1.PL/SQL是一种高级数据库程序设计语言,该语 ...
- python多线程之_thread
多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进 ...
- LVM使用手册简化命令
创建 hot_add --查看新增的lun pvcreate /dev/sdb --创建物理卷 pvcreate /dev/sdc --创建物理卷 pvcreate /dev/sdd ...
- python-迭代器与生成器2
python-迭代器与生成器2 def fib(max): n,a,b=0,0,1 while n<max: #print(b) yield b a,b=b,a+b #t=(b,a+b) 是一个 ...
- 关于cli打包至服务器出现的BUG(样式错乱,路径出错)解决方案
很久没来博客园了,今天给大家带来两个硬货bug,前端大牛可能不觉得是啥,但是对于没碰到过这问题的小菜鸟我来说还是很不错的 1.npm run build 至服务端的时候出现路径报错解决方案 ①.本地测 ...
- poi导出excel数据量过大
问题:使用poi导出excel,数据量过大导致内存溢出 解决思路:1.多sheet导出 2.生成多个excel打包下载 3.生成csv下载 本文使用的是第二个思路,代码如下: poiUtil工具类 p ...
- 对比MySQL,你究竟在什么时候更需要MongoDB(转载)
你期望一个更高的写负载 万美元的交易. 不可靠环境保证高可用性 设置副本集(主-从服务器设置)不仅方便而且很快,此外,使用MongoDB还可以快速.安全及自动化的实现节点(或数据中心)故障转移. 未来 ...