JVM GC时堆内存中新生代的复制算法

来源:互联网 发布:什么是编程范式 编辑:程序博客网 时间:2024/05/29 13:15

JVM GC过程中新生代的复制算法

JVM虚拟机中对内存进行回收主要就是对堆内存的回收,heap区把堆内存分为新生代和旧生代
- 新生代:主要存放新new出来的对象
- 旧生代:在新生代中经过多次回收都没有被回收掉的对象就会放入旧生代,默认16次

1.为什么要划分出新生代和旧生代

在JVM 进行内存回收的时候jvm每次都对所有内存空间做查找回收,显然是很低效的事情,所以JVM将堆内存划分出一块新生代,将新创建的对象都放在里面,内存满了就在新生代中做GC。这样可以提高回收效率。

2.新生代内的区域划分

新生代作为内存回收的重点区域,是被垃圾回收器光顾频率最高的地方,没有两把刷子怎么能做好工作,新生代又分为Eden区和Survivor区,只从名字我们也能看出个123。
- Eden:伊甸园,亚当和夏娃啪啪造人的地方,很明显,新对象肯定放在这里
- Survivor:幸存者区,那些没有被回收掉的对象肯定是放在这里了

当然事情肯定没这么简单…

  1. Survivor做不做回收,如果不做回收,那它里面的对象岂不是经过一次GC就高枕无忧了,所以回收肯定是要做的
  2. 如果Survivor做了回收,有的对象被回收掉了,新的对象被加入进来,每个对象所用的空间又不是一样的,这样就会产生内存碎片

…..艹,你想怎么样

所以Survivor区又划分为两个大小一样的部分,FromSpace和ToSpace。

3.新生代内存回收的复制算法

好了,做了那么多铺垫,本文的重点来了!!!
从前面我们知道新生代被分为Enden和Survivor区,而Survivor区又分为两个大小完全一样的部分。
复制回收算法很简单就是两步
1. 把Enden区和Survivor中有内容的那一部分不被回收的对象,复制存入Survivor中没有内容的那一部分
2. 把Enden区和Survivor中的FromSpace清空。一次回收就完成了,此时一开始Survivor中有内容的那一部分变为没有内容的那一部分,没有内容的那一部分变成有内容的那一部分(这一句要好好理解,很多同学因为这一点没想通,一直不太理解。不要问我为什么(┬_┬))

好了,这样就搞定了,还不会存在内存碎片。当下一次GC时重复执行第一步和第二步就可以了。


原创粉丝点击