JVM参数设置

一、参数表示方法

1. 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容
2. 非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容
3. 非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用(但是,这些参数往往是非常有用的)

二、标准参数

其实标准参数是用过Java的人都最熟悉的,就是你在运行java命令时后面加上的参数,如java -version, java -jar 等,输入命令java -help或java -?就能获得当前机器所有java的标准参数列表

1. -client
1)设置jvm使用client模式,这是一般在pc机器上使用的模式,启动很快,但性能和内存管理效率并不高;多用于桌面应用
2. -server
1)使用server模式,启动速度虽然慢(比client模式慢10%左右),但是性能和内存管理效率很高,适用于服务器,用于生成环境、开发环境或测试环境的服务端;

2)如果没有指定-server或-client,JVM启动的时候会自动检测当前主机是否为服务器,如果是就以server模式启动,64位的JVM只有server模式,所以无法使用-client参数
3. -DpropertyName=value
1)定义系统的全局属性值,如配置文件地址等,如果value有空格,可以用-Dname=”space string”这样的形式来定义,用System.getProperty(“propertyName”)可以获得这些定义的属性值,在代码中也可以用System.setProperty(“propertyName”,”value”)的形式来定义属性
4. -verbose(这是查询GC问题最常用的命令之一,具体参数如:)
1)-verbose:class		输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断

2)-verbose:gc        输出每次GC的相关情况,后面会有更详细的介绍

3)-verbose:jni		输出native方法调用的相关情况,一般用于诊断jni调用错误信息

三、非标准参数

非标准参数,是在标准参数的基础上进行扩展的参数,输入“java -X”命令,能够获得当前JVM支持的所有非标准参数列表(你会发现,其实并不多哦)

1. -Xms
1)初始堆的大小,也是堆大小的最小值,默认值是总共的物理内存/64(且小于1G)

2)默认情况下,当堆中可用内存小于40%(这个值可以用-XX: MinHeapFreeRatio 调整,如-X:MinHeapFreeRatio=30)时,堆内存会开始增加,一直增加到-Xmx的大小
2. -Xmx
1)堆的最大值,默认值是总共的物理内存/64(且小于1G),如果Xms和Xmx都不设置,则两者大小会相同

2)默认情况下,当堆中可用内存大于70%(这个值可以用-XX: MaxHeapFreeRatio 调整,如-X:MaxHeapFreeRatio=60)时,堆内存会开始减少,一直减小到-Xms的大小		

3)整个堆的大小=年轻代大小+年老代大小,堆的大小不包含持久代大小,如果增大了年轻代,年老代相应就会减小,官方默认的配置为年老代大小/年轻代大小=2/1左右(使用-XX:NewRatio可以设置-XX:NewRatio=5,表示年老代/年轻代=5/1)

4)建议在开发测试环境可以用Xms和Xmx分别设置最小值最大值,但是在线上生产环境,Xms和Xmx设置的值必须一样,原因与年轻代一样——防止抖动
3. -Xmn
1)新生代内存大小的最大值,包括E区和两个S区的总和,使用方法如:-Xmn65535,-Xmn1024k,-Xmn512m,-Xmn1g (-Xms,-Xmx也是种写法)

2)-Xmn只能使用在JDK1.4或之后的版本中,(之前的1.3/1.4版本中,可使用-XX:NewSize设置年轻代大小,用-XX:MaxNewSize设置年轻代最大值)
4. -Xss
1)这个参数用于设置每个线程的栈内存,默认1M,一般来说是不需要改的	

2)除非代码不多,可以设置的小点,另外一个相似的参数是-XX:ThreadStackSize,这两个参数在1.6以前,都是谁设置在后面,谁就生效;1.6版本以后,-Xss设置在后面,则以-Xss为准,-XXThreadStackSize设置在后面,则主线程以-Xss为准,其它线程以-XX:ThreadStackSize为准
5. -Xprof
1)跟踪正运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试
6. -Xnoclassgc
1)	关闭针对class的gc功能;因为其阻止内存回收,所以可能会导致OutOfMemoryError错误,慎用
7. -Xincgc
1)开启增量gc(默认为关闭);这有助于减少长时间GC时应用程序出现的停顿;但由于可能和应用程序并发执行,所以会降低CPU对应用的处理能力
8. -Xloggc:file
1)与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。

