9、Gc(复制算法)

Gc(复制算法)

  1. 首先理解谁是from,谁是to区。他们是一个动态的概念(谁空谁是to(他们的空间位置并未改变。只是在装取数据后,名称会动态改变,to区永远是空的))
  2. 每次gc都会将Eden区中活的对象移到幸存区中(首先Eden一旦被轻gc那么这个Eden就会是空的(垃圾被回收了,活的对象被移动到幸存者区了))
  3. 假如最开始上面为from区,下面为to区。Gc后发现to区有空间可以存放活的对象1,那么就将对象1放进to区了。而这时from和to区的名称就发生改变了。上面from为空的嘛。所以这个装对象的to就变为from区咯。(他们在不断的转换)。

9、Gc(复制算法)_第1张图片

 

9、Gc(复制算法)_第2张图片

 

  1. 思考一个场景二:其中的to和from都有一个对象了,但是我们必须保证一个空的to区,那么就随意去复制to或from的对象。那么一个就为2一个为空,那么空的就为to区了,2的为from区。

9、Gc(复制算法)_第3张图片

 

9、Gc(复制算法)_第4张图片

 

(默认)一个对象经历了15次Gc还存活的话就会进入老年区(也是可以调节次数的)

 

新生代(主要使用的就是复制算法(就是我们上面说的from/to区的复制))

9、Gc(复制算法)_第5张图片

 

第一步:场景to区为空,from有一个对象。Eden有活的对象那么首先会进入其to区(其中from的对象也会进入to区)

9、Gc(复制算法)_第6张图片

 

第二步:(Eden活对象进入to区,下面from区对象也进入to区,这是to区就变为from区咯,from变为空的to区了)(每次gc,其中的Eden和To区都是空的)

9、Gc(复制算法)_第7张图片

 

第三步:多次gc后超过15次还存活那么就进入老年区了,未存活就gc

9、Gc(复制算法)_第8张图片

 

*好处:没有没有内存碎片

*坏处:浪费了内存空间(一个to区永远是空的)假若所有的对象100%存活的话(极端情况就出现弊端了(都要去复制一次))

复制算法的最佳使用场景就是:对象存活度比较低(新生区咯(基本99%都活不到老年区))

你可能感兴趣的:(Jvm,jvm,java,算法)