1、JVM堆内存包括:年轻代、年老代。
2、持久代。
3、GC时,年轻代、年老代进行垃圾回收。FULL GC时,年轻代、年老代、持久内存都进行垃圾回收。
4、FULL GC时,年轻代、年老代、持久内存都进行垃圾回收。
5、GC日志示例:
[GC [PSYoungGen: 68350K->11753K(326528K)] 601880K->545283K(1025600K), 0.0136065 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
(1)PSYoungGen: 68350K->11753K(326528K)解释如下:
年轻代 GC前已使用68350K,GC后已使用11753K,年轻代内存共326528K。
本次GC了: 68350K - 11753K = 56597K
(2)601880K->545283K(1025600K)解释如下:
堆内存 GC前已使用601880K,GC后已使用545283K,堆内存共1025600K。
本次GC了:601880K - 545283K = 56597K
注意:堆内存、年轻代本次GC都是56597K,那么说明年老代没有GC或者就是小概率事件发生了。
(3)GC持续时间 0.0136065 secs【秒】
6、FULL GC日志示例:
[Full GC (System) [PSYoungGen: 11753K->0K(326528K)] [ParOldGen: 533530K->532770K(699072K)] 545283K->532770K(1025600K) [PSPermGen: 182264K->182264K(262400K)], 0.4178577 secs] [Times: user=5.41 sys=0.00, real=0.42 secs]
(1)PSYoungGen: 11753K->0K(326528K)解释如下:
年轻代 FULL GC前已使用11753K,FULL GC后已使用0K,年轻代内存共326528K。
本次FULL GC了: 11753K - 0K = 11753K
(2)ParOldGen: 533530K->532770K(699072K)解释如下:
年老代 FULL GC前已使用533530K,FULL GC后已使用532770K,年老代内存共699072K。
本次FULL GC了: 533530K - 532770K = 760K-----》是否年老代设置小了?导致FULL GC了也没回收多少内存。
(3)545283K->532770K(1025600K) 解释如下:
堆内存 FULL GC前已使用545283K,FULL GC后已使用532770K,堆内存共1025600K。
本次FULL GC了: 545283K - 532770K = 12513K
本次堆内存FULL GC = 年轻代本次FULL GC + 年老代本次FULL GC = 11753K + 760K = 12513K
(4)PSPermGen: 182264K->182264K(262400K)解释如下:
持久代 FULL GC前已使用182264K,FULL GC后已使用182264K,持久代内存共262400K。
本次FULL GC了: 182264K - 182264K = 0K---》是否意味持久代没啥可回收的?,可以将持久代内存设置为200M
(5)FULL GC持续时间 0.4178577 secs
(6)Full GC (System) 这里System表示代码中有System.gc()调用。
(7)从FULL GC日志可以看出:
年老代 = 堆内存 - 年轻代 即 1025600K - 326528K = 699072K
年轻代 = Eden + survivor + survivor,其中一个survivor用来临时存储(采用复制算法时)。