Java虚拟机--垃圾收集算法和垃圾收集器

上一篇:Java虚拟机--对象回收

垃圾收集算法:

标记-清除法:

分为标记和清除两个阶段:首先标记所有需要回收的对象,在标记完成后统一回收被标记的对象。

主要不足:

  1. 效率问题:标记和清除两个过程的效率都不高;
  2. 空间问题:标记清除后会产生大量不连续的内存碎片。

复制算法:

将内存划分成大小相等的两块,每次只使用其中的一块。当这一块内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的那块内存一次性的清理掉。

  • 优点:不必考虑内存碎片问题,实现简单,运行高效;
  • 缺点:将内存缩小为了原来的一半代价太高。

改善办法:IBM公司研究表明98%的对象都是“朝生暮死”的。所以不需要按1:1分配空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和一块Survivor。当回收时,将Eden和Survivor中还存活的对象复制到另一块Survivor中,然后清理掉原来的内存。通常Eden和Survivor的空间比例为8:1。

当然,没有办法保证每次回收都只有不到10%的对象存活,当Survivor空间不够用时,需要依赖其他内存(年老代)进行分配担保----如果Survivor没有足够的空间收集存活的对象,这些对象直接进入年老代。

标记-整理法:

标记过程和标记清理法过程相同,但后续步骤不直接进行清除,而是让所有对象都像一端移动,然后直接清理掉端边界以外的内存。

分代收集算法:

根据对象的存活周期将内存分为几块,Java一般分为新生代和年老代,这样就可以根据各个代的不同特点采用最合适的收集算法。一般新生代采用复制算法,年老代采用标记清除法或标记整理法。

算法实现:

枚举根结点:使用准确式GC进行根结点收集,HotSpot中是用一组称为OopMap实现的。

安全点:程序执行时不是在所有地方都可以停下来进行GC,只有在达到安全点时才能暂停。在GC发生时让所有线程都在安全点暂停有两种方式:抢先式中断和主动式中断。

安全区域:安全区域是指在一段代码中,引用关系不会发生变化。在这个区域中的任何地方开始GC都是安全的。

垃圾收集器:

Serial收集器:https://blog.csdn.net/ffm83/article/details/42872571

ParNew收集器:https://blog.csdn.net/ffm83/article/details/42872629

Parallel Scavenge收集器:https://blog.csdn.net/ffm83/article/details/42872661

Serial Old收集器:https://blog.csdn.net/ffm83/article/details/42874581

Parallel Old收集器:https://blog.csdn.net/ffm83/article/details/42874627

CMS收集器:https://blog.csdn.net/mark__zeng/article/details/48751053

G1收集器:https://blog.csdn.net/qq_34280276/article/details/52863551

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我就是马云飞

Java 垃圾回收机制

自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未...

964
来自专栏JAVA高级架构

面试重点:Java虚拟机常见问题详解

一、Java引用的四种状态: 强引用: 用的最广。我们平时写代码时,new一个Object存放在堆内存,然后用一个引用指向它,这就是强引用。 如果一个对象具有强...

3198
来自专栏lgp20151222

Java虚拟机详解----JVM常见问题总结

文章来源:http://www.cnblogs.com/smyhvae/p/4810168.html

842
来自专栏java达人

Java垃圾回收机制

垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部...

2025
来自专栏阿杜的世界

Java Web技术经验总结(十)

在遇到“java.lang.OutOfMemoryError”错误时,首先需要根据MAT工具确认是内存泄漏还是内存溢出。

972
来自专栏Android 研究

Java虚拟机基础——4内存回收机制

在Java中,它的内存管理包括两方面:内存分配(创建Java的时候)和内存回收,和C不同,这方面读是由JVM来完成的,避免了C/C++直接操作的风险,同时也降低...

692
来自专栏Android开发实战

深入解析Java垃圾回收机制

程序计数器、 虚拟机栈、 本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。 每一个栈帧中分配多少内存基...

1032
来自专栏码匠的流水账

聊聊sentinel的SimpleHttpCommandCenter

sentinel-transport-simple-http-0.1.1-sources.jar!/com/alibaba/csp/sentinel/trans...

801
来自专栏用户2442861的专栏

LT【深入Java虚拟机】之八:Java垃圾收集机制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/18076173

761
来自专栏desperate633

深入解析Java垃圾回收机制引入垃圾回收哪些内存需要回收?如何回收为什么需要分代收集?JVM的分代分代垃圾收集过程详述

自动垃圾回收机制就是寻找Java堆中的对象,并对对象进行分类判别,寻找出正在使用的对象和已经不会使用的对象,然后把那些不会使用的对象从堆上清除。 自动垃圾回收...

631

扫码关注云+社区