在java垃圾收集器对堆内存进行回收之前,需要判断哪些对象还存活着,哪些对象已经死去。
一、引用计数算法
在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器值都为0的对象就是不可能再被使用的对象,该对象会被GC收集。
缺点:java中没有使用引用计数算法,原因是对象之间的循环引用很难解决。
二、根搜索算法
根搜索算法的基本思路为:通过一系列的名为“GC Roots”的对象作为起始点,从起始点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
可以作为GC Roots的对象包含以下几种:
1.虚拟机栈(栈帧中的本地变量表)中引用的对象,
2.方法区中的类静态属性引用的对象,
3.方法区中的常量引用的对象,
4.本地方法栈中JNI(native方法)引用的对象
相关推荐
本篇文章将深入探讨Java对象在JVM内存中的布局,帮助我们理解JVM是如何存储和管理对象的。 首先,我们要知道JVM内存主要分为以下几个区域: 1. **堆内存(Heap)**:这是Java对象的主要存储区域,所有通过`new`...
然后进行第二次小规模标记,这次如果对象仍然存活(例如在`finalize()`中重新建立了引用),则不会被回收。 总结:在Java的垃圾回收机制中,对象的回收基于可达性分析,通过标记来确定对象的生存状态。对于那些不再...
标记阶段找出所有存活的对象,清除阶段回收未标记的对象占用的空间,压缩阶段则是为了整理内存,消除碎片。 4. 内存分区:现代的垃圾收集器如G1将堆内存划分为多个区域,使得GC可以更智能地选择何时和何处进行回收,...
这是目前主流的判断对象是否存活的方式。通过从一组称为GC Roots的对象开始,沿着引用链向下搜索。如果一个对象不能从GC Roots到达,那么它被认为是不可达的,可以被回收。可达性分析可以有效解决循环引用的问题,但...
* 老年代(Old Generation):存储已经存活很长时间的Java对象实例。 Java核心知识点整理是一个复杂的主题,涵盖了Java语言的基础概念、Java虚拟机、垃圾回收机制、线程、内存区域等方面。理解这些知识点对于Java...
4. **标记-整理(Mark-Compact)算法**:结合了标记-清除和标记-压缩的优点,在标记和清除之后,将存活的对象整理到内存的一端,避免了碎片化问题。 #### 四、垃圾回收触发条件 垃圾回收可以在不同的条件下被触发: ...
1. 标记-清除收集器:遍历对象图标记存活对象,然后清理未标记对象,可能导致内存碎片。 2. 标记-压缩收集器:类似于标记-清除,但清理后会压缩存活对象,减少碎片。 3. 复制收集器:将堆分为两半,每次使用一半,GC...
GC通过可达性分析算法判断对象是否存活,若不可达,则进行回收。这一过程对于Java程序的稳定性和性能至关重要。 6. 类加载机制:Java的类加载机制包括加载、验证、准备、解析和初始化五个阶段。对象的创建与类加载...
4. 标记整理算法,先标记存活对象,然后将所有存活对象向一端移动,清空另一端。 5. 分代收集算法,根据对象的生命周期将内存分为新生代和老年代,使用不同的策略进行回收,新生代常用复制算法,老年代常用标记整理...
垃圾回收是JVM管理Java对象生命周期的机制,包括标记-清除算法、复制算法、标记-压缩算法等。 垃圾回收算法 垃圾回收算法是JVM管理Java对象生命周期的核心机制。常见的垃圾回收算法包括标记-清除算法、复制算法、...
深入理解Java对象的状态、引用种类以及垃圾回收的形式对于提升代码质量和性能至关重要。通过合理利用不同类型的引用和理解垃圾回收机制,可以在资源受限的环境中优化程序的内存使用,避免内存泄漏和性能瓶颈,从而...
- 标记-整理:标记存活对象,然后让存活对象移动到一端,清理边界外的内存,适用于老年代。 - 分代收集:根据对象生命周期将内存分为新生代和老年代,使用不同算法。 5. **Hotspot虚拟机的垃圾回收器**: - ...
该算法的主要思想是,首先标记出所有的GC Root对象,然后将这些对象的引用关系跟踪下去,并将所有的对象分为两类:存活对象和垃圾对象。最后,回收所有的垃圾对象所占用的内存空间。该算法的优点是标记-清除算法不...
- **标记-整理算法**:针对对象存活率较高的情况,标记后,让所有存活对象向一端移动,然后直接清理边界外的内存。 - **分代收集算法**:现代JVM通常采用此策略,将堆分为新生代(Young Generation)和老年代(Old...
2. **执行finalize()方法**:对于被第一次标记的对象,Java虚拟机(JVM)会尝试执行其finalize()方法。这是一个特殊的方法,提供给对象最后一次自救的机会。需要注意的是,虚拟机并不保证等待这个方法执行完毕。 3. ...
分代收集算法是基于对象存活周期的不同而采用不同的回收策略,分为新生代收集和老年代收集。分区收集算法则是将堆内存划分为连续几个区域,每个区域可以独立进行垃圾回收。 GC垃圾收集器 常见的GC垃圾收集器包括:...
引用计数法和可达性分析是判断对象是否存活的两种常用方法。 GC分代收集算法VS分区收集算法:分代收集算法基于不同代的垃圾回收特点来设计,新生代使用复制算法,老年代使用标记整理算法。分区收集算法则将堆内存...
- **标记-压缩收集器**:与标记-清除类似,但会将存活对象压缩到堆的一端,消除碎片。 - **复制收集器**:将堆分为两部分,每次只使用一半,新对象在另一半创建。当进行垃圾回收时,将存活对象复制到另一部分,压缩...
6. **对象存活判断**: GC判断对象是否存活通常使用引用计数法和可达性分析算法。引用计数法简单但难以处理循环引用,而可达性分析通过根集合(如静态变量、系统寄存器等)来判断对象是否可达,更适用于实际应用。 ...