文档章节

JVM学习(2)-JVM垃圾回收算法

haoran_10
 haoran_10
发布于 2016/07/15 16:37
字数 814
阅读 8
收藏 0

java虚拟回收垃圾对象时,一份分为两步:

1、虚拟机在回收堆空间在之间,会先判断哪些对象已经死亡;

2、然后再对这些死亡对象通过特定的回收算法进行回收

 

一、判断对象是否死亡

1、引用计算器算法

给对象添加一个引用计算器,如果其他地方引用它,计算器就加1,当引用失效时,计算器就减1。当计算器为0时,这个对象不能被再次使用,需要被回收了。

优点:实现简单

缺点:不能解决对象之间相互循环引用的问题。

 

2、根搜索算法GC Roots Tracing

通过一系列的名为GC Roots作为对象为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连,也就是不可达(图论中迪杰斯特拉算法),证明此对象是不可用的。

在java语言里,可作为GC Roots的对象包括以下几种:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中的类静态属性引用的对象
  • 方法区中的常量引用的对象
  • 本地方法栈中JNI(即一般说的Native方法)的引用的对象

ps:会进行二次判断,在判断对象为死亡对象后,虚拟机会吧对象放到F-QUEUE队列里,然后启动一个线程去扫描,如果发现扫描后依然没有被引用,那么就直接回收了。

 

 

二、垃圾回收算法

1、标记-清除算法

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

缺点:效率低,造成碎片比较多

 

2、复制算法

把可用内存分为相等的两份,每次只是用一块。当这一块内存用完了,就把所有的存活的对象都复制到另外一份内存块中,然后一次性全部把这块内存清除掉。

现在很多虚拟机就是采用这种方式回收新生代。新生代分为一块大的Eden空间,和两块小的Survivor空间,每次使用Eden和其中的一块Survivor。当回收时,把Eden和Survivor还存活的对象一次性全部拷贝到另外一块Survivor空间上,最后清理掉Eden和刚才使用的Survivor空间。如果Survivor空间不够时,会向老年代进行借一部分内存。

优点:简单高效,碎片率也比较低。

 

3、标记-整理算法

如果存活率比较高,那么使用复制算法就不适用。

把所有的存活对象都往前端转移,然后直接清理掉端边界以外的内容。 

针对老年代使用。

 

4、分代收集算法

现在的虚拟机一般都是采用这种方式。

把java堆分为新生代和老年代,新生代则采用复制算法,老年代则采用标记-整理算法。

 

© 著作权归作者所有

共有 人打赏支持
haoran_10
粉丝 25
博文 88
码字总数 80846
作品 0
杭州
程序员
私信 提问
Java虚拟机必学之四大知识要点你掌握了吗?

作为一位 Java 程序员,在尽情享受 Java 虚拟机带来好处的同时,我们还应该去了解和思考“这些技术特性是如何实现的”,去了解最底层的原理。只有熟悉 JVM,你才能在遇到 OutOfMemory 等异常...

Java干货分享
10/17
0
0
面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb
05/12
0
0
Java GC系列:Java垃圾回收详解

Java的内存分配与回收全部由JVM垃圾回收进程自动完成。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。 ...

满风
2015/04/10
0
0
My java——JVM(垃圾回收)四

续My java——JVM(内存域) 中讲述了Java在JVM中的内存使用,其实在我们出来java程序时基本上有两个地方的内存处理 一是栈、二是堆,JVM会自动回收堆中的内存,也就我们所说的垃圾回收,那J...

tngou
2013/03/20
0
0
JVM性能优化, Part 1 ―― JVM简介

众所周知,Java应用程序是运行在JVM上的,但是你对JVM有所了解么?作为这个系列文章的第一篇,本文将对经典Java虚拟机的运行机制做简单介绍,内容包括“一次编写,到处运行”的利弊、垃圾回收...

梁杰_Jack
2014/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安卓的切图规范

Android UI 切图命名规范、标注规范及单位描述 很多UI设计师做APP切图都会有两套,一套是Android的,一套是IOS的。IOS我这边暂不作讲解,因为我本人也不是开发IOS。这里整理一下我在Android...

mo311
30分钟前
2
0
深度剖析阿里巴巴对Flink的优化与改进

摘要: 作者 | 阿里巴巴实时计算团队 导读:随着人工智能时代的降临,数据量的爆发,阿里巴巴的商品数据处理就经常需要面对增量和全量两套不同的业务流程问题,所以阿里巴巴就在想:能不能有...

阿里云官方博客
31分钟前
2
0
Dubbo基础介绍

Dubbo是一个常用的分布式服务框架, 它致力于提供高性能、透明化的RPC远程服务方案。 学习Dubbo有助于提高企业级应用的开发效率,以及可通过简单的配置就可以实现负载均衡,提高服务的效率。...

Java搬砖工程师
42分钟前
4
0
VBS 自动登陆

1.关于网页元素属性 IE浏览器打开网页时,有很多元素,比如说一个文本框,一个按键等。每个元素都会有对应的“name”、“ID”,“style”,“class”等属性。 其中的“ID”和“name”属性是我...

宝贝女儿
46分钟前
1
0
GO 文件相关操作

package mainimport("fmt""os""bufio""io""io/ioutil")type ChartCount struct{Chct intSpacect intNumberct intOtherct int}func main() {file,err := os.Open......

汤汤圆圆
48分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部