`
wangwengcn
  • 浏览: 175132 次
  • 性别: 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 GC与性能调优

    Java GC与性能调优 Java GC与性能调优是 Java programming language 中非常重要的一部分,直接影响着 Java application 的性能。本文档将对 Java GC 与性能调优进行详细的介绍。 一、 Java 平台的逻辑结构 Java ...

    Java_GC垃圾回收调优指南

    在Java开发过程中,垃圾回收(Garbage Collection, GC)是管理内存资源的关键技术之一。合理的GC配置可以显著提高应用程序的性能和稳定性。本指南旨在帮助开发者深入理解Java GC的工作原理,并提供一系列调优策略与...

    Java基础[Java基础]--Java GC工作原理

    在Java中,GC的存在极大地简化了内存管理过程,减少了由程序员手动管理内存可能导致的内存泄漏等问题。Java虚拟机(JVM)中的GC机制会定期检查堆内存中的对象,判断它们是否仍处于活动状态。如果某个对象不再被任何...

    Java GC 专题

    Java垃圾收集(GC)专题针对的是Java编程语言中内存管理机制的重要组成部分。Java自1996年推出以来,其最大的改进之一就是引入了受管内存。在Java之前,C和C++语言中的内存泄漏问题十分常见,这导致开发稳定和安全的...

    成为JavaGC专家PartII-如何监控Java垃圾回收

    在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项至关重要的机制,它自动管理内存,释放不再使用的对象,防止内存泄漏。本篇将深入探讨如何监控Java的垃圾回收,帮助开发者提升应用性能和稳定性。 Java...

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

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

    Java GC的副本.pptx

    3. **如何执行GC**:GC的执行过程包括标记、扫描和清理三个阶段。首先,GC会标记出所有活动对象;然后,扫描并回收未被标记的对象;最后,整理剩余对象的空间,确保内存空间的连续性。 Java内存区域分为多个部分,...

    gcviewer监控gc工具

    GCViewer是基于Java Swing的GUI应用,由Chris Newland开发,它能够解析并可视化JVM生成的GC日志,提供丰富的图表展示GC活动,如GC时间、堆内存使用情况、对象生存周期等,帮助开发者深入了解JVM内部的垃圾收集过程。...

    JavaGC专家指南.pdf

    JavaGC(垃圾回收)是JVM中负责回收不再使用的对象,释放内存的过程。垃圾回收机制帮助Java开发者不用手动管理内存,减少了内存泄漏和指针错误的可能性。Java虚拟机的垃圾回收机制分为多种不同的算法,比如标记-清除...

    jvm 参数及gc详解

    Java虚拟机(JVM)是Java程序运行的基础,它的配置参数和垃圾收集(GC)机制对于优化应用程序性能至关重要。本文将深入探讨JVM参数及其与Java垃圾收集相关的知识。 一、JVM参数详解 JVM参数可以分为三类:启动参数...

    JavaGC调优基础.pdf

    总之,Java GC调优是一个复杂而细致的过程,需要综合考虑多个因素,包括但不限于堆大小、操作系统资源、JVM版本、GC策略和应用特性。通过合理的调优,可以有效地提升Java应用的性能,降低系统资源的消耗。

    成为JavaGC专家(4)

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

    Java GC笔记总纲1

    Java垃圾收集(GC)是Java编程中至关重要的一个部分,它自动管理程序的内存,以避免内存泄漏和系统资源耗尽。以下是对标题和描述中提及的知识点的详细阐述: ### 1. 基础知识 #### 1.1 常见的内存溢出 内存溢出是...

    JAVA GC 与 JVM调优1

    GC过程就是从这些根节点出发,遍历所有可达的对象,不可达的对象被视为垃圾。 Java提供了四种不同类型的引用,以满足不同场景的需求: 1. **强引用**(Strong Reference):这是最常见的引用类型,只要强引用存在...

    java jstat 查看哪个进程频繁GC垃圾回收

    在Java应用程序运行过程中,如果发现并回收不再使用的对象,可以防止内存泄漏,确保程序稳定运行。当我们遇到应用程序性能下降或者内存消耗过快的问题时,就需要关注哪个进程在频繁进行GC操作。下面我们将详细探讨...

    Java服务GC参数调优案例1

    JVM 和 GC 相关参数、问题解决过程、排除应用程序的内存使用问题、排除 Cache 内容过多的问题、调整 GC 时间点、调整对象在年轻代内存中驻留的时间、CMS Remark之前强制进行年轻代的 GC 等几个方面详细介绍Java服务...

    java垃圾回收(gc)机制详解

    本文将深入探讨Java GC的工作原理、类型、过程以及优化策略。 一、Java垃圾回收的起源与目的 在C++等语言中,程序员需要手动管理内存,分配和释放内存空间。而在Java中,引入了垃圾回收机制,自动处理这些任务,...

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

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

Global site tag (gtag.js) - Google Analytics