JVM-透彻理解GC日志的内容

发布时间:2024年01月04日

案例:

代码:

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的原因是因为新?代中没有?够的区域存放需 要分配的数据。除此之外,还可能遇到的情况是:

  • ????????Metadata GCThreshold:Metaspace区不够?了;
  • ? ? ? ? FErgonomics:JVM?适应调整导致的GC;
  • ? ? ? ??System:调?了System.gc()?法;

DefNew:这?表示的是 Default New Generation;就是新?代默认垃圾回收器的意思,如果采?了其他的垃圾回 收器,这?显示的内容会有所不同。常?的有:

  • ????????Serial收集器:新?代显示 "[DefNew",即 Default New Generation;
  • ? ? ? ?ParNew收集器:新?代显示 "[ParNew",即 Parallel New Generation;
  • ? ? ? ?Parallel Scavenge收集器:新?代显示"[PSYoungGen",JDK1.7使?的即PSYoungGen;
  • ? ? ? ?Parallel Old收集器:?年代显示"[ParoldGen";
  • ? ? ? ?G1收集器:显示”garbage-first heap“;

[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。

  • ????????user:进程执??户态代码(核?之外)所使?的时间。这是执?此进程所使?的实际CPU 时间,其他进程 和此进程阻塞的时间并不包括在内。在垃圾收集的情况下,表示GC线程执?所使?的 CPU 总时间。
  • ? ? ? ? sys:进程在内核态消耗的 CPU 时间,即在内核执?系统调?或等待系统事件所使?的CPU 时间。
  • ????????real:程序从开始到结束所?的时钟时间。这个时间包括其他进程使?的时间?和进程阻塞的时间(?如等待 I/O 完成)。对于并?gc,这个数字应该接近(?户时间+系统时间)除以垃圾收集器使?的线程数。

?志第?部分

从?志可以看到,?志第?部分主要记录了新?代、?年代和元空间的基本情况:

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),满了再分配。

???????? ????????

????????

? ? ??

????????

文章来源:https://blog.csdn.net/zhenlong_qu/article/details/135347516
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。