JVM参数解析 Xmx、Xms、Xmn、NewRatio、SurvivorRatio、PermSize、PrintGC「建议收藏」

2022-07-31 14:24:32 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

目录
  • 堆的分配参数
  • 永久区分配参数
  • 栈大小分配
  • 大对象直接进入老年代
  • 打印简要GC回收数据
  • 打印详细GC回收数据
  • 指定GC log的位置,以文件输出
  • 每次一次GC后,都打印堆信息
  • 监控类的加载
  • 直方图展示类信息

堆的分配参数

-Xmx 指定最大堆,即堆内存的上线,当实际内存接近上线时会发生GC。 –Xms 最小堆,jvm运行的默认堆大小。 -Xmn 设置新生代大小 -XX:NewRatio 新生代(eden 2*s)和老年代(不包含永久区)的比值。新生代和老年代默认比例是1:2。 4表示 新生代:老年代=1:4,即年轻代占堆的1/5 -XX:SurvivorRatio 设置两个Survivor区和eden的比 8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10。eden和两个survivor的默认比例是8:1:1 -XX: HeapDumpOnOutOfMemoryError 发生OutOfMemory是导出堆信息到文件 -XX: HeapDumpPath 指定导出堆信息路径 -XX:OnOutOfMemoryError 在OOM时,执行一个脚本 下面的命令表示在发生oom时把堆日志存储到/tmp/heapdump.hprof,并且执行sh ~/test.sh命令

代码语言:javascript复制
-XX: HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError="sh ~/test.sh"

永久区分配参数

-XX:PermSize 设置永久区的初始空间 -XX:MaxPermSize 设置永久区最大空间

栈大小分配

-Xss 栈内存容量,通常只有几百k,默认的栈内存为1MB。栈总空间=线程数量*栈容量,所以降低栈内存容量可以加大线程数。当程序请求的栈深度大于虚拟机栈深度的最大限度时会发生栈溢出,一般栈溢出是因为递归调用产生的,递归调用即函数自己调用自己,或者通过其他函数间接调用自己。

大对象直接进入老年代

-XX:PretenureSizeThreshold=1024 对象如果大于或等于此值,会直接分配到老年代里

打印简要GC回收数据

-verbose:gc -XX: PrintGC

代码语言:javascript复制
[GC 66048K->11268K(251904K), 0.0210029 secs] 

这个参数是在每次发生GC时打印相关信息,[GC 66048K->11268K(251904K), 0.0210029 secs] ,这一行内容表示发生GC前占用堆66048K(约64.5mb),回收后内存为11268K(约11mb),整个堆大小为251904K(约246mb),回收花费了0.0210029 secs(约0.02秒)。

打印详细GC回收数据

-XX: PrintGCDetails

代码语言:javascript复制
[GC [PSYoungGen: 66048K->10746K(76800K)] 66048K->11353K(251904K), 0.0171900 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]

打印信息PSYoungGen中的PS是Parallel Scavenge收集器的缩写,属于垃圾收集器的一种。Parallel Scavenge收集器是一个使用复制算法并行多线程的新生代收集器。66048K为收集前的内存,10746K为收集后内存,76800K为整个新生代的默认大小。66048K为堆区在回收前的内存,11353K为堆区在回收后的内存大小,251904K是整个堆区的默认内存容量。0.0171900 secs为整个回收消耗时间,余额0.02秒。[Times: user=0.06(GC用户耗时) sys=0.00(GC系统耗时), real=0.01 secs(GC实际耗时)] -XX: PrintGCTimeStamps,作用和-XX: PrintGCDetails相同,加了输出时间戳

指定GC log的位置,以文件输出

-Xloggc:F:gc1.log

可以在文件中记录每次GC信息,方便排查定位问题。

每次一次GC后,都打印堆信息

-XX: PrintHeapAtGC

