JVM常用参数简介

栈设置

	-Xss1M	设置每个线程可使用的内存大小,即栈的大小
		如果把-Xss或者-XX:ThreadStackSize设为0,就是使用“系统默认值”。而在Linux x64上HotSpot VM给Java栈定义的“系统默认”大小也是1MB

堆设置

    -Xms200M		初始堆内存,默认物理内存1/64,也是最小分配堆内存。
    -Xmx200M		最大堆内存分配,默认为物理内存的1/4。
	    当空余堆内存小于40%时,会增加到-Xms的最大限制;当空余堆内存大于70%时,会减小到-Xms的最小限制。-Xms可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存
    -Xmn50M			新生代大小(eden+ 2 survivor space);老生代的大小:-Xmx减去-Xmn
    -XX:NewRatio=2			设置新生代和老年代的比值。如:为2,表示年轻代与老年代比值为12,Sun官方建议年轻代的大小为整个堆的3/8左右
    -XX:SurvivorRatio=8		用于设置Eden和其中一个Survivor的比值,默认比例为8(Eden):1(一个survivor)  
    -XX:MaxTenuringThreshold=15		设置survivor区垃圾最大年龄,从时间维度处理幸存区对象。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。
    -XX:TargetSurvivorRatio=50		设定survivor区的目标使用率,从空间维度处理幸存区对象。默认50,即survivor区对象目标使用率为50%-XX:PretenureSizeThreshold=0	设定Eden区大对象直接进入老年代阈值,单位字节。默认值是0,意思是不管多大都是先在eden中分配内存。该参数只对 Serial和 Pardew两收集器有效, ParallelScavenge收集器不认识这个数。
    -XX:PermSize、-XX:MaxPermSize				分别设置永久代最小大小与最大大小(Java8以前)
    -XX:MetaspaceSize、-XX:MaxMetaspaceSize		分别设置元空间最小大小与最大大小(Java8以后)

收集器设置

    -XX:+UseSerialGC			设置串行收集器
    -XX:+UseParallelGC			设置并行收集器
    -XX:+UseParalledlOldGC		设置并行老年代收集器
    -XX:+UseConcMarkSweepGC		设置并发收集器

并行收集器设置

    -XX:ParallelGCThreads=n		设置并行收集器收集时使用的CPU数。并行收集线程数。
    -XX:MaxGCPauseMillis=n		设置并行收集最大暂停时间
    -XX:GCTimeRatio=n			设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

并发收集器设置

-XX:+CMSIncrementalMode			设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n			设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数
Metaspace配置
-XX:MetaspaceSize=N
	这个参数是初始化的Metaspace大小,该值越大触发Metaspace GC的时机就越晚。随着GC的到来,虚拟机会根据实际情况调控Metaspace的大小,可能增加上线也可能降低。在默认情况下,这个值大小根据不同的平台在12M到20M浮动。
	
-XX:MaxMetaspaceSize=N
	这个参数用于限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。在本机上该参数的默认值为4294967295B(大约4096MB)。
	
-XX:MinMetaspaceFreeRatio=N
	当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数,那么虚拟机将增长Metaspace的大小。在本机该参数的默认值为40,也就是40%。设置该参数可以控制Metaspace的增长的速度,太小的值会导致Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。而太大的值会导致Metaspace增长的过快,浪费内存。
	
-XX:MaxMetasaceFreeRatio=N
	当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。在本机该参数的默认值为70,也就是70%-XX:MaxMetaspaceExpansion=N
	Metaspace增长时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB)。

-XX:MinMetaspaceExpansion=N
	Metaspace增长时的最小幅度。在本机上该参数的默认值为340784B(大约330KB为)。

辅助信息参数设置

	-XX:+PrintFlagsInitial			查看本机的初始化参数
	-XX:+PrintCommandLineFlags		打印JVM的启动参数
	-XX:+DisableExplicitGC			让System.gc()不起作用



垃圾回收统计信息:

    -XX:+PrintGC				打印GC的简要信息(可直接使用PrintGCDetails)
	    输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs]
	             [Full GC 121376K->10414K(130112K), 0.0650971 secs]
    -XX:+PrintGCDetails			打印GC详情,包括堆(新生代(伊甸区、两个幸存区)、老年代)、元数据区内存使用详情
    -XX:+PrintGCDateStamps		打印GC时间(标准时间)
    -XX:+PrintGCTimeStamps		打印GC时间戳(以JVM启动为基准)
    -XX:+PrintTenuringDistribution				打印Survivor对象年龄分布
    -XX:+PrintGCApplicationConcurrentTime		打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用
    -XX:+PrintGCApplicationStoppedTime			打印垃圾回收期间程序暂停的时间。可与上面混合使用
    -XX:+PrintHeapAtGC			打印GC前后的详细堆栈信息
    -Xloggc:/log/gc.log			与上面几个配合使用,把相关日志信息记录到文件以便分析
    -XX:+UseGCLogFileRotation
    -XX:NumberOfGCLogFiles=3
    -XX:GCLogFileSize=1024k	

GC日志解读

2020-11-12T23:09:03.428+0800:[^1]  5.920:[^2] [GC[^3] (Allocation Failure)[^4] [PSYoungGen:[^5] 37532K->5105K(71680K)[^6] ] 37540K->6456K(159232K)[^7], 0.0161776 secs[^8] ] [Times: user=0.03 sys=0.00, real=0.02 secs] [^9]
Heap[^10]
 PSYoungGen      total 71680K, used 58418K [0x00000000d5d00000, 0x00000000da800000, 0x0000000100000000)
  eden space 66560K, 80% used [0x00000000d5d00000,0x00000000d91101d8,0x00000000d9e00000)
  from space 5120K, 99% used [0x00000000da300000,0x00000000da7fc718,0x00000000da800000)
  to   space 5120K, 0% used [0x00000000d9e00000,0x00000000d9e00000,0x00000000da300000)
 ParOldGen       total 87552K, used 1350K [0x0000000081600000, 0x0000000086b80000, 0x00000000d5d00000)
  object space 87552K, 1% used [0x0000000081600000,0x0000000081751bf8,0x0000000086b80000)
 Metaspace       used 12170K, capacity 12484K, committed 12672K, reserved 1060864K
  class space    used 1281K, capacity 1402K, committed 1408K, reserved 1048576K


