案例:
代码:
public class SerialGC {
private static int size = 1024 * 256;
public static void main(String[] args) {
for (int i = 0; i < 33; i++) {
byte[] allo = new byte[size];
}
}
}
jvm参数:
-Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintGCTimeStamps - XX:SurvivorRatio=8
执??志:
0.133: [GC (Allocation Failure) 0.133: [DefNew: 8105K->378K(9216K), 0.0015472 secs]
8105K->378K(19456K), 0.0016135 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
Heap
def new generation total 9216K, used 2751K [0x00000007bec00000, 0x00000007bf600000,
0x00000007bf600000)
eden space 8192K, 28% used [0x00000007bec00000, 0x00000007bee51258,
0x00000007bf400000)
from space 1024K, 36% used [0x00000007bf500000, 0x00000007bf55eb78,
0x00000007bf600000)
to space 1024K, 0% used [0x00000007bf400000, 0x00000007bf400000,
0x00000007bf500000)
tenured generation total 10240K, used 0K [0x00000007bf600000, 0x00000007c0000000,
0x00000007c0000000)
the space 10240K, 0% used [0x00000007bf600000, 0x00000007bf600000,
0x00000007bf600200, 0x00000007c0000000)
Metaspace used 3079K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 337K, capacity 388K, committed 512K, reserved 1048576K
GC日志内容完整解析
?志第??
0.133: [GC (Allocation Failure) 0.133: [DefNew: 8105K->378K(9216K), 0.0015472 secs] 8105K-
>378K(19456K), 0.0016135 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
0.133 :表示JVM从启动之后过了0.133秒发?了垃圾回收。
GC (Allocation Failure),这?不是系统出错了,表明本次引起GC的原因是因为新?代中没有?够的区域存放需 要分配的数据。除此之外,还可能遇到的情况是:
DefNew:这?表示的是 Default New Generation;就是新?代默认垃圾回收器的意思,如果采?了其他的垃圾回 收器,这?显示的内容会有所不同。常?的有:
[DefNew: 8105K->378K(9216K), 0.0015472 secs] 这?表示的含义是在执?垃圾回收之前,年轻代被占?的空间 是8105K,完成垃圾回收之后占?的空间是378K,完成之后新?代的总空间??是9216K,耗时0.0015472 secs。
GC?志格式的规律?般都是:GC前内存占?->GC后内存占?(该区域内存总??)。
8105K->378K(19456K), 0.0016135 secs表示垃圾回收之前堆空间被占?的空间是8105K,回收之后被占?的是 378K,堆的总空间为19456K。
[Times: user=0.00 sys=0.00, real=0.01 secs]
GC?志中有三个时间:user,sys和real。
?志第?部分
从?志可以看到,?志第?部分主要记录了新?代、?年代和元空间的基本情况:
Heap
def new generation total 9216K, used 2751K [0x00000007bec00000, 0x00000007bf600000,
0x00000007bf600000)
eden space 8192K, 28% used [0x00000007bec00000, 0x00000007bee51258,
0x00000007bf400000)
from space 1024K, 36% used [0x00000007bf500000, 0x00000007bf55eb78,
0x00000007bf600000)
to space 1024K, 0% used [0x00000007bf400000, 0x00000007bf400000,
0x00000007bf500000)
tenured generation total 10240K, used 0K [0x00000007bf600000, 0x00000007c0000000,
0x00000007c0000000)
the space 10240K, 0% used [0x00000007bf600000, 0x00000007bf600000,
0x00000007bf600200, 0x00000007c0000000)
Metaspace used 3079K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 337K, capacity 388K, committed 512K, reserved 1048576K
在上??志中,def new generation 对应的就是新?代的空间,tenured generation 就是?年代空间的情况。
Metaspace是元空间的情况。 我们可以看到,新?代的空间总??是 9216K, 已经使?了 2751K,后?三?则分别记录了Eden区、from和to的 使?情况。?年代的总??是10240K,未使?。这?为什么新?代的总空间只有9M??年代是10M呢?这是因为 在新?代?的from和to是轮流使?的,?次只有?个发挥作?,相当于浪费了?个1M的空间,因此只有空间只有 8M的Eden区+1个1M的S区,?共是9M。????????????????
另外我们还可以看到,在?志?记录了各个区域的起?位置,以及空间使?到的位置,例如from区:
[0x00000007bf500000, 0x00000007bf55eb78, 0x00000007bf600000) 意思就是from区的开始位置是 0x00000007bf500000,?前已经?到了0x00000007bf55eb78这个位置,最?只能到0x00000007bf500000这个 位置。
最后一个部分是Metaspace和class space,
元空间
used -?已使用空间大小
capacity - 已分配的可用空间
committed - 已提交用于元数据分配空间大小
reserved - 已预留最大空间大小
类空间
used -?已使用空间大小
capacity - 已分配的可用空间
committed - 已提交用于元数据分配空间大小
reserved - 已预留最大空间大小
解释:
? ? ? ? 方法区是在直接内存的,每次会分配一个簇(4k),满了再分配。
???????? ????????
????????
? ? ??
????????