JVM参数

GC相关

-XX:+PrintGC或者-verbose:gc

打印GC日志,包括堆内存总大小的变化、GC使用的时间。

(JDK9、JDK10中建议使用-Xlog:gc)

-XX:+PrintGCDetails

打印更详细的GC日志,包括新生代(DefNew)、老年代(Tenured)、永久代(Perm)、用户态CPU耗时(user)、系统CPU耗时(sys)和GC实际经历时间(real)等

(JDK9、JDK10建议使用-Xlog:gc*)

-XX:+PrintGCTimeStamps

打印GC的时间,该时间是虚拟机启动后的时间偏移量

(JDK9、JDK10使用-Xlog:gc*已经默认打印出时间)

-XX:+PrintHeapAtGC在GC前和GC后输出详细的堆信息
-XX:+PrintGCApplicationConcurrentTime打印应用程序的执行时间
-XX:+PrintGCApplicationStoppedTime打印应用程序由于GC而产生的停顿时间
-XX:+PrintReferenceGC

追踪系统内的软引用、弱引用、虚引用和Finally队列

(考虑到兼容性,从JDK9开始已经删除此参数)

-Xloggc:log/gc.log

GC日志输出到启动路径的log/log.gc文件中,注意,父目录必须是已经存在的目录

(JDK9和JDK10中建议使用-Xlog:gc:log/gc.log)

类追踪与卸载

-XX:+TraceClassLoading

追踪类的加载,包括类从哪个文件加载

(JDK9、JDK10中建议使用-Xlog:class+load=info)

-XX:+TraceClassUnloading

追踪类的卸载

(JDK9、JDK10中建议使用-Xlog:class+unload=info)

-verbose:class跟踪类的加载和卸载
-XX:+PrintClassHistogram在Java控制台中按下Ctrl+Break组合键,控制台上显示当前类的信息柱状图,包括系统中类的分布情况
-XX:+PrintVMOptions

打印虚拟机接收到的命令行显式参数

-XX:+PrintCommandLineFlags打印虚拟机接收到的显式和隐式参数,隐式参数未必是通过命令行直接给出的,它可能是虚拟机启动时自行设置的。
-XX:+PrintFlagsFinal打印所有的系统参数的值

堆内存

-Xms512m

指定初始堆空间大小为512m
-Xmx1024m指定最大堆空间大小为1024m
-Xmn150m指定新生代空间大小为150m。设置一个较大的新生代会减少老年代的大小,这个参数对系统性能及GC行为影响很大。新生代大小一般设置为整个堆空间的1/3到1/4。默认是整个堆空间的1/4。
-XX:SurvivorRatio=8设置新生代中eden区和from/to区的比例8:1。新生代分为eden区和from/to区,eden和from/to的默认比例是8:1
-XX:NewRatio=3

设置老年代和新生代的比例为3:1。老年代与新生代的默认比例是3:1

 

-XX:+HeapDumpOnOutOfMemoryError堆内存溢出时导出整个堆的信息,配合-XX:HeapDumpPath来指定导出堆的存放路径
-XX:HeapDumpPath=heap.bin堆内存溢出时导出堆的存放路径为启动目录的heap.bin文件中。要配合-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=/root/printstack.sh

堆内存溢出时执行/root/printstack.sh脚本。

-Xms5m -Xmx20m "-XX:OnOutOfMemoryError=D:/jdk1.7_40/bin/printstack.bat %p" -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.bin

可通过以下代码获取堆内存信息:

long maxMemory = Runtime.getRuntime().maxMemory(); // 最大堆内存,与-Xmx设置的值差不多
long freeMemory = Runtime.getRuntime().freeMemory(); // 空闲堆内存 -Xms
long totalMemory = Runtime.getRuntime().totalMemory(); // 当前总内存

注意,maxMemory会比-Xmx设置的值略小一些,这是因为分配给堆的内存空间和实际可用内存并非一个概念。由于垃圾回收的需要,虚拟机对堆空间进行分区管理,不同的区采用不同的回收算法,一些算法会使用空间换时间的策略,因此会存在可用内存的损失。最终的结果就是实际可用内存会浪费的大小等于from/to的空间。因此,实际最大可用内存为-Xmx的值减去from的值。

方法区(永久区、永久代)

-XX:PermSize=256m

设置永久区的初始大小为256m

(JDK1.8开始,永久区被彻底移除)

-XX:MaxPermSize=512m

设置永久区的最大值为512m

(JDK1.8开始,永久区被彻底移除)

-XX:MetaspaceSize=256m

