jvm垃圾回收算法和垃圾回收器,jvm常用的垃圾收集算法
如何解决写爬虫IP受阻的问题?立即使用。
本教程运行环境:windows7系统,java8版本8,DELL G3电脑。
JVM垃圾回收算法
两个概念:
新生代:存放生命周期短的物体的区域。
年龄:存储生命周期长的对象的区域。
相同点: 都在Java堆上
1.标记清除算法
执行步骤:
标记:遍历内存区域,标记要回收的对象。清除:再次遍历内存以回收标记的内存。图解:
缺点:
效率问题;遍历内存空间两次(第一次标记,第二次清除)。空间问题:容易产生大量的内存碎片。当需要更大的内存时,找不到符合要求的,只好重新启动GC。2.复制算法
将内存分成两个相等的块,一次只使用其中一个。当一个块用完,触发了GC,这个块中幸存的对象就被复制到另一个块区域,然后这个无用的内存就被一次性清空了。下一次GC被触发时,该块中幸存的将被复制到该块,然后该块将被擦除,循环将被重复。
图解:
优点
相对标记-清理算法解决了内存碎片问题。更高效(清理内存时,记住起始和结束地址,一次性擦除)。缺点:
内存利用率不高,一次只能用一半的内存。改进
研究表明,新生代的大多数物体都是“朝生暮死”,即生命周期很短,寿命越长的物体越难被回收。当GC发生时,需要回收的对象非常多,存活下来的非常少,所以需要移动到另一个内存的对象非常少,所以不需要1: 1划分内存空间。而是把整个新生代按照8: 1: 1的比例分成三个区块,最大的叫伊甸,较小的分别叫to幸存者和From幸存者。
第一次,GC只需要将Eden的幸存对象复制到。然后伊甸园区域整体回收。再次在GC中,将Eden和To复制到From,重复这个过程。这样每个新一代可用内存占整个新一代的90%,大大提高了内存利用率。【相关推荐:Java视频教程】
但不能保证每次存活下来的对象数量永远少于整个新一代的10%。这时候复制过去就保存不下去了,所以这里会用另一块内存,叫做老年,来保证分配,把对象存储到老年。不够就扔OOM。
Age:存储新生代(默认15次)多次回收后仍然存活的对象。
3. 标记整理算法
因为之前的复制算法,在对象存活率比较高的时候,不停的一遍一遍的复制,没有意义,浪费时间。因此,针对老龄问题,提出了一种“标记排序”算法。
执行步骤:
标记:对需要回收的对象进行标记和排序:让幸存的对象移到内存的一端,然后直接清理无用的内存。图解:
4. 分代收集算法
目前大部分商用虚拟机都采用这种代收集算法。这个算法没有新的内容,只是根据对象的存活时间将内存分为新生代和老一代,以便针对不同的区域采用相应的算法。比如:
在新世代中,每次都有大量对象死亡,以旧时代作为内存保障,采用复制算法。年龄,对象存活时间长,可以用mark排序,也可以用mark算法清理。MinorGC和FullGC的区别
MinorGC:垃圾收集发生在新生代。因为新生代的特点,MinorGC很频繁,回收速度也比较快,每次回收的量也很大。
FullGC:垃圾收集,又称MajorGC,发生在旧时代,比较慢,比MinorGc慢10倍左右。一个FullGC通常伴随着多个MinorGC,
有关编程的更多信息,请访问:编程视频!以上是jvm垃圾收集算法的细节。更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。