JVM判断对象存活的算法
引用计数算法(reference counting):垃圾收集的早期策略。一个对象被创建时,为该对象分配一个引用计数器。当有地方引用它时,计数加1。当一个对象的引用超过了生存期或者被设置一个新的值时,引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集的时候,它引用的任何对象计数值减1。在这种方法中,一个对象被垃圾收集后可能导致后续其他对象的垃圾收集行动。
此算法实现简单,判断效率高;但很难解决对象之间的相互循环引用,如,A对象有一个对B对象的引用,B对象又反过来引用A对象,除此之外这两个对象无任何引用,但引用计数都不会为0,无法回收它们。另外,每次引用计数的增加或者减少也带来额外开销。
根搜索算法(GC Roots Tracting):通过一系列的名为“GC Roots”对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则此对象是不可用的。
可作为GC Roots的对象包括:
1.虚拟机栈(栈帧中的局地变量表)中的引用的对象;
2.方法区中的类静态属性引用的对象和常量引用的对象;
3.Native方法栈中JNI的引用的对象
关于引用:强-->软-->弱-->虚
强引用(Stong Reference):指程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收被引用的对象;
软引用(Soft Reference):用来描述一些还有用,但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收。如果这次回事还是没有足够的内存,才会抛出内存溢出异常;
弱引用(Weak Reference):用于描述非必需对象,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收弱引用关联的对象;
虚引用(Phantom Refenrece):对对象的生存时间无影响,无法通过虚引用来取得对象实例。它的唯一目的就是希望能在这个对象别回收时收到一个系统通知。
分享到:
相关推荐
本文将详细讲解JVM如何判断对象已死的两种主要算法:引用计数算法和可达性分析算法,以及JDK 1.2之后引入的不同类型的引用。 首先,我们来看引用计数算法。这是一种简单的对象存活判断方法,为每个对象添加一个引用...
- **新生代与老年代的大小调整**:新生代主要存放新创建的对象,老年代则保存长期存活的对象。过大或过小都可能导致频繁的GC,影响性能。 - **新生代GC算法选择**:串行GC或ParNew(并行GC的新生代版本)常用于...
在Java虚拟机(JVM)中,垃圾回收(Garbage Collection, GC)是自动管理内存的重要机制,它负责识别并释放不再使用的对象所占用的内存空间。GC的主要目标是避免内存泄漏,确保程序的稳定性和高效运行。这篇博客将...
可达性分析是现代JVM普遍采用的垃圾回收策略,通过从一组称为GC Roots的对象开始,向下遍历所有可达的对象,标记它们为存活状态。未被标记的对象被视为可回收垃圾。GC Roots通常包括全局变量、静态变量、线程栈中的...
在清除阶段,不仅删除未标记对象,还把存活对象紧凑地移到内存一端,消除碎片。这种方法解决了标记清除的碎片问题,但增加了移动对象的开销。 - 复制算法 复制算法将内存划分为两部分,每次只使用一部分。当进行...
JVM垃圾回收算法工作原理详解主要介绍了JVM的垃圾回收算法如何判断对象是否可以被回收,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 JVM垃圾回收算法工作原理可以分为两种方法...
老年代(Old Generation)是JVM中的一块内存区域,它用于存放存活时间较长的对象。老年代的GC机制与年轻代不同,它的GC机制称为Major GC。Major GC的执行频率较低,通常在几秒到几十秒之间。 在JVM中,还有一个特殊...
引用计数算法通过跟踪记录每个对象被引用的次数来判断对象是否应该被回收,但在处理循环引用时存在缺陷。可达性分析清理算法通过标记-清除、复制和标记-整理三个子算法来完成垃圾回收过程。标记-清除算法会留下内存...
- 可达性分析算法:这种方法通过确定对象的引用链来判断对象是否可达。GC根对象包括虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中native方法引用的对象。如果一个对象...
3. **标记-整理(Mark-Compact)**:此算法结合了标记-清除和复制的优点,标记后,让所有存活对象向一端移动,然后直接清理边界以外的内存,解决了碎片问题,但没有解决空间浪费。 4. **分代收集(Generational GC...
JVM采用可达性分析算法来判断对象是否存活。该算法通过一系列被称为GC Roots的对象作为起点,向下搜索,如果一个对象到GC Roots没有任何引用链相连,那么该对象被认为是不可达的,也就是不可用的,从而被回收。值得...
在这些阶段中,G1会通过SATB(Snapshot-At-The-Beginning)算法追踪对象引用的变化,同时使用可达性分析确定哪些对象是存活的。 混合收集是G1的核心,它会选择一部分Region进行垃圾回收,这些Region可能是年轻代、...
本文主要围绕JVM内存区域的分配策略,尤其是对象在新生代(Young Generation)的Eden区分配,以及大对象直接进入老年代(Tenured Generation)的情况进行详细解释,并通过实例分析Minor GC和Full GC的区别。...
12、判断对象是否是垃圾的引用计数法 13、JVM底层可达性分析算法如何找垃圾对象 14、可达性分析算法中不可达的对象还有机会存活吗 15、什么样的类能被回收 16、解释下JVM内部各种垃圾收集算法 17、解释下CMS收集器...
Tenured 区是用于存储长期存活的对象。 4. 垃圾回收 垃圾回收是 JVM 中的一个重要机制,它用于回收不再使用的对象,避免内存泄露。垃圾回收算法有多种,包括 Mark-Sweep 算法、Copy 算法、Mark-Compact 算法等。 ...
在JVM中,性能调优是一个关键环节,特别是垃圾收集(Garbage Collection, GC)算法的选择和配置,对系统的响应时间、吞吐量以及内存使用效率有着直接影响。本文将深入探讨JVM的组成、垃圾收集的基本概念及其常见算法...
- **内存回收**:通过可达性分析算法判断对象是否存活,如引用计数法和根可达法。 finalize()方法用于对象在被回收前的自定义清理逻辑,但不应依赖它进行资源释放。 3. **类加载机制** - **类加载过程**:包括...
- **分代收集算法**:基于对象存活周期的不同将堆空间划分为几块,不同的区域使用适合的GC算法。年轻代使用复制算法,而老年代则采用标记-清除算法或标记-压缩算法。 - **标记-压缩算法**:除了标记和清除之外,还会...