引用计算方法
Java中没有采用引用计数方法管理内存,最主要的原因是此方法很难解决对象间的循环引用问题。
Java中采用的引用管理方法为:根搜索算法。基本思路是通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,所走过的路径称为“引用链(Reference Chain)”。当一个对象与其GC Roots之间没有任何通路的时候,就判定此对象可以被回收。
再谈引用
Java1.2之前对引用的定义是:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。在1.2之后,Java将引用的概念进行了扩充,分为以下4种类型:
- 强引用(Strong Reference)
指一个引用直接指向一个对象,类似于 Object o = new Object(),只要强引用存在,GC就不可能将它回收。
- 软引用(Soft Reference)
用来描述一些还有用的,但并非必须的对象。对于软引用对象,系统在将要发生内存溢出异常之前,会将其列为回收对象并进行第二次回收。如果这次回收之后还是没有足够的内存,才会抛出内存溢出异常。Java中提供SoftReference类实现软引用。
- 弱引用(Weak Reference)
同样用来描述非必须对象,但强度比软引用更弱,被弱引用关联的对象只能生存到下一次垃圾回收发生之前。当GC工作时,不论内存是否充足,弱引用对象都会被列在回收范围内。 Java提供了WeakReference类实现弱引用。
- 虚引用(Phantom Reference)
也称为幽灵引用或者幻影引用,是最弱的一种引用类型。虚引用存在与否,都不会对一个对象的生存时间产生任何影响,也无法使用虚引用来获取对象实例。设置虚引用的唯一目的就是希望在此对象在垃圾回收的时候收到一个系统通知。Java提供了PhantomReference类实现虚引用。
对象的生存还是死亡
在根搜索算法中不可到达的对象,也不一定就是“非死不可”的对象,要真正的回收一个对象,至少要经历两次标记:如果在对对象进行根搜索之后没有发现有与对应的GC Roots相连的引用链,那么它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。
当对象被判定为“有必要执行finalize()方法”,那么这个对象会被放置在一个名为“F-Queue”的队列之中,并在稍后又一条由虚拟机自动建立、低优先级的Finalizer线程去执行每个对象的finalize()方法,但不保证一定会等待每个对象的finalize方法执行结束,因为如果有对象的finalize方法很耗时或者干脆就是死循环,那么整个F-Queue中的对象都会处于等待状态甚至虚拟机崩溃。
finalize()方法是对象逃脱被回收的最后一次机会,GC会对F-Queue中的对象进行第二次小规模标记,如果对象想要逃脱被回收的命运,只要在finalize()方法中与引用链上的任何一个对象建立关联即可。
注意,任何对象的finalize()方法只会被执行一次。
不建议复写finalize()方法来进行类似资源回收的行为,使用try-finally或者其他方式都可以做的更好更及时。
相关推荐
* 统一的引用语义:Java垃圾收集器可以正确地处理多个引用对象的关系,从而避免了手动内存管理的复杂性。 * 解决了手动内存管理的困扰:Java垃圾收集器可以自动地释放内存,从而避免了手动内存管理的错误和困扰。 ...
Java垃圾收集器使用小诀窍详解 Java垃圾收集器是Java虚拟机(JVM)中一个非常重要的组件,它负责管理Java程序中的内存资源,防止内存泄露和溢出。垃圾收集器的使用小诀窍可以帮助开发者写出高效的Java程序,避免...
Java垃圾收集必备手册 Java 垃圾收集是 Java 语言中的一种自动内存管理机制,旨在释放不再使用的内存资源,以避免内存泄漏和提高程序性能。在这篇手册中,我们将深入探究 Java 垃圾收集的基础知识,包括垃圾收集的...
1. **无用对象识别**:垃圾收集器判定一个对象是否可被回收的关键标准是该对象是否仍被“活动”的部分所引用。若一个对象不再被任何变量或数据结构引用,则视为无用,可被回收。 2. **自动执行**:垃圾收集器的执行...
### Java垃圾收集机制详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其自动管理内存的功能极大地简化了程序设计工作。传统的编程语言如C/C++要求开发者手动管理内存,这不仅增加了编程的...
Java垃圾收集是Java编程中的一个核心概念,它关乎程序的性能和稳定性。这份"Java技术资料"中的"Java垃圾收集必备手册"很可能包含了关于Java内存管理、垃圾收集机制、垃圾收集器以及如何优化垃圾收集的一些关键知识点...
这份"Java垃圾收集必备手册"涵盖了Java开发中关于垃圾收集的基本概念、工作原理以及优化策略,对于Java开发者来说是不可多得的学习资源。 一、垃圾收集基本概念 1. 内存管理:Java使用自动内存管理,程序员无需手动...
Java垃圾收集概述主要关注的是Java运行环境中的内存管理和优化。在Java编程中,开发者无需手动管理内存,因为Java虚拟机(JVM)自动执行垃圾收集(Garbage Collection, GC),负责回收不再使用的对象所占用的内存...
Java垃圾收集器是Java编程语言的核心特性之一,它自动化地管理程序的内存空间,极大地简化了内存管理的工作,避免了手动回收内存可能导致的错误和内存泄漏问题。以下是对Java垃圾收集器的详细解析: 1. **工作原理*...
Java垃圾收集器是Java语言中的一个关键特性,它负责自动管理程序中的内存,尤其是在对象生命周期结束时进行内存的释放。这篇3000字的毕业设计论文外文翻译主要探讨了Java垃圾收集器的工作原理及其对性能的影响。 在...
Java垃圾收集器是Java语言的核心特性之一,它自动化地处理内存管理,使得程序员无需手动回收内存,从而减少了潜在的内存泄漏问题。Java虚拟机(JVM)中的垃圾收集器通过一个低优先级的线程——垃圾收集器线程来监控...
Java垃圾收集与异常处理是Java编程中至关重要的概念,它们对于程序的稳定性和性能有着直接影响。垃圾收集(Garbage Collection, GC)是Java虚拟机自动管理内存的一种机制,而异常处理则是通过预设的错误处理流程来...
Java垃圾收集机制是Java开发中的核心概念,它关乎程序的性能和稳定性。深入理解这一机制对于优化应用程序至关重要。本文将详细解析Java虚拟机(JVM)中的垃圾收集工作原理、不同类型的垃圾收集器以及如何通过编程...
在判断常量是否废弃时,如果常量池中的常量没有被任何对象引用,那么它就被认为是废弃常量,可能被垃圾收集器回收。 类的卸载需要满足特定条件,比如该类的所有实例都已被回收,加载该类的ClassLoader已被回收,且...
Java垃圾收集器是Java语言的重要特性,它负责自动管理程序中的内存空间,避免手动内存管理带来的问题,如内存泄漏。垃圾收集器通过一个系统级的线程——垃圾收集线程来工作,它会在Java虚拟机(JVM)空闲时检查并...
Java垃圾收集器有多种类型,包括: 1. 标记-清除收集器:遍历对象图标记存活对象,然后清理未标记对象,可能导致内存碎片。 2. 标记-压缩收集器:类似于标记-清除,但清理后会压缩存活对象,减少碎片。 3. 复制收集...
本文档是一本关于Java垃圾收集的教程,主要涉及了垃圾收集的概念、算法以及调优技巧。垃圾收集是Java内存管理的一个重要方面,它能够自动回收堆内存中不再使用的对象,减少内存泄漏的风险。本手册提供了一个全面的...
对于像Java这样的自动管理内存的语言而言,理解其内部的对象释放与垃圾收集机制显得尤为重要。 #### 二、对象的释放 在程序运行过程中,会不断地创建和销毁对象。当一个对象不再被引用时,它就成为了一个无用的...