GC主要回收区域:JVM 堆
1、堆的区域划分
新生代、老年代 占用内存比例1:2
新生代
eden、from survivor、to survivor 占用内存比例8:1:1
-Xmn 设置新生代大小
-XX:survivorRatio=8 设置eden和survivor区的比例8:2。survivor分为from survivor和to survivor,并且比例是1:1,所以eden:from survivor:to survivor 的内存占比是 8:1:1
2、GC判断对象的存活
通过可达性分析算法分析对象是否存活。从GC roots的对象作为起点,从这些节点向下搜索,当一个对象到GC roots没有引用链连接时,说明该对象是不可用的,可以被回收。
GC Root的对象包括:
*静态属性引用的对象
*常量引用的对象
*虚拟机栈(栈帧中的本地变量表)中引用的对象
*本地方法栈中引用的对象
3、对象的引用
强引用
new 方式应用的对象,都是强引用
软引用(SoftReference)
内存空间足够时,GC不会回收软引用的对象;内存空间不足时,GC会回收软引用的对象。
展示图片使用内存,可以使用软引用,内存不足时,GC会回收对象引用
弱引用(WeakReference)
无论内存空间是否充足,只要GC就会被回收
ThreadLocal中使用弱引用
虚引用(PhantomReference)
4、垃圾回收算法
复制回收算法:
内存利用率低,只有50%
在新生代使用复制回收算法
默认情况下新生代的内存划分比例:一般内存中90%的对象不需要回收,10%的对象需要回收。由于新生代使用复制回收算法,内存利用率只有10%,所以新生代的20%作为复制算法的预留区域,即survivor区。eden:from survivor:to survivor=8:1:1
标记-清除算法
内存利用率100%,不需要内存复制,但是又有内存碎片
标记-整理算法
利用率100%,需要内存复制,不会有内存碎片
5、JVM内存分配原则
*对象优先放入eden区,eden区存放不下的大对象,直接进入老年区
*长期存活的对象进入老年区,一次GC,对象的对象头中存放的对象年龄+1,年龄达到15时,进入老年去
*动态对象年龄判断,一次GC后,需要存入from/to survivor区的对象超出分配的内存,from/to survivor区的对象全部进入老年区
*空间担保策略(老年区)
6、收集器
有单线程收集器和并行多线程收集器
G1
CMS
网友评论