《实战Java虚拟机》学习笔记之常用Java虚拟机参数
Contents
跟踪垃圾回收
-XX:+PrintGC
例子日志样本:
[GC 4793K->377K(15872K), 0.0006926 secs]
表示当前使用了4793K,GC后,使用量变为377K,最大可用为15872K
-XX:+PrintGCDetails
格式: [名称:当前某区大小->GC后某区大小(一共可用某区大小)
GC时间跟踪
-XX:+PrintGCTimeStamps
例子:
0.185: [GC 66048K->53077K(251392K), 0.0977580 secs]
-XX:+PrintGCDateStamps
例子:
2014-01-03T12:08:38.102-0100: [GC 66048K->53077K(251392K), 0.0959470 secs]
指定GC日志到某路径
-Xloggc
默认情况下,GC日志是打印到控制台的,添加这个参数,可以将GC日志重定向到某文件.
例子:
-Xloggc:/home/gc.log
查看GC时详细堆信息
-XX:+PrintHeapAtGC
查看应用程序执行时间和停顿时间
-XX:+PrintGCApplicationConcurrentTime
打印应用程序的执行时间
-XX:+PrintGCApplicationStoppedTime
打印应用程序由于GC而产生的停顿时间
查看虚拟机引用信息
-XX:+PrintReferenceGC
类的加载和卸载跟踪
-XX:+TraceClassLoading-XX:+TraceClassUnloading-verbose:class: 这一个参数,相当于上两个一起。
查看虚拟机参数
-XX:+PrintVMOptions: 查看显式传递的参数-XX:+PrintCommandLineFlags:查看显式和隐式参数-XX:+PrintFlagsFinal:查看所有包括系统默认的参数
堆的配置
- 整个堆的大小,公式为:
总堆可用大小(-Xmx) = 老年代 + 新生代 = 老年代 + eden + from + to
- 新生代总大小,公式为:
新生代(-Xmn)= Eden + from + to
- 新生代可用大小,公式为:
新生代可用大小 = Eden + from = Eden + to
- 整个虚拟机最大大小,公式为:
总可用大小 = 持久代 + 年老代 + 新生代
最大堆和初始堆设置
-Xms:初始堆大小
例如:-Xms10m
-Xmx:最大堆设置
例如:-Xmx100m
新生代大小
-Xmn:一般设置为整个堆的1/3到1/4
例如
-Xmn10m
-XX:SurvivorRatio:设置新生代中eden和from/to空间的比例关系
例如
-XX:SurvivorRatio=2-XX:SurvivorRatio = eden/from = eden/to
注意:新生代总可用的空间,只有 eden + from 或者 eden + to。即
新生代总可用空间 = eden + from = eden + to
-XX:NewRatio:设置新生代和老年代的比例
例如:
-XX:NewRatio=2
-XX:NewRatio=老年代/新生代
堆溢出处理
-XX:+HeapDumpOnOutOfMemoryError:可堆溢出时,导出整个堆信息-XX:HeapDumpPath:导出到指定的路径
例如
-XX:HeapDumpPath=/home/to/path
-XX:OnOutOfMemoryError="<cmd args>;<cmd args>":在发现溢出时,执行指定命令
例如:
-Xmx20
-XX:+HeapDumpOnOutOfMemoryError
”-XX:OnOutOfMemoryError=/path/to/commnd.sh %p”
注意:写法是双引号包括整个参数。%p 表示进程号
非堆区
codeCache 区
设置 codeCache 区的内存大小
-XX:ReservedCodeCacheSize=256M
方法区(永久代)[JDK 1.8前]
-XX:PermSize:初始永久区大小
例如:
-XX:PermSize=64M
-XX:MaxPermSize:最大永久区大小
例如:
-XX:MaxPermSize=128M
元数据区[JDK 1.8 及之后]
默认的情况下,该区只受系统可用内存的限制。但也可以使用参数
-XX:MetaspaceSize:指定初始时的元数据区大小
例如:
-XX:MetaspaceSize=128M
-XX:MaxMetaspaceSize:指定元数据区的最大可用值。
例如:
-XX:MaxMetaspaceSize=256M
直接堆内存配置
-XX:MaxDirectMemorySize: 最大可用直接内存。如果不设置,默认值为最大堆空间,即-Xmx的值。
更新
在网上看到一个图非常好, 这里引用一下:
原文 http://javahonk.com/how-many-types-memory-areas-allocated-by-jvm/
