内存分配和回收

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

内存分配和回收_第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

你可能感兴趣的:(内存分配和回收)