- JAVA堆内存组成
- JVM中三种常见的垃圾收集算法?
- 标记-清除算法?
- 复制算法?
- 标记整理算法?
JAVA堆内存组成
堆大小=新生代+老年代。如果是Jav a8则没有Permanent Generation。
其中新生代(Young)被分为Eden和S0 (from)和S1(to)。默认比例是:Edem : from: to=8 : 1 : 1
- 标记-清除算法(Mark_ Sweep)
- 复制算法(Copying)
- 标记-压缩算法(Mark-Compact)
首先标记出所有需要回收的对象,在标记完成后统一回收掉所有的被标记对象。
缺点:
- 标记和清除的效率都不高。
- 空间问题, 清除后产生大量不连续的内存随便。如果有大对象会出现空间不够的现象从而不得不提前触发另一次垃圾收集动作。
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块内存用完了,就将还存
活的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
优点:
- 解决了内存碎片问题。
缺点:
- 将原来的内存缩小为原来的一半,存活对象越多效率越低。
先标记出要被回收的对象,然后让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。解决了复制算法和标记清理算法的问题。



