深刻JVM 原理(七)老年代、永久代和元空间

目录

深刻JVM 原理(一)Java内存模型:http://www.noobyard.com/article/p-vcuxafar-mx.html
深刻JVM原理(二)Java对象访问模式:http://www.noobyard.com/article/p-kshslmnp-ma.html
深刻JVM原理(三)JVM 垃圾收集:http://www.noobyard.com/article/p-ztnmzyos-kr.html
深刻JVM原理(四)JVM垃圾回收流程:http://www.noobyard.com/article/p-anmqpmkm-cy.html
深刻JVM原理(五)Java堆内存调整参数(调优关键):http://www.noobyard.com/article/p-eltveokx-mg.html
深刻JVM原理(六)年轻代:http://www.noobyard.com/article/p-atmiidnt-ks.html
深刻JVM原理(七)老年代、永久代和元空间:http://www.noobyard.com/article/p-vaxbmhqe-ea.html
深刻JVM原理(八)JVM垃圾回收策略:http://www.noobyard.com/article/p-adodzhii-ds.html
深刻JVM原理(九)JVM垃圾回收策略参数配置:http://www.noobyard.com/article/p-yopfenvx-mg.html
深刻JVM原理(十)G1收集器:http://www.noobyard.com/article/p-olmrbdgd-mw.html
深刻JVM原理(十一)Java引用类型:http://www.noobyard.com/article/p-hsennvkb-ks.htmljava

老年代

老年代主要接收由年轻代发送过来的对象,通常状况下,通过了数次Minor GC 以后还会保存下来的对象才会进入到老年代。若是要保存的对象超过了伊甸园区的大小,此对象也将直接保存在老年代之中,当老年代内存不足时,将引起 “major GC”,即,“Full GC”。算法

在老年代里面会采用两种算法结合的模式实现GC的处理:整理-压缩。spa

这里写图片描述

在回收清除的过程之中,发现全部在老年代中被回收的对象并无进行空间的整理,因此老年代最头疼的就是碎片化问题。.net

这里写图片描述

之后再进行老年代存储的时候尽量保存长期会被使用的对象,而且不会被轻易回收的大对象。3d

这里写图片描述

范例:设置老年代参数(java -Xms2G -Xmx2G -XX:+PrintGCDetails -XX:PretenureSizeThreshold=512k -XX:NewRatio=2 TestDemo) 
此时,若是超过512k的对象将直接被保存在老年代之中,也就是说。这个对象不会触发 Minor GC。(由于不在年轻代进行保存)对象

永久代(JDK 1.8 后消失)

虽然JAVA 的版本是 JDK 1.8 ,可是 JavaEE的版本仍是JDK1.7,也就是说,在JavaEE里面必须对永久代进行设置。永久代也是在堆内存中保存的,可是永久代不会被回收,例如:intern()方法产生的对象不会被回收。若是操做不当,致使永久代中的数据量过大,那么这个时候程序会报出 OOM 问题。 
通常状况下不会出现这种问题; 
这里写图片描述blog

-XX:MaxPermSize: 设置永久代的最大值 
-XX:PremSize:设置永久代的初始大小图片

范例:设置永久代参数(java -XX:MaxPermSize10M TestDemo) 
在JDK 1.8之中设置永久代会报出错误内存

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize10M; support was removed in 8.0rem

元空间

元空间是JDK 1.8 以后才有的,功能和永久代相似。惟一到的区别是,永久代使用的是JVM的堆内存空间,而元空间使用的是物理内存,直接受到本机的物理内存限制。 
这里写图片描述

范例“设置一些参数,让元空间出错(java -XX:MaxMetaspaceSize=1m XX:MetaspaceSize=1m TestDemo)  此时会报出“OutOfMemoryError:Metaspace”,元空间内存不足。