实际上 -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 空间