2)若与verbose命令同时出现在命令行中,则以-Xloggc为准	

四、非Stable参数(非静态参数)

以-XX表示的非Stable参数,虽然在官方文档中是不确定的,不健壮的,各个公司的实现也各有不同,但往往非常实用,所以这部分参数对于GC非常重要

1. 分类
1)性能参数( Performance Options):用于JVM的性能调优和内存分配控制,如初始化内存大小的设置;

2)行为参数(Behavioral Options):用于改变JVM的基础行为,如GC的方式和算法的选择;

3)调试参数(Debugging Options):用于监控、打印、输出等jvm参数,用于显示jvm更加详细的信息;
2. 使用方法
1)-XX:+<option> 启用选项

2)-XX:-<option> 不启用选项

3)-XX:<option>=<number> 给选项设置一个数字类型值,可跟单位,例如 32k, 1024m, 2g

4)-XX:<option>=<string> 给选项设置一个字符串值,例如-XX:HeapDumpPath=./dump.core
3. 常用性能参数(性能参数往往用来定义内存分配的大小和比例,相比于行为参数和调试参数,一个比较明显的区别是性能参数后面往往跟的有数值)
1)-XX:NewSize=2.125m 						新生代对象生成时占用内存的默认值

2)-XX:MaxNewSize=size                      新生成对象能占用内存的最大值

3)-XX:PermSize=64m                         方法区分配的初始内存

4)-XX:MaxPermSize=64m 						方法区所能占用的最大内存(非堆内存)

5)-XX:MaxTenuringThreshold=15              对象在新生代存活区切换的次数(坚持过MinorGC的次数,每坚持过一次,该值就增加1),大于该值会进入老年代

6)-XX:NewRatio=n                          设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4,默认为2

7)-XX:SurvivorRatio=n                     年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5,默认为8
   
8)XX:MaxHeapFreeRatio=70                   GC后java堆中空闲量占的最大比例,大于该值,则堆内存会减少

9)-XX:MinHeapFreeRatio=40                  GC后java堆中空闲量占的最小比例,小于该值,则堆内存会增加

10)-XX:ThreadStackSize=512                 设置线程栈大小,若为0则使用系统默认值

11)-XX:PretenureSizeThreshold= size        大于该值的对象直接晋升入老年代(这种对象少用为好)
4. 常用的行为参数(主要用来选择使用什么样的垃圾收集器组合,以及控制运行过程中的GC策略等)
1)-XX:-UseSerialGC                     	启用串行GC,即采用Serial+Serial Old模式

2)-XX:-UseParallelGC                       启用并行GC,即采用Parallel Scavenge+Serial Old收集器组合(-Server模式下的默认组合)

3)-XX:GCTimeRatio=99                       设置用户执行时间占总时间的比例(默认值99,即1%的时间用于GC)

4)-XX:MaxGCPauseMillis=time                设置GC的最大停顿时间(这个参数只对Parallel Scavenge有效)

5)-XX:+UseParNewGC                         使用ParNew+Serial Old收集器组合

6)-XX:ParallelGCThreads                    设置执行内存回收的线程数,在+UseParNewGC的情况下使用

7)-XX:+UseParallelOldGC                    使用Parallel Scavenge +Parallel Old组合收集器

8)-XX:+UseConcMarkSweepGC	                使用ParNew+CMS+Serial Old组合并发收集,优先使用ParNew+CMS,当用户线程内存不足时,采用备用方案Serial Old收集

9)-XX:-DisableExplicitGC                   禁止调用System.gc();但jvm的gc仍然有效

10)-XX:+ScavengeBeforeFullGC               新生代GC优先于Full GC执行
5. 常用的调试参数(主要用于监控和打印GC的信息)
1)-XX:-CITime								打印消耗在JIT编译的时间

2)-XX:ErrorFile=./hs_err_pid<pid>.log      保存错误日志或者数据到文件中

3)-XX:HeapDumpPath=./java_pid<pid>.hprof	指定导出堆信息时的路径或文件名

4)-XX:-HeapDumpOnOutOfMemoryError          当首次遭遇OOM时导出此时堆中相关信息

5)-XX:-PrintCommandLineFlags	            打印在命令行中出现过的标记

6)-XX:+PrintCompilation                    当一个方法被编译时打印相关信息

