`
lovexy
  • 浏览: 821 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JVM-GC笔记(一)--- 什么对象需要回收

    博客分类:
  • GC
阅读更多
JVM对对象进行回收的前提是必须知道哪些对象是无效的,需要被回收的。
显而易见的是,需要被回收的对象就是那些已经无法访问的对象,即引用被解除的对象。

一:引用计数法
    当一个对象和一个引用关联时,此对象的引用计数递增;当此引用和对象的关联被解除时,此对象的引用计数递减。
    当对象的引用计数为0时,此对象不可用,被视作可回收。
    但是引用计数法有一个问题就是,无法处理循环引用,如下:
    A.instance = B; B.instance = A;
    但是别的任何地方都不可以访问到A,B两个对象,因为A.B互相持有对方,引用计数为1,则导致A,B都不可释放,被回收。


二:可达性分析算法(JVM采用的方式)
    从GC Roots开始递归向下查询引用,如果没有任何引用链可以抵挡此对象,此对象被视作可回收,GC Roots分别有以下几种:
    1,虚拟机栈中引用的对象,如: Object A = new Object();  此处A可作为Root
    2,方法区中类静态属性对象,即static的属性对象
    3,方法区常量引用的对象
    4,本地方法栈中JNI引用的对象


HotSpot 可达性分析实现
    首先要找出所有GC Roots,那么根据上文所说的,我们必须知道当前虚拟机栈中的引用的对象,需要遍历方法区找出所有的静态属性和常量等。
    HotSpot通过一种oopMap的数据结构在类加载的时候计算出对象内每个位置是什么数据类型来保存执行到当前指令时有那些GC Root。
    通过获取oopMap中的数据,GC可以快速枚举GC Roots, 再获取到GC Roots后,分析引用链,判断哪些对象不可达即可。
   
    使用oopMap的问题是:如上文所述,则必须每条指令处都需要一个oopMap数据结构(至少对GC Roots有影响的指令需要),那么此方法的空间成本非常高。
    解决办法:仅在特定的位置产生oopMap 如方法调用,循环开始等
    如此,当运行到有oopMap的指令时,JVM就可以开始GC了。 这样的点称为安全点

    新的问题:多线程时,如果线程A到了安全点,而线程B没到安全点。线程B到安全点了,线程A却没到,如此反复,永远都不可能达到GC的条件。
    解决办法:当需要GC时,设置一个GC标志, 当线程运行到安全点时,判断GC标志,如果为真,则挂起自身,等待GC完成


    新的问题:如果某一个线程长时间内不执行,那么会长时间内都不可到达安全点。比如sleep,获取读取大文件阻塞了。
    解决办法:如果在一段代码片段中,引用关系都不会发生变化,则在此代码片段期间GC是安全的,此区间称为安全区域
    当线程执行到安全区域时,标识自己进入安全区域,当JVM需要进行GC时,就不用理睬这些线程。当这些线程要离开安全区域时,就需要检查GC是否完成   
分享到:
评论

相关推荐

    JVM与GC调优课程视频

    JVM与GC调优课程视频 〖课程介绍〗: JVM与GC调优课程视频 〖课程目录〗: 1.笔记/ ├── 第1篇-字节码篇.png?x-oss-process=style/pnp8 ├── 第2篇-类的加载篇.png?x-oss-process=style/pnp8 ├── 第3篇-运行时...

    JAVA-JVM-全面/发展史/GC.zip

    这个压缩包“JAVA-JVM-全面/发展史/GC.zip”显然包含了关于Java、JVM、垃圾回收(GC)及其历史的深入学习资料,特别是通过“JAVA-笔记.pdf”这样的文档形式。 Java的发展史可以追溯到1991年,由Sun Microsystems的...

    马士兵jvm调优笔记.docx

    - **标记-清除算法**(Mark-Sweep):首先标记所有需要回收的对象,然后统一回收这些标记过的对象。该算法的缺点是会导致内存碎片化。 - **复制算法**(Copying):将内存分为大小相等的两块,每次只使用其中一块,...

    JVM历史发展和内存回收笔记

    6. **Java 7与G1 GC**:2011年,Java 7引入了G1(Garbage First)垃圾回收器,它是一种并行、并发且具有低延迟特性的垃圾回收器,适用于大型应用。 7. **Java 8与元空间**:2014年,Java 8中,永久代被元空间...

    JVM学习笔记

    ### JVM学习笔记 #### JVM内存模型 (JMM) JVM内存模型主要分为以下几个部分: - **Java堆**:这是所有线程共享的一块区域,在虚拟机启动时创建。主要用于存放对象实例,几乎所有的对象实例都在这里分配内存。 - *...

    jvm 调优笔记-jvm.zip

    《JVM调优笔记》 Java虚拟机(JVM)是Java...以上内容仅是JVM调优的一部分,实际调优过程需要结合应用特点和性能指标进行细致分析和实验。在实践中,理解JVM的工作原理,结合监控和日志,才能制定出合适的调优策略。

    大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G)

    大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G) 〖课程介绍〗: 来自顶尖大厂的架构师级JVM优化与GC调优策略实战课程,是具备有尖端技术的优化课程。在课程内容上几乎不用过多的介绍,单是查阅目录就...

    狂神说JVM探究.rar

    这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键知识点的详细解析: 1. **JVM概述**: - JVM是Java平台的核心组成部分,它是一个运行Java字节...

    jvm-study:jvm学习笔记

    - **GC目标**:回收无用的对象,避免内存泄露。 - **GC类型**: Minor GC(新生代GC)、Major GC(老年代GC)、Full GC。 - **GC算法**:标记-清除、复制、标记-整理、分代收集等。 - **垃圾收集器**:Serial、...

    JVM笔记(阳哥).zip

    《JVM笔记(阳哥)》是一份深入探讨Java虚拟机(JVM)的资料,由阳哥精心整理。这份笔记涵盖了JVM的基础概念、内存管理、类加载机制、性能优化等多个方面,对于理解Java程序的运行机制以及提升开发效率具有重要的...

    6.1.5.JVM终结篇笔记1

    【标题】:“6.1.5.JVM终结篇笔记1”主要探讨了JVM的深入理解和垃圾收集(GC)优化,包括GC发生时机、实验环境准备、GC日志及其分析。 【描述】:本笔记首先从宏观角度重新认识JVM,强调了JVM的物理结构,特别是...

    JVM历史发展和内存回收笔记.rar

    GC自动回收不再使用的对象所占用的内存,避免内存泄漏。现代JVM提供了多种垃圾收集器,如: 1. **Serial GC**:适用于单线程环境,简单且高效。 2. **Parallel GC**:多线程并行收集,提高吞吐量。 3. **CMS...

    JVM内存结构笔记.rar

    GC的目标是自动回收不再使用的对象,释放内存。不同的垃圾收集器如Serial、Parallel、Concurrent Mark Sweep (CMS) 和 G1,有不同的工作策略和性能特点。 JVM内存调优包括设置合适的堆大小、新生代与老年代的比例、...

    jvm学习笔记.zip

    垃圾回收(GC,Garbage Collection)是JVM自动进行内存管理的重要机制,它的目标是回收不再使用的对象所占用的内存空间。GC的主要任务是识别并清理无引用的对象,防止内存泄漏。Java提供了多种垃圾收集算法,如标记-...

    jVM学习笔记.ppt

    Java虚拟机(JVM)是Java平台的核心组成部分,它负责运行Java程序,并提供了内存管理、垃圾回收以及类加载等关键功能。JVM的学习可以从其基本结构、代码编译和执行过程,以及内存管理和垃圾回收机制三个方面进行深入...

    JVM 学习笔记(Java虚拟机)

    **JVM学习笔记(Java虚拟机)** Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序运行的平台,负责解释和执行字节码。深入理解JVM对于优化Java应用程序性能至关重要。本笔记将从以下几个方面详细介绍JVM:...

    理解虚拟机--有笔记版

    垃圾回收(Garbage Collection)是JVM中一个重要的自动化内存管理机制。它负责回收堆内存中不再使用的对象实例,从而防止内存泄漏。不同的JVM实现采用不同的垃圾回收算法,常见的算法有标记-清除、标记-整理、复制、...

    jvm原理分析课程笔记

    在压缩包中,"1JVM入门.pdf"可能涵盖了JVM的基本概念和工作流程,"2JVM浅出笔记.pdf"可能进一步解释了JVM的关键特性,"8笔记10.pdf"到"7笔记7.pdf"、"5笔记5.pdf"、"6笔记6.pdf"、"4笔记4.pdf"、"3笔记.pdf"可能分别...

    JVM的学习笔记PDF版

    10. **JVM优化实践**:包括减少Full GC次数、调整堆大小、优化字符串池、使用String.intern()、避免过度的对象创建等,都是实际开发中提升系统性能的重要手段。 这份学习笔记应该详细涵盖了这些知识点,为深入理解...

Global site tag (gtag.js) - Google Analytics