注:
[^1]: GC事件(GC event)开始的时间点,对应参数 -XX:+PrintGCDateStamps
[^2]: GC时间的开始时间,相对于JVM的启动时间,单位是秒(Measured in seconds).对应参数 -XX:+PrintGCTimeStamps
[^3]: 用来区分(distinguish)是 Minor GC 还是 Full GC 的标志(Flag). 这里的 GC 表明本次发生的是 Minor GC,对应参数 -XX:+PrintGCDetails
[^4]: 引起垃圾回收的原因. 本次GC是因为年轻代中没有任何合适的区域能够存放需要分配的数据结构而触发的,还有Metadata GC Threshold、Ergonomics等多种原因引起Full GC
[^5]: 发生GC的区域
[^6]: 在本次垃圾收集之前和之后的年轻代内存使用情况(Usage),年轻代的总的大小(Total size,可用内存包括Eden区和from)
[^7]: 在本次垃圾收集之前和之后整个堆内存的使用情况(Total used heap),总的可用的堆内存(Total available heap,不包括新生代的to区)
[^8]: GC事件的持续时间(Duration),单位是秒
[^9]: GC事件的持续时间,通过多种分类来进行衡量:
	user – 此次垃圾回收, 垃圾收集线程消耗的所有CPU时间(Total CPU time)
	sys – 操作系统调用(OS call) 以及等待系统事件的时间(waiting for system event)
	real – 应用程序暂停的时间(Clock time)
[^10]: 堆中各区域内存使用情况




参数PrintTenuringDistribution输出示例

在这里插入图片描述
收集器分类:
在这里插入图片描述
组合:
在这里插入图片描述

在这里插入图片描述
注:-XX:+UseParNewGC,ParNew+Serial Old,在JDK1.8被废弃,在JDK1.7还可以使用。
到jdk8为止,默认的垃圾收集器是Parallel Scavenge 和 Parallel Old,从jdk9开始,G1收集器成为默认的垃圾收集器




Full GC (Ergonomics):

当我们使用Server模式下的ParallelGC收集器组合(Parallel Scavenge+Serial Old的组合)下,担保机制的实现和之前的Client模式下(SerialGC收集器组合)有所变化。在GC前还会进行一次判断,如果要分配的内存>=Eden区大小的一半,那么会直接把要分配的内存放入老年代中。否则 才会进入担保机制(内存分配担保机制–精彩文章)。

如果下一次晋升到老年代的平均大小大于老年代的剩余空间大小,则认为需要一次full gc
这个平均大小是怎么算出来的呢?
加权平均值包括与平均值的偏差,其平均值加上其中的一些倍数。 这是对未来未知数的上限的最佳估计。也就是通过这样的算法,虚拟机估算出下次分配可能会发生无法分配的问题,于是提前预测到可能的问题,提前发生一次full gc。

Ergonomics翻译成中文,一般都是“人体工程学”。在JVM中的垃圾收集器中的Ergonomics就是负责自动的调解gc暂停时间和吞吐量之间的平衡,然后你的虚拟机性能更好的一种做法。
对于注重吞吐量的收集器来说,在某个generation被过渡使用之前,GC ergonomics就会启动一次GC。
正如我们前面提到的,发生本次full gc正是在使用Parallel Scavenge收集器的情况下发生的。
而Parallel Scavenge正是一款注重吞吐量的收集器:
Parallel Scavenge的目标是达到一个可控的吞吐量,吞吐量=程序运行时间/(程序运行时间+GC时间),如程序运行了99s,GC耗时1s,吞吐量=99/(99+1)=99%。Parallel Scavenge提供了两个参数用以精确控制吞吐量,分别是用以控制最大GC停顿时间的
-XX:MaxGCPauseMillis及直接控制吞吐量的参数 -XX:GCTimeRatio

Full GC (Metadata GC Threshold)

Metaspace区是保存在本地内存中,是没有上限的,最大容量与机器的内存有关;但是JDK8中,XX:MetaspaceSize是有一个默认值的:21M。
-XX:MetaspaceSize=N
这个参数是初始化的Metaspace大小,该值越大触发Metaspace GC的时机就越晚。随着GC的到来,虚拟机会根据实际情况调控Metaspace的大小,可能增加上线也可能降低。在默认情况下,这个值大小根据不同的平台在12M到20M浮动
-XX:MaxMetaspaceSize=N
这个参数用于限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。在本机上该参数的默认值为4294967295B(大约4096MB)。

其他常用操作:

JVM监控工具
	jvisualvm 命令 或
	jconsole 命令 或
	程序中使用:Runtime.getRuntime().maxMemory(); 
	
在Tomcat服务器上设置JVM参数
	set CATALINA_OPTS=-Xmx512m -Xms512m -Xmn64m -Xss2m  或者
	set JAVA_OPTS=-Xmx512m -Xms512m -Xmn64m -Xss2m





参考:
https://blog.csdn.net/zfgogo/article/details/81260172
https://www.cnblogs.com/ceshi2016/p/8447989.html
https://www.cnblogs.com/otis/p/12846454.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值