设置元数据区的大小为256m

(JDK1.8开始,元数据区替换永久区)

-XX:MaxMetaspaceSize=512m

设置元数据区的最大值为512m。默认情况下只受系统可用内存的限制

(JDK1.8开始,元数据区替换永久区)

-Xss128k指定线程的栈大小为128k

直接内存

-XX:MaxDirectMemorySize=512m

指定最大的直接内存的大小为512m。默认为最大堆空间的大小,即-Xmx的值。

当直接内存使用量达到最大值时,就会触发GC,如果GC不能有效地释放足够的空间,直接内存溢出依然会引起系统的OOM

使用-server参数优化后,直接内存的访问速度比堆内存的读写速度提升了将近一个数量级。但在申请内存空间时,堆空间的申请速度远快于直接内存的申请速度。

虚拟机的工作模式

-client指定虚拟机使用Client运行模式
-server指定虚拟机使用Server运行模式

默认情况下,虚拟机会根据当前计算机系统环境自动选择运行模式,使用-version参数可以查看当前模式

Client模式(Client VM):

[root@izwz9d2a0eoi8bhclssv1vz ~]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Client VM (build 25.181-b13, mixed mode)

Server模式(Server VM):

[root@ssv1vz ~]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

与Client模式相比,Server模式的启动比较慢,因为Server模式会尝试收集更多的系统性能信息,使用更复杂的优化算法对程序进行优化。因此,系统完全启动并进入稳定期后,Server模式的执行速度会远快于Client模式

对于用户界面程序,运行时间不长,又追求启动速度,Client模式也是不错的选择。

另外,Server模式和Client模式下的各种参数可能会有很大的不同,可通过-XX:+PrintFlagsFinal参数对比。

垃圾回收器

-XX:+UseSerialGC

新生代和老年代都使用串行回收器。

-XX:+UseParNewGC

新生代使用ParNew回收器,老年代使用串行回收器。

(JDK9、JDK10已经删除,因为ParNew需要和CMS搭配工作,而CMS已经被G1替代,不在支持此参数)

-XX:ParallelGCThreads=4指定在使用多线程的回收器(ParNewGC、ParallelGC等)时的GC线程数为4。一般情况下,最好与CPU数量相当,避免过多的线程数影响垃圾回收性能。默认情况下,当CPU数量小于8时,ParallelGCThreads的值等于CPU数量;当CPU数量大于8时,ParallelGCThreads的值等于3+((5×CPU_Count)/8)。
-XX:+UseConcMarkSweepGC

新生代使用ParNew回收器,老年代使用CMS。

(JDK9、JDK10不建议使用,建议使用默认的G1垃圾回收器)

-XX:+UseParallelGC新生代使用ParallelGC回收器,老年代使用串行回收器。
-XX:+UseParallelOldGC新生代使用ParallelGC回收器,老年代使用ParallelOldGC回收器。
-XX:MaxGCPauseMills=100ParallelGC回收器参数。设置最大垃圾回收停顿时间为100毫秒。它的值是大于0的整数
-XX:GCTimeRatio=19ParallelGC回收器参数。设置吞吐量大小为19。它的值是一个0~100之间的整数。假设GCTimeRatio的值为n,那么系统将花费不超过1/(1+n)的时间进行垃圾回收。比如GCTimeRatio等于19(默认值),则系统用于垃圾回收的时间不超过1/(1+19)=5%
-XX:+UseAdaptiveSizePolicyParallelGC回收器参数。打开自适应GC策略。仅指定虚拟机的最大堆、目标吞吐量(GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机自己完成调优工作。

串行回收器:可以在新生代老年代中使用,分为新生代串行回收器和老年代串行回收器。当虚拟机在Client模式下运行时,串行回收器是默认的垃圾回收器。特点是单线程独占的。新生代串行回收器使用复制算法,老年代串行回收器使用标记压缩算法。在单CPU处理器等硬件平台不是特别优越的情况下,它的性能表现可以超过并行回收器和并发回收器。

ParNew回收器:ParNew回收器是一个工作在新生代的垃圾回收器,只是简单地将串行回收器多线程,它的收回策略、算法及参数和新生代串行回收器一样,也是独占式的。在并发能力比较强的CPU上,它产生的停顿时间要短于串行回收器。

ParallelGC回收器:与ParNew回收器一样,都是多线程独占式的回收器。此外,它非常关注系统的吞吐量,还支持自适应的GC调解策略。。。。。。。。。。。。。。。。。。。。

 

 

 

 

 

 

 

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值