跟踪垃圾回收

-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/31/4

例如 -Xmn10m

  • -XX:SurvivorRatio:设置新生代中edenfrom/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 区

参考 blog

设置 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/

img