JVM架构(009)_什么是新生代的复制算法

转载 2016年08月29日 16:49:43

1、什么是新生代的复制算法

了解堆内存看这里:java堆内存是什么样的 
了解java垃圾回收看这里:java垃圾回收机制是什么 
所谓复制算法(Copying),即将内存平均分成A区、B区两块,进行复制+清除垃圾的操作,算法图解如下:

这里写图片描述

算法过程:

  1. 新生对象被分配到A块中未使用的内存当中。当A块的内存用完了, 把A块的存活对象复制到B块
  2. 清理A块所有对象
  3. 新生对象被分配到B块中未使用的内存当中。当B块的内存用完了, 把B块的存活对象复制到A块
  4. 清理B块所有对象
  5. 循环1。

这种算法简单高效,但是内存代价极高,有效内存只为总内存的一半,会浪费掉50%的空间。所以这种算法只是纸面算法,不具备可用性,一般来说都会使用优化的复制算法

2、什么是优化的复制算法

所谓优化的复制算法,即在复制算法的基础上,使用三个分区(Eden/S0/S1)进行处理,算法图解如下:

这里写图片描述

Eden/S0/S1默认空间比例Eden:S0:S1为8:1:1,有效内存(即可分配新生对象的内存)是总内存的90%

算法过程:

  1. Eden+S0可分配新生对象;
  2. 对Eden+S0进行垃圾收集,存活对象复制到S1清理Eden+S0。一次新生代GC结束。
  3. Eden+S1可分配新生对象;
  4. 对Eden+S1进行垃圾收集,存活对象复制到S0清理Eden+S1。二次新生代GC结束。
  5. 循环1。

我们可以看出,如果Eden/S0/S1三个空间的比例为8:1:1,则可能会出现Eden+S0中存活对象超过了总空间的10%(S1、S0的空间都是总空间的10%),在这种情况下,新生代GC会将存活周期长的对象直接放入老生代,而无需达到我们设置的阈值(转入老生代的存活次数,-XX:MaxTenuringThreshold)。

当然,这种情况在正常情况下不会出现(除非特殊场景,或者程序设计问题)。IBM的专门研究表明,新生代中的对象98%是朝生夕死的,所以8:1:1的比例是十分合理的。(每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的内存是会被浪费的)。

相关文章推荐

Java千百问_07JVM架构(009)_什么是新生代的复制算法

所谓复制算法(Copying),即将内存平均分成A区、B区两块,进行复制+清除垃圾的操作,算法图解如下:算法过程: 新生对象被分配到A块中未使用的内存当中。当A块的内存用完了, 把A块的存活对象复制到...

JVM垃圾收集算法(复制算法)----关于 新生代老年代

转:http://www.cnblogs.com/E-star/p/5556188.html 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可...

JVM实用参数-新生代垃圾回收算法

转载地址:http://ifeve.com/useful-jvm-flags-part-5-young-generation-garbage-collection/ 本部分,我们将关...

JVM的GC机制<一>新生代GC

JVM的GC机制面试后有空再写。做好一件事不容易。 Ref: 官方gc collector说明:http://www.oracle.com/webfolder/technetwork/tu...

对JVM中垃圾回收机制的个人理解--新生代,老年代,永久代

就想通过这个方式看看自己看完一遍书后还记得什么... 不管怎么样要先来个帅气的开场白:有错的地方请多指正,3q!!!!!!!!!!!!!!!!!!!!!!! 在堆中,新生代主要存放的是哪些很快就会被G...

JVM 调优 —— 新生代 Survivor 空间不足

零. 新生代调优规律 增大新生代空间, Minor GC 频率减少, Minor GC 时间上升。 减少新生代空间, Minor GC 频率上升, Minor GC 时间下降 一....

JVM 新生代老年代

1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的...
  • xiaoaza
  • xiaoaza
  • 2017年01月09日 09:32
  • 54

JVM gc只新生代串行GC

1.代码一: public class JVMTest { public static void main(String args[]) throws InterruptedExce...

根据应用程序设置JVM参数(一)-设置堆、新生代、老年代、持久代大小

一、根据程序的运行状况查看其活跃的数据量 ①、活跃的数据: 1.应用程序运行于稳定状态时,老年代占用的java堆大小 2.应用程序运行于稳定状态时,永久代占用的java堆大小 其实就是Full...

jvm java虚拟机 新生代的配置

1.1.1.1. -Xmn参数 参数-Xmn1m可以用于设置新生代的大小。设置一个较大的新生代会影响老生代的大小,因为这两者的总和是一定的,这个系统参数对于系统性能以及GC行为有很大的影响,新生代一般...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM架构(009)_什么是新生代的复制算法
举报原因:
原因补充:

(最多只允许输入30个字)