一、分代思想(年轻代、老年代、永久代):
1、一个新人(new对象)会优先在伊甸园(Eden区)出生,当伊甸园(Eden区)人口达到最大容量时,JVM会派MinorGC去看看哪些人还有价值
2、伊甸园(Eden区)和From区中有价值的孩子会进入到To区,接着清空伊甸园和Form区,再将To区乾坤大挪移变成From区,最后将这些有价值的孩子年龄增加1岁
3、人口不断增长,JVM频繁触发minorGC,有价值的小孩年龄逐渐变大,当达到法定年龄时(默认15次)会进入老年代,过上一段相对稳定的生活
4、进入老年代并不意味着就安全了,JVM会派MajorGC去看看哪些人没有价值了,没有价值的人就被清掉了
二、可达性分析算法之对象生死判官(GC ROOTS对象):
1、虚拟机栈(本地变量表)中引用的对象
2、方法区的类静态属性引用的对象
3、方法区的常量引用的对象
4、本地方法栈JNI(Native方法)引用的对象
三、垃圾回收算法:
1、复制算法
将可用内存划分为大小相等的两块内存A、B,每次只用内存块A,当内存块A用完,将存活的对象复制到内存块B中,然后清空内存块
优点:垃圾回收后空间连续、无内存碎片、适合朝生夕死的对象
缺点:内存空间浪费、每次只能使用一半内存
2、标记清除算法
分成标记和清除两个阶段:标记出待回收的对象(可达性分析算法),清理掉所有待回收的对象
优点:不会损失50%的空间、可解决循环引用的问题
缺点:效率不高、会产生大量不连续的内存碎片
3、标记整理算法
首先标记出待回收的对象,将存活的对象都移动到一端,然后清理掉边界以外的内存
优点:不会损失50%的空间、回收后空间连续
缺点:效率不高
四、JVM参数:
-server JVM使用server模式(采用相对重量级,代号为C2的编译器. C2比C1编译器编译的相对彻底,服务起来之后,性能更高)
-Xms2048m 堆的最小值
-Xmx2048m 堆的最大值
-XX:PermSize=128M 方法区的大小
-XX:MaxDirectMemorySize=2048m 本机直接内存
-XX:MaxTenuringThreshold=15 晋升老年代的年龄
-XX:NewRatio=1 年轻代和老年代的比值
-XX:+UseConcMarkSweepGC 使用ParNew + CMS + Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备收集器使用
-XX:CMSInitiatingOccupancyFraction=75 设置CMS收集器在老年代空间被使用多少后触发
-XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间
-XX:+PrintGCDetails 打印GC详细日志
-XX:+HeapDumpOnOutOfMemoryError JVM异常自动生成堆转储
-XX:HeapDumpPath= 堆转储文件名
-XX:-OmitStackTraceInFastThrow 禁用堆栈异常优化
-XX:-UseBiasedLocking 禁用偏向锁(在存在大量锁对象的创建并高度并发的环境下禁用偏向锁能够带来一定的性能优化)
-XX:AutoBoxCacheMax=20000 自动装箱和拆箱范围设置(节省了常用数值的内存开销和创建对象的开销,提高了效率)
-XX:+CMSParallelInitialMarkEnabled 开启初始标记过程中的并行化,进一步提升初始化标记效率