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用來臨時存儲(採用複製算法時)。