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

-verbose:gc-XX:+printGC可以打印GC的简要信息[GC4790K->374K(15872K),0.0001606secs][GC4790K->374K(15872K),0.0001474secs][GC4790K->374K(15872K),0.0001563secs][GC4790K->374K(15872K),0.0…

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

JVM知识专栏JVM-火种,持续更新,喜欢请关注?

堆的分配参数

-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命令

-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

[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

[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

{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]

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

[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.net/128256.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月16日 上午8:20
下一篇 2022年4月16日 上午8:40


相关推荐

  • poi导出excel 损坏_poi导出excel解决方法

    poi导出excel 损坏_poi导出excel解决方法当前位置 我的异常网 J2EE poi 导出 excel 解决方法 poi 导出 excel 解决方法 www myexceptions net 网友分享于 2013 01 13 浏览 688 次 poi 导出 excel 现在我用 poi 导出 excel 遇到如下问题 下载后打开这个 excel 文件 说 您尝试打开的文件 XX xls 的格式与文件扩展名指定的格式不一致 打开文件前请验证文件没有损坏且来源可信 这是什

    2026年3月17日
    2
  • echarts饼图大小控制

    echarts饼图大小控制echarts 饼图大小设置

    2026年3月5日
    2
  • 自动化脚本任务计划程序(Windows)

    自动化脚本任务计划程序(Windows)任务计划程序 Windows 我们使用对 CSV 文件 Excel 文件和数据库中的数据进行处理 命令行中的脚本都是通过手动运行的 就像这样 pythonpython script pyinput file txtoutput file csv 这是一种最常见的运行脚本的方法 也是完全可以接受的 但是 当你需要定期运行脚本时 应该怎么办呢 如果没有别的运行脚本的方法 那么就需要你时刻记住要在某个时间使用命令行运行脚本 显然 这不是定期运行脚本的最优方法 在这种情况下 就需要另外一种方法 来按

    2026年3月18日
    2
  • Django(59)验证和授权[通俗易懂]

    Django(59)验证和授权[通俗易懂]验证和授权概述Django有一个内置的授权系统。他用来处理用户、分组、权限以及基于cookie的会话系统。Django的授权系统包括验证和授权两个部分。验证是验证这个用户是否是他声称的人(比如用户名

    2022年8月7日
    5
  • maven 本地仓库配置_maven默认的本地仓库

    maven 本地仓库配置_maven默认的本地仓库一、maven配置本地仓库路径1.打开安装好的maven目录2.进入conf–>编辑settings.xml文件3.修改<localRepository>找到并修改<localRepository>,最初是注释掉的,取消注释就可以 <localRepository>你想存放的本地仓库路径</localRepository>(不修改默认${user.home}/.m2/repository这个路径)二、配置中央仓库我这里用的阿里

    2025年11月28日
    33
  • 【离散数学】单射、满射和双射的定义、区别

    【离散数学】单射、满射和双射的定义、区别满射:对任意b,存在a满足f(a)=b~即:值域y是满的,每个y都有x对应,不存在某个y没有x对应的情况~单射:(one-to-onefunction)一对一函数,x不同则y不同~即:没有一个x对应两个y,也没有一个y有对应两个x~双射:既是满射,也是单射~即:每个y都有x对应,而且都是一一对应~…

    2022年6月10日
    224

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号