`
wangwengcn
  • 浏览: 173014 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java GC的过程

    博客分类:
  • JVM
阅读更多

一.如何判断对象“已死”,目前主要有两种主流的算法
1.引用计数算法
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就+1,当引用失效时,计数器就-1,任何时候,计数器为0的对象就是不可能再被使用的。但是这种算法很难解决对象间互相循环引用的问题:

A a = new A();
A b = new A();
b.instance = a;
a.instance = b;
a = null;
b = null;


这个时候a和b的引用计数器都还没有变成0,因此他们不能被回收。

2.根搜索算法
主流的商业语言中(Java、C#)都是使用根搜索算法(GC Roots Tracing)来判断对象是否存活的。这个算法的基本思路就是通过一系列名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。


二.JVM如何判断对象能否回收

 

上图将对象的回收条件详细的说明了。

根搜索算法找到的这些不可达对象并非是“非死不可”的,这时候它们暂时处于缓刑阶段,要真正宣告一个对象死亡,至少要经过两次标记过程:

            A、 根搜索算法找到了一个不可达对象,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize 方法。当对象没有覆盖 finalize 方法,或者 finalize 方法已经被执行过,虚拟机将这两种情况都视为没有必要执行 finalize 方法

            B、 如果这个对象有必要执行 finalize 方法,那么该对象将会被加入到一个名为 F-Queue 的队列中,并在稍后由一条虚拟机自动建立的、低优先级的线程去执行。这里所谓的执行是指虚拟机会触发这个方法,但并不承诺会等待它执行结束这样做的原因是,如果一个对象的 finalize 方法执行缓慢或者存在死循环,将可能导致队列中的其他对象永远处于等待状态,甚至导致整个内存回收系统的崩溃 Finalize 方法是对象逃脱死亡命运的最后一次机会。稍后 GC 将对 F-Queue 中的对象进行第二次小规模的标记, 如果对象在 finalize 中成功拯救自己(比如 aaa this 这种方式,重新与引用链上的任何一个对象建立关联即可),那么第二次标记时它将会被移除出“即将回收的集合”。如果它没有成功逃脱,那么它就真的离死不远了。

        任何一个对象的 finalize 方法都只会被系统调用一次,如果对象面临第二次回收,它的 finalize 将不会再次被执行。不过finalize方法运行代价高昂,不确定性大,无法保证各个对象的调用顺序。因此不建议使用它来做关闭资源之类的工作。finalize能做的所有事情,try-catch都能做的更好、更及时,我们可以完全忘掉Java中此方法的存在。

至于上图中的“执行 GC ”过程,请看接下来的垃圾收集算法篇。

  • GC.zip (44.7 KB)
  • 下载次数: 1
分享到:
评论
1 楼 lgh1992314 2018-01-21  
try with resource

相关推荐

    【java】10分钟,了解GC过程

    【java】10分钟,了解GC过程

    成为JavaGC专家(4)

    在第一篇文章成为JavaGC专家PartI—深入浅出Java垃圾回收机制中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。在第二篇文章成为JavaGC...

    成为JavaGC专家上(1)—深入浅出Java垃圾回收机制

    对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以...这是成为JavaGC专家系列文章的第一篇,本篇主要针对GC机制进行介绍,在下一篇

    成为JavaGC专家上(3)—深入浅出Java垃圾回收机制

    本文是成为JavaGC专家系列文章的第三篇。在第一篇《》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响?在第二篇《》,...

    Java后端面试问题整理.docx

    • 熟悉JVM内存区域,常用引用类型,垃圾回收机制、算法以及常见的GC垃圾收集器(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1) • 熟悉常用IO模型(BIO、NIO、AIO),熟悉JVM类加载过程与...

    华为java培训讲义

    Java的运行过程: 编译:生成可执行文件,如C++中利用g++生成a.out,效率高,但不跨平台 解释:解释器把源文件逐行解释,跨平台但效率不高 在java中:先编译后解释,把.java文件编译成.class字节码文件 Java...

    JVM体系结构与GC调优

    Java面试中必问的知识点JVM和GC调优,本PPT中详细介绍了JVM的体系结构以及Java GC的详细过程,是我目前看过的比较到位的资料

    GCViewer -1.36.

    GCViewer 1.36. 支持 JDK 1.8. 性能测试排查定位问题,分析调优过程中,会遇到要分析gc日志,人肉分析gc日志有时比较困难,相关图形化或命令行工具可以有效地帮助辅助分析。

    java基础学习笔记 java整合技术 java工具类.rar

    健壮性:java的健壮性与自动垃圾回收机制有关,自动垃圾回收机制简称GC机制,java语言运行过程中产生的垃圾是自动回收的,不需要程序员关心。 可移植性:java程序可以做到一次编译,到处运行。在Windows操作系统上...

    成为JavaGC专家上(2)—深入浅出Java垃圾回收机制

    是搞清楚JVM如何执行GC的过程,例如,我们可以查明:1.何时一个新生代中的对象被移动到老年代时,所花费的时间。2.Stop-the-world何时发生的,持续了多长时间。GC监控是为了鉴别JVM是否在高效地执行GC,以及是否有...

    Java笔试题目.doc

    数据库索引的优点和缺点 一、为什么要创建索引呢(优点)? 这是因为,创建索引可以大大提高系统的性能。 ...程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

    corejava基础重要知识点总结

    面向过程:需要人站在计算机的角度去思考问题 面向对象:需要人拿着代码模拟实现生活 类:一组类型相同事物高度抽象之后的集合概念 创建对象的模板 -》 class 对象:类的一个具体的实例 例子: 人和范冰冰...

    JAVA架构知识库整理 JAVA架构知识 Java架构师 Java 架构师必备

    MinorGC 的过程(复制->清空->互换)1: eden, servicorFrom 制到 ServicorTo, 年龄+1..2:清空eden, servicorFrom..3: ServicorTo 和 ServicorFrom互换,2.3.2. 老年代.2.3.3. 永久代2.3.3.1. JAVA8 与元数据.2.4. 垃圾...

    面向GC的Java编程

    Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题。以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象,交给GC来做吧!甚至...

    Java面试基础测试题及答案

    4、 Java的核心机制是什么?并介绍其核心机制 1、JVM和GC 2、Jvm:在一台计算机上由软件或者硬件模拟的计算机(读取字节码代码的Cpu)。...垃圾收集在程序运行的过程中自动进行,程序员无法控制和干涉

    Java自学项目,包含java例程及文档说明.rar

    第三代:Java,面向对象为编程思想,有默认的GC。 第四代:自然语言,面向问题为编程思想。 2. Java语言简介 为什么要学习Java语言? Java是使用最广泛,且用法简单的语言。 Java是一门强类型的语言(对数据类型的...

Global site tag (gtag.js) - Google Analytics