JVM参数配置(一)
1.跟踪参数
(1) 打印GC的相关简要信息
可以采用设置"-verbose:gc"或者"-XX:+printGC"两种方式。打印出来的信息如下面的形式
[GC 4790K->374K(15872K), 0.0001606 secs]
[GC 4790K->374K(15872K), 0.0001474 secs]
这样形式的信息表示GC之前堆内存使用了4790K,GC之后使用了374K,整个堆内存大小为15872K。
(2) 打印GC详细的信息
可以采用设置"-XX:+PrintGCDetails"打印GC的详细信息。如果需要知道GC的时间戳,则加上"-XX:+PrintGCTimeStamps"。打印出来的信息如下面的形式(未加时间戳):
[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
25
Heap
def new generation total 13824K, used 11223K [0x27e80000, 0x28d80000, 0x28d80000)
eden space 12288K, 91% used [0x27e80000, 0x28975f20, 0x28a80000)
from space 1536K, 0% used [0x28a80000, 0x28a80000, 0x28c00000)
to space 1536K, 0% used [0x28c00000, 0x28c00000, 0x28d80000)
tenured generation total 5120K, used 0K [0x28d80000, 0x29280000, 0x34680000)
the space 5120K, 0% used [0x28d80000, 0x28d80000, 0x28d80200, 0x29280000)
compacting perm gen total 12288K, used 142K [0x34680000, 0x35280000, 0x38680000)
the space 12288K, 1% used [0x34680000, 0x346a3a90, 0x346a3c00, 0x35280000)
ro space 10240K, 44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
rw space 12288K, 52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)
看第一行这是一个针对新生代的GC,在程序结束以后会把堆的情况打印出来。第四行新生代一共有13824K的空间,已经使用了11223K。其中eden区(对象出生的地方)有12288K大小,使用了91%。from和to是新生代的两个survivor区(幸存代),大小一定相等。然后描述了老年代(tenured generation)的使用情况,老年代总共大小约5M,未被使用。永久代(PermGen)(JAVA 8中已经移除了永久代,取而代之的是MetaSpace(元空间))总共约12M,已经被使用了142K,ro和rw是两个共享区间,ro是只读区间,rw为可读可写区间。
(3) 指定路径以日志文件形式输出GC的信息
设置参数"-Xloggc:log/gc.log",表示在当前src路径下的log文件夹下输出GC的日志文件gc.log,其中路径文件需要自己创建,比如我需要在src下创建一个log文件夹,而gc.log是系统自动创建。设置该参数后则运行时不再在控制台输出GC信息。
(4) 每一次GC后都打印堆信息
设置参数"-XX:+PrintHeapAtGC",表示每一次垃圾收集后都要输出堆信息。
{Heap before GC invocations=0 (full 0):
def new generation total 3072K, used 2752K [0x33c80000, 0x33fd0000, 0x33fd0000)
eden space 2752K, 100% used [0x33c80000, 0x33f30000, 0x33f30000)
from space 320K, 0% used [0x33f30000, 0x33f30000, 0x33f80000)
to space 320K, 0% used [0x33f80000, 0x33f80000, 0x33fd0000)
tenured generation total 6848K, used 0K [0x33fd0000, 0x34680000, 0x34680000)
the space 6848K, 0% used [0x33fd0000, 0x33fd0000, 0x33fd0200, 0x34680000)
compacting perm gen total 12288K, used 143K [0x34680000, 0x35280000, 0x38680000)
the space 12288K, 1% used [0x34680000, 0x346a3c58, 0x346a3e00, 0x35280000)
ro space 10240K, 44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
rw space 12288K, 52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)
[GC[DefNew: 2752K->320K(3072K), 0.0014296 secs] 2752K->377K(9920K), 0.0014604 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap after GC invocations=1 (full 0):
def new generation total 3072K, used 320K [0x33c80000, 0x33fd0000, 0x33fd0000)
eden space 2752K, 0% used [0x33c80000, 0x33c80000, 0x33f30000)
from space 320K, 100% used [0x33f80000, 0x33fd0000, 0x33fd0000)
to space 320K, 0% used [0x33f30000, 0x33f30000, 0x33f80000)
tenured generation total 6848K, used 57K [0x33fd0000, 0x34680000, 0x34680000)
the space 6848K, 0% used [0x33fd0000, 0x33fde458, 0x33fde600, 0x34680000)
compacting perm gen total 12288K, used 143K [0x34680000, 0x35280000, 0x38680000)
the space 12288K, 1% used [0x34680000, 0x346a3c58, 0x346a3e00, 0x35280000)
ro space 10240K, 44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
rw space 12288K, 52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)
}
(5) 监控类的加载
设置参数"-XX:+TraceClassLoading",会在控制台输出类的加载过程。如下所示
[Opened C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.Object from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.io.Serializable from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.Comparable from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.CharSequence from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.String from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.reflect.AnnotatedElement from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.reflect.GenericDeclaration from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.reflect.Type from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.Class from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.Cloneable from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.ClassLoader from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.System from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
[Loaded java.lang.Throwable from C:\Program Files\Java\jre1.8.0_101\lib\rt.jar]
(6) 打印类的直方图
设置参数"-XX:+PrintClassHistogram",会在控制台输出类的使用情况。当然加上这个参数如果不做一些操作在控制台不会打印任何信息。当按下Ctrl+Break之后,会在控制台打印类的使用情况。如下所示,从左至右为序号、实例数量、所占空间、类名
num #instances #bytes class name
----------------------------------------------
1: 890617 470266000 [B
2: 890643 21375432 java.util.HashMap$Node
3: 890608 14249728 java.lang.Long
4: 13 8389712 [Ljava.util.HashMap$Node;
5: 2062 371680 [C
6: 463 41904 java.lang.Class