實際上 -XX:+PrintGCDetails 打印出來的新生代的 total 也是575,也是不算 S1 的
Xms:575
Xmx:575
Heap
PSYoungGen total 179200K, used 12288K [0x00000007b3800000, 0x00000007c0000000, 0x00000007c0000000)
eden space 153600K, 8% used [0x00000007b3800000,0x00000007b44001b8,0x00000007bce00000)
from space 25600K, 0% used [0x00000007be700000,0x00000007be700000,0x00000007c0000000)
to space 25600K, 0% used [0x00000007bce00000,0x00000007bce00000,0x00000007be700000)
ParOldGen total 409600K, used 0K [0x000000079a800000, 0x00000007b3800000, 0x00000007b3800000)
object space 409600K, 0% used [0x000000079a800000,0x000000079a800000,0x00000007b3800000)
Metaspace used 3387K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 376K, capacity 388K, committed 512K, reserved 1048576K
複製代碼
逃逸分析:棧上分配,標量替換
OOM
Full GC中,元數據指向元數據的那些指針都不用再掃描了。不少複雜的元數據掃描的代碼(尤爲是CMS裏面的那些)都刪除了。 元空間只有少許的指針指向Java堆。這包括:類的元數據中指向java/lang/Class實例的指針;數組類的元數據中,指向java/lang/Class集合的指針。 沒有元數據壓縮的開銷 減小了根對象的掃描(再也不掃描虛擬機裏面的已加載類的字典以及其它的內部哈希表) 減小了Full GC的時間 G1回收器中,併發標記階段完成後能夠進行類的卸載
遇到 OOM 呢, 第一時間看內存分佈,用工具 dump 出一張內存快照出來,工具備不少
先看是否是有不合理代碼生成了大量對象而且這些對象內存泄露了,佔用了大量內存出去
再看內存泄露,通常單單內存泄露不會 OOM,可是能夠優化內存使用
增長屋裏內存
看看是否是某些大致積對象聲明週期過長,好比 bitmap
接口的匿名實現類其實是被做爲一種類型來使用的,在每個匿名實現類在方法區都會佔據一塊 class 空間