73.JVM内存基础结构,参数分类,推荐的配置项,参数混用问题,常用工具,常用命令
Posted to.to
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了73.JVM内存基础结构,参数分类,推荐的配置项,参数混用问题,常用工具,常用命令相关的知识,希望对你有一定的参考价值。
73.JVM内存基础结构,参数分类,推荐的配置项,参数混用问题,常用工具,常用命令
73.1.堆内存基本结构
73.2.参数分类
73.3.推荐的配置项
73.4.参数混用问题
73.5.常用命令
73.JVM内存基础结构,参数分类,推荐的配置项,参数混用问题,常用工具,常用命令
73.1.堆内存基本结构
注:以下内容无特殊说明都是jdk7 hotspot虚拟机环境下的配置。
73.2.参数分类
JVM启动参数共分为三类:
1、标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容。例如: -verbose:gc(输出每次GC的相关情况);-verbose:jni(输出native方法调用的相关情况,一般用于诊断jni调用错误信息)。
2、非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容。例如:-Xms512m;-Xmx512m;-Xmn200m;-Xss128k;-Xloggc:file(与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。若与verbose命令同时出现在命令行中,则以-Xloggc为准)。
3、非Stable(稳态)参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用。例如:-XX:PermSize=64m;-XX:MaxPermSize=512m。
非稳态选项使用说明:
-XX:+ 启用option
-XX:- 不启用option
-XX:= 设定option的值为数字类型,可跟单位,例如 32k, 1024m, 2g
-XX:= 设定option的值为字符串,例如-XX:HeapDumpPath=./dump.core
73.3.推荐的配置项
生产库tomcat/bin/catalina.sh统一配置
JAVA_OPTS="
#堆内存各区域大小配置
-Xms2048m #初始堆大小,与Xmx配置一样避免内存申请带来的资源消耗
-Xmx2048m #堆最大容量
-Xss256k #每个线程的堆栈大小,不占用堆空间,jdk5之前默认为256k之后为1M
#Xmn通常占整个堆大小的3/10,-XX:NewRatio=年轻代:年老代,-XX:NewSize/-XX:MaxNewSize,看值是否合适可以执行GC看老年代回收的空间是否比较多,可以调整年轻代大小和对象进入老年代年龄大小(-XX:InitialTenuringThreshold=7, -XX:MaxTenuringThreshold=15(7和15也是默认值))进行设置
-Xmn680m
-XX:SurvivorRatio=8 #s0+s1:eden 配置成8也就是2:8 一个s0占1/10新生代大小,默认8
-XX:PermSize=256m #永久代即代码和类结构存储区初始大小,默认64m
-XX:MaxPermSize=256m
#jdk8废除永久代新增元空间,类加载器不用时移除所用所有空间
-XX:MetaspaceSize=12M
-XX:MaxMetaspaceSize=36M
-XX:-UseAdaptiveSizePolicy #禁用jvm自动调整内存比例,jdk1.6、1.7下会导致每经过一次minor GC Survivor区会减少大概1M空间(减少部分累加到eden区域)直至降至1M导致一直进行垃圾回收CPU 100%运行
#OOM(OutOfMemeoryError)配置
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/work/tomcat/jvmlogs/oomDump.dump -XX:OnOutOfMemoryError=/usr/local/tomcat/bin/restart.sh #当内存溢出发生时执行一个脚本
#GC日志配置
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps #输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC #在进行GC的前后打印出堆的信息
-XX:+PrintTenuringDistribution #打印年轻代存活年龄 例:- age 2: 2436856 bytes, 6782256 total,对于XX:MaxTenuringThreshold值设置有很大参考价值
-Xloggc:/usr/local/work/tomcat3/logs/jvmgc.log #GC日志文件路径
#日志格式
#Jconsole远程调试配置,调试期间开启(生产库请勿长期开启)
-Djava.rmi.server.hostname=112.124.121.127
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8899
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
"
73.4.参数混用问题
-Xmn,-XX:NewSize/-XX:MaxNewSize,-XX:NewRatio 3组参数都可以影响年轻代的大小,混合使用的情况下,优先级是什么?
如下:
高优先级:-XX:NewSize/-XX:MaxNewSize
中优先级:-Xmn(默认等效 -Xmn=-XX:NewSize=-XX:MaxNewSize=?)
低优先级:-XX:NewRatio
推荐使用-Xmn参数,原因是这个参数简洁,相当于一次设定 NewSize/MaxNewSIze,而且两者相等,适用于生产环境。-Xmn 配合 -Xms/-Xmx,即可将堆内存布局完成。
73.5.常用命令
jmap -heap pid
jps -v 查看当前运行的java进程类似ps -ef|grep java
jcmd PID VM.flags 查看JVM的启动参数
jcmd pid VM.system_properties 显示系统信息
jcmd pid GC.run 手动执行一次Full GC,功能类似直接调用java.lang.System.gc()
jcmd pid GC.heap_dump /usr/local/dump.hprof 导出HPROF格式的内存信息,保存到文件中。
jcmd pid Thread.print 这里和jstack -l pid的效果是一样的。
jcmd PID GC.class_histogram 查看类及对象数量和大小统计信息,类似jmap -histo pid
以上是关于73.JVM内存基础结构,参数分类,推荐的配置项,参数混用问题,常用工具,常用命令的主要内容,如果未能解决你的问题,请参考以下文章
Oracle基础结构认知——oracle内存结构 礼记八目 2017-12-15 20:31:27