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,如何配置 ...
随机推荐
- luogu P4365 [九省联考2018]秘密袭击coat
luogu 这里不妨考虑每个点的贡献,即求出每个点在多少个联通块中为第\(k\)大的(这里权值相同的可以按任意顺序排大小),然后答案为所有点权值\(*\)上面求的东西之和 把比这个点大的点看成\(1\ ...
- webpack的基本使用
安装webpack npm i webpack -g npm i webpack-cli -g 1.基础用法(无需配置webpack.config.js文件) 1.2 新建需要打包的测试文件input ...
- celery 分布式异步队列框架使用方法
简介: Celery 是一个python开发的异步分布式任务调度模块,是一个消息传输的中间件,可以理解为一个邮箱,每当应用程序调用celery的异步任务时,会向broker传递消息,然后celery ...
- 第96:SVM简介与简单应用
详细推到见:https://blog.csdn.net/v_july_v/article/details/7624837 python实现方式:
- 设置Linux之CentOS7的网络的两种方式动态IP+静态IP
1 动态IP 参考之前的文章 点击进入 2 静态IP vi /etc/sysconfig/network-scripts/ifcfg-ens33 详情配置如下,上面半部分是我之前的动态IP的设置 静态 ...
- 使用sproxy.exe访问基于soap的webservice
使用vc访问基于soap的webservice有多种方法,其中有一种是使用atlsoap,关于这个可以搜索sproxy.exe文章,不在这介绍(主要是我的写作能力太差).我写这个日记主要是项记录访问w ...
- linux下redis 安装
--获取redis [redis@localhost ~]$ wget http://download.redis.io/releases/redis-2.8.7.tar.gz --2017-05-2 ...
- html中表单提交
表单提交代码 1.源代码分析 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- centos7 nginx 代理
2019/06/05 15:00:23 [crit] 4332#4332: *1 connect() to 127.0.0.1:8080 failed (13: Permission denied) ...
- [洛谷P4072] SDOI2016 征途
问题描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...