代码语言:javascript复制
{Heap before GC invocations=12 (full 0):
 PSYoungGen      total 133632K, used 94610K [0x00000000f5500000, 0x0000000100000000, 0x0000000100000000)
  eden space 92160K, 100% used [0x00000000f5500000,0x00000000faf00000,0x00000000faf00000)
  from space 41472K, 5% used [0x00000000faf00000,0x00000000fb164930,0x00000000fd780000)
  to   space 41472K, 0% used [0x00000000fd780000,0x00000000fd780000,0x0000000100000000)
 ParOldGen       total 175104K, used 65489K [0x00000000e0000000, 0x00000000eab00000, 0x00000000f5500000)
  object space 175104K, 37% used [0x00000000e0000000,0x00000000e3ff4460,0x00000000eab00000)
 PSPermGen       total 131072K, used 21516K [0x00000000d0000000, 0x00000000d8000000, 0x00000000e0000000)
  object space 131072K, 16% used [0x00000000d0000000,0x00000000d15031c8,0x00000000d8000000)

[GC [PSYoungGen: 94610K->2684K(127488K)] 160099K->68346K(302592K), 0.0052866 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

代码语言:javascript复制
Heap after GC invocations=12 (full 0):
 PSYoungGen      total 127488K, used 2684K [0x00000000f5500000, 0x00000000ffc80000, 0x0000000100000000)
  eden space 89600K, 0% used [0x00000000f5500000,0x00000000f5500000,0x00000000fac80000)
  from space 37888K, 7% used [0x00000000fd780000,0x00000000fda1f190,0x00000000ffc80000)
  to   space 40960K, 0% used [0x00000000fac80000,0x00000000fac80000,0x00000000fd480000)
 ParOldGen       total 175104K, used 65662K [0x00000000e0000000, 0x00000000eab00000, 0x00000000f5500000)
  object space 175104K, 37% used [0x00000000e0000000,0x00000000e401f870,0x00000000eab00000)
 PSPermGen       total 131072K, used 21516K [0x00000000d0000000, 0x00000000d8000000, 0x00000000e0000000)
  object space 131072K, 16% used [0x00000000d0000000,0x00000000d15031c8,0x00000000d8000000)
}

这个参数会在每一次GC前后打印堆信息,上述内容为-XX: PrintHeapAtGC加-XX: PrintGCDetails打印出的结果。第一段落为GC发生前堆情况,第二段落为GC后的堆情况。 invocations=12 (full 0)表明这是第12次发生GC,其中full GC的次数为0。 PSYoungGen: GC前新生代总内存为133632K(约130mb),已使用为94610K (约92mb)。新生代的eden区使用了92160K(约90mb),使用率为100%。from区和to区为使用率分别为5%和0%。因为from区和to区使用复制回收算法,所以总会有一块内存作为备用内存而不被使用。GC后eden区占用为0%,说明eden的数据已经被回收或者已经发生了晋级。from区从5%的使用率升到了7%,说明有一部分新生代的数据晋级到了from区。 ParOldGen:老年代在GC前总内存为175104K(约171mb),实际占用65489K(约63mb)。而GC后的老年代为65662K(约64mb),说明GC过程中有一部分大对象越过form区直接晋级老年代了。 PSPermGen:永久区的内存情况在GC前后几乎没有发生变化。

监控类的加载

-XX: TraceClassLoading

代码语言:javascript复制
[Loaded org.apache.velocity.runtime.parser.VelocityCharStream from file:/velocity-1.6.4.jar]
[Loaded org.apache.velocity.runtime.parser.JJTParserState from file://velocity-1.6.4.jar]

这个方法可以将类加载的所有详细信息打印出来,方便确定虚拟机已经加载了哪些内容。

直方图展示类信息

-XX: PrintClassHistogram

这个参数需要在tomcat运行时按下Ctrl Break(thinkpad按Ctrl fn B打印),打印所有类的使用情况,排序为占用空间大小倒序。分别表示分别显示:序号、实例数量、总大小、类型,所以打印的第一条信息为序号53346个实例,占用内存7544632B。[C : char[]、[S: short[]、[I:int[]、[B:byte[] 、[I :int[]。constMethodKlass/ methodKlass/ constantPoolKlass/ constantPoolCacheKlass/ instanceKlassKlass/ methodDataKlass 与Classloader相关,常驻与Perm区。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128256.html原文链接:https://javaforall.cn

0 人点赞