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区。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • TS助手 v3.52 视频网站下载工具,网页视频下载神器

    TS助手 v3.52 视频网站下载工具,网页视频下载神器TS的全称则是TransportStream,即传输流,DVD节目中的MPEG2格式,是MPEG2-PS,MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的,m3u8是一个TS切片列表文件,它记录视频的每个切片的时长与顺序。现主流视频网站都采用这种模式。正因为如此,很多网友遇到这种TS传输流的视频,就有点束手无策了,今天给大家带来的这款TS助手可以轻松帮大家解决视频…

  • PropertyDescriptor属性描述类学习

    PropertyDescriptor属性描述类学习1构造方法通过调用getFoo和setFoo存取方法,为符合标准Java约定的属性构造一个PropertyDescriptor publicPropertyDescriptor(StringpropertyName, Class<?>beanClass) 该构造函数使用简单属性的名称,以及读取和写入属性的方法名称publicPropertyDes…

  • 服务器lsass状态代码c0000005,提示LSASS.EXE失败状态代码C0000005

    服务器lsass状态代码c0000005,提示LSASS.EXE失败状态代码C0000005提示LSASS.EXE失败状态代码C0000005故障问题:电脑出现提示一个关键系统进程,C:Windowssystem32lsass.exe失败,状态代码是c0000005。现在必须重新启动机器然后就开始倒计时自动重新启动。用杀毒后没有发现病毒。故障处理:这个问题不一定是跟病毒有关,有些恶意软件和电源管理程序也会导致这个故障现象。使用360安全卫士或恶意软件清理助手清理一下看看。另外,如果Win…

  • Arduino-驱动LCD1602A「建议收藏」

    Arduino-驱动LCD1602A「建议收藏」Demo_01、显示温湿度数据注意:根据我的代码注释进行接线,如果还有不懂的就查看lcd的使用手册,有详细的电路图哦!#include<LiquidCrystal.h>//LCD的头文件#include<dht11.h>//导入dht11的头文件#defineDhtPIN2//dht11控制的端口#defineRS6//LCD1602的RS端口 //RW、VSS、K接GND,VDD、A接V

  • 开发环境、测试环境、生产环境、UAT环境、仿真环境详解「建议收藏」

    开发环境、测试环境、生产环境、UAT环境、仿真环境详解「建议收藏」开发环境(DEV):开发环境是程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告。测试环境(UAT):一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产机上。生产环境(PROD):是指正式提供对外服务的,一般会关掉错误报告,打开错误日志。可以理解为包含所有的功能的环境,任何项目所使用的环境都以这个为基础,然后根据客户…

  • MySQL数据库优化的八种方式(经典必看)

    MySQL数据库优化的八种方式(经典必看)MySQL数据库优化的八种方式(经典必看)引言: 关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人能力,希望对大家今后开发中也有帮助 1、选取最适用的字段属性MySQL可以很好的支持大数据量的存取,但是一般说来,数据库…

发表回复

您的电子邮箱地址不会被公开。

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