7)-XX:+PrintGC                             每次GC时打印相关信息

8)-XX:+PrintGC Details                     每次GC时打印详细信息

9)-XX:+PrintGCTimeStamps                   打印每次GC的时间戳

10)-XX:+TraceClassLoading                  跟踪类的加载信息

11)-XX:+TraceClassLoadingPreorder          跟踪被引用到的所有类的加载信息

12)XX:+TraceClassResolution                跟踪常量池

13)-XX:+TraceClassUnloading                跟踪类的卸载信息

14)-XX:+TraceLoaderConstraints             跟踪类加载器约束的相关信息

15)-XX:+PrintHeapAtGC                      在进行GC的前后打印出堆的信息

五、监控工具和方法

1. 通过监控GC,我们可以搞清楚很多问题
1)minor GC和full GC的频率;

2)执行一次GC所消耗的时间;

3)新生代的对象何时被移到老生代以及花费了多少时间

4)每次GC中,其它线程暂停(Stop the world)的时间

5)每次GC的效果如何,是否不理想
2. 命令行工具(原生)
1)jps (用于查询正在运行的JVM进程, 命令格式:jps [option] [hostid] )
(1) -q                       只输出LVMID,省略主类的名称

(2) -m                       输出虚拟机进程启动时传给主类main()函数的参数

(3) -l                       输出主类的全类名,如果进程执行的是Jar包,输出Jar路径

(4) -v                       输出虚拟机进程启动时JVM参数
2)jstat(jstat可以实时显示本地或远程JVM进程中类装载、内存、垃圾收集、JIT编译等数据(如果要显示远程JVM信息,需要远程主机开启RMI支持))
(1) -class                   监视类装载、卸载数量、总空间及类装载所耗费的时间

(2) -gc	                     监听Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量,以用空间、GC时间合计等信息

(3) -gccapacity              监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大和最小空间

(4) -gcutil                  监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比

(5) -gccause                 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因

(6) -compiler                输出JIT编译器编译过的方法、耗时等信息

示例: jstat -gc 3463
3)jinfo(用于查询当前运行这的JVM属性和参数的值)
(1)-flag                 	  显示未被显示指定的参数的系统默认值

(2)-flag [+|-]name          或-flag name=value: 修改部分参数

(3)-sysprops                打印虚拟机进程的System.getProperties()

示例:jinfo -sysprops 3463
4)jmap(用于显示当前Java堆和永久代的详细信息(如当前使用的收集器,当前的空间使用率等))
(1)-dump                    生成java堆转储快照

(2)-heap                    显示java堆详细信息(只在Linux/Solaris下有效)

(3)-F                       当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照(只在Linux/Solaris下有效)

(4)-histo                   显示堆中对象统计信息

(5)-permstat                以ClassLoader为统计口径显示永久代内存状态(只在Linux/Solaris下有效)

示例:jmap -dump 3463
5)jhat(用于分析使用jmap生成的dump文件,是JDK自带的工具)
(1)使用方法为: jhat -J -Xmx512m [file],不过jhat没有mat好用,推荐使用mat(Eclipse插件: http://www.eclipse.org/mat ),mat速度更快,而且是图形界面
6)jstack(用于生成当前JVM的所有线程快照,线程快照是虚拟机每一条线程正在执行的方法,目的是定位线程出现长时间停顿的原因)
(1)-F 					   当正常输出的请求不被响应时,强制输出线程堆栈

(2)-l                        除堆栈外,显示关于锁的附加信息

(3)-m                        如果调用到本地方法的话,可以显示C/C++的堆栈
3. 可视化工具
1)Jconsole						   JDK自带的图形化性能监控工具

2)Visual VM                       是一个功能强大的多合一故障和性能监控工具,支持OQL 

3)MAT                             这是eclipse的一个插件,是一个Java堆内存分析器,可以用于查找内存泄露以及查看内存消耗情况。支持OQL

4)NetBeans Profiler               这个性能分析器包含了诸如CPU、内存和线程性能分析功能,并且提供了一些用于基本JVM监控的附加工具和功能。对于需要解决内存和性能相关问题的开发者非常有用

5)jmeter                          测试工具,模拟并发

参考网址

JVM监控与调优

Java性能优化的9大工具

注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值