1.2 何时回收
前一章节已经明确了,在对象没有被引用的情况下,对象"可能"就要被回收了.
那么,我们怎么知道对象就没有引用了?当然,这里涉及到了算法.
我们介绍两种常用的算法实现:引用计数算法(Reference Counting Algorithm),可达性分析算法(Reachability Analysis Algorithm)
1.2.1 引用计数算法(Reference Counting Algorithm)
①对于引用计数算法,根据字面含义我们也能猜个八九不离十.所谓引用计数算法,就是建立一个与对象引用关联的计数器,在对象每次被引用的时候,计数器值+1,在引用指向作废时,计数器值-1.当计数器值为0时,表示该对象可以被回收了.
大家看的最多的估计就是周志明的深入理解Java虚拟机,里面只是提了一句面试时候大家都在说的一种说法:"给对象中添加一个引用计数器.....".
其实,这种说法有点片面,为什么这么说,因为引用计数器的实现有两种方式,一种是嵌入式(也可以叫侵入式),把引用计数器直接嵌入到对象内部.一种是非嵌入式(也可以叫非侵入式),就是另外开辟一块内存区域,专门存放对象的
引用计数器.
这里要提一句,目前主流的虚拟机基本没有采用引用计数算法去标记对象是否可以被回收(Python的内存管理机制使用了此种算法,还有Redis中).为什么没有被使用,最重要的原因在于使用引用计数算法可能会出现循环引用(A指向B,B又指向A)的对象不能被回收.
②怎么解决引用计数法中的循环引用对象没法回收的问题?
在知乎上,有人在面试时候被这么问.解答中分为三类,一类是避免使用循环引用,一类是在程序中使用弱引用代替强引用,一类是使用引用计算算法为主的垃圾收集器+辅助的使用"标记-清除"算法的tracing GC垃圾收集器去专门回收循环引用的对象.我们可以作为参考答案.
1.2.2 可达性分析算法(Reachability Analysis Algorithm)
①可达性分析算法,按照字面意思,就是分析对象通过某条线路是否还能到达这个对象.这里的线路就是引用链(Reference Chain),如A引用B,B引用C,从A开始寻找C,A-->B-->C这条线路就是引用链.
但是,分析总得有个开头,这个头就是我们可达性分析算法中的"GC Roots"对象.
合起来就是,我们通过"GC Roots"对象作为起点,向下搜索,只要通过引用链能找到对应的对象,那么这个对象就是可达的(也就是这个对象还被引用着,没有挂了).
②大家可能又会问,啥对象能做"GC Roots"对象啊?一般的,可以作为GC Roots对象的有那么4种:
一是在Java虚拟栈中,实际上是栈帧中的局部变量表中的reference类型(引用类型)引用的对象;
二是在类中定义的静态变量引用的对象(如public static String A="a";).
三是在方法区中常量引用的对象
四是在本地方法栈中本地方法调用(JNI,Java Native Invocation)中引用的对象.
另外补充一点,我们在1.2开头并没有说对象没有被引用就要被回收,而是用了"可能",为什么?
因为对象在没有引用的情况下,要经过标记和筛选过程才能确定对象是否要被回收.
第一次标记和筛选的过程:标记这个对象没有被引用了(无论使用哪种算法),但是是否要要回收还要看这个对象有没有重写Object类的finalize()方法或者finalize()方法是否被虚拟机调用过.如果对象没有重写finalize()或者已经执行过,那么此对象就要被回收了.
如果在筛选过程中,发现对象没有执行过finalize()方法且不存在被引用的情况,那么这个对象会被放在F-Quene队列中等待执行finalize()方法,而虚拟机会创建一个低优先级的名为Fianalier线程去执行.
第二次标记筛选的过程:当对象被放入F-Quene后,垃圾收集器会进行第二次标记,看是否有对象逃脱,这里说的逃脱就是有了新的引用.没有被重新引用的对象,将被回收.在F-Quene中逃脱的对象,在再次引用为0的时候,将直接回收.这点要注意.
相关推荐
自己学习总结JVM垃圾回收机制的结构图,一起分享!!!
我们通过深入探讨以下几个关键点来理解JVM垃圾回收机制的工作原理: 1. 如何确定某个对象是“垃圾”? JVM垃圾回收机制通过两种主要算法来确定对象是否成为垃圾,即“可达性分析算法”和“引用计数法”。 - 可达性...
Java虚拟机(JVM)的垃圾回收(GC)机制是Java程序高效运行的关键部分,它自动管理内存,释放不再使用的对象以避免内存泄漏。本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用...
Java虚拟机(JVM)内存模型和垃圾回收机制是Java开发中至关重要的概念。本文将深入探讨这两个主题,帮助理解JVM如何管理和优化内存。 **一、类加载器和双亲委派机制** 类加载器是JVM的一个组成部分,负责加载Java...
### JVM工作原理及垃圾回收机制详解 #### 一、JVM概述及原理 **1.1 JVM概述** Java Virtual Machine (JVM),即Java虚拟机,是一种虚构的计算机,在实际的计算机硬件上仿真模拟出的一套完整的计算机系统,用于执行...
理解并优化JVM的垃圾回收机制对于提升Java应用的性能至关重要。 一、垃圾回收的基本概念 1. 对象生命周期:当一个对象被创建后,它会经历新生、壮年、老年代等阶段。垃圾回收主要关注的是不再被引用的对象,即...
本文将深入探讨JVM的垃圾回收机制,包括其原理、类型以及在实际开发中的应用。 一、垃圾回收的原理 1. 对象引用计数:一种简单的垃圾回收策略,为每个对象分配一个引用计数器,当有引用指向该对象时,计数器加一,...
全面概述jvm垃圾回收机制的功能、各部分组成及各部分算法实现
JVM垃圾回收机制(GC).xmind
16_Java高级_JVM垃圾回收机制
在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项至关重要的机制,它自动管理程序中的内存,释放不再使用的对象所占据的空间,以防止内存泄漏。垃圾回收是Java虚拟机(JVM)的一个核心特性,它使得...
本篇文章将深入探讨JVM的垃圾回收机制以及内存分配策略。 首先,我们需要了解JVM的内存模型。在Java中,内存主要分为堆(Heap)和栈(Stack)。堆是所有对象实例的存储区域,而栈则用于存储方法调用时的局部变量。...
### Java+JVM+垃圾回收机制 #### 一、哪些垃圾是需要回收的? 在Java虚拟机中,垃圾回收机制负责自动管理内存空间,确保不再使用的对象能够被及时释放,以便于新对象的分配。这一过程的核心在于识别哪些对象不再...
本节将深入探讨JVM垃圾回收机制以及与之相关的工具和概念。 1. **JVM内存模型** JVM内存分为堆内存和栈内存,其中堆内存主要用于存储对象实例,而栈内存则用于存储方法调用时的局部变量。堆内存又分为年轻代和老...
本文将详细探讨JVM的发展历程以及内存管理中的垃圾回收机制。 一、JVM的历史发展 1. **早期阶段**:1995年,Sun Microsystems发布了Java的第一个版本,JVM作为其核心组成部分,主要应用于嵌入式设备和网络应用。初...
理解JVM垃圾回收机制对于优化Java应用性能至关重要。 1. **垃圾回收的基本概念** - **对象生命周期**:在Java中,对象的生命周期包括创建、使用和销毁。当对象不再被引用时,就被认为是“垃圾”。 - **垃圾回收器...
其中,垃圾回收机制(Garbage Collection, GC)是Java虚拟机(JVM)的一项重要特性,它能够自动检测并回收不再使用的对象占用的内存空间,从而有效避免了内存泄漏问题。本文将详细介绍Java中的垃圾回收机制及其工作原理...
JVM垃圾回收机制(GC) 引入:我们都知道,栈内存中方法运行完毕后会有弹栈的操作,不会产生垃圾,而堆内存中却没有这种操作,当堆内存中很多无用的成员变量、对象等等积压到一定程度时,就会发生堆内存溢出的一个错误...
Java虚拟机(JVM)的垃圾回收机制是Java开发中至关重要的一个概念,它负责自动管理内存中的对象,确保程序的稳定运行。垃圾回收(GC)是JVM内置的一种内存管理策略,旨在防止内存泄漏和内存溢出。当对象不再被程序...