目录
深入JVM 原理(一)Java内存模型:https://blog.csdn.net/qq_39827935/article/details/81285009
深入JVM原理(二)Java对象访问模式:https://blog.csdn.net/qq_39827935/article/details/81285038
深入JVM原理(三)JVM 垃圾收集:https://blog.csdn.net/qq_39827935/article/details/81285059
深入JVM原理(四)JVM垃圾回收流程:https://blog.csdn.net/qq_39827935/article/details/81285084
深入JVM原理(五)Java堆内存调整参数(调优关键):https://blog.csdn.net/qq_39827935/article/details/81285099
深入JVM原理(六)年轻代:https://blog.csdn.net/qq_39827935/article/details/81285115
深入JVM原理(七)老年代、永久代和元空间:https://blog.csdn.net/qq_39827935/article/details/81285133
深入JVM原理(八)JVM垃圾回收策略:https://blog.csdn.net/qq_39827935/article/details/81285156
深入JVM原理(九)JVM垃圾回收策略参数配置:https://blog.csdn.net/qq_39827935/article/details/81285175
深入JVM原理(十)G1收集器:https://blog.csdn.net/qq_39827935/article/details/81285207
深入JVM原理(十一)Java引用类型:https://blog.csdn.net/qq_39827935/article/details/81285227
老年代
老年代主要接收由年轻代发送过来的对象,一般情况下,经过了数次Minor GC 之后还会保存下来的对象才会进入到老年代。如果要保存的对象超过了伊甸园区的大小,此对象也将直接保存在老年代之中,当老年代内存不足时,将引发 “major GC”,即,“Full GC”。
在老年代里面会采用两种算法结合的模式实现GC的处理:整理-压缩。
在回收清除的过程之中,发现所有在老年代中被回收的对象并没有进行空间的整理,所以老年代最头疼的就是碎片化问题。
以后再进行老年代存储的时候尽可能保存长期会被使用的对象,并且不会被轻易回收的大对象。
范例:设置老年代参数(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 问题。
一般情况下不会出现这种问题;
-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.0
元空间
元空间是JDK 1.8 之后才有的,功能和永久代类似。唯一到的区别是,永久代使用的是JVM的堆内存空间,而元空间使用的是物理内存,直接受到本机的物理内存限制。
范例“设置一些参数,让元空间出错(java -XX:MaxMetaspaceSize=1m XX:MetaspaceSize=1m TestDemo)
此时会报出“OutOfMemoryError:Metaspace”,元空间内存不足。