首先垃圾收集算法要做两件事情:
1) 检测出垃圾对象
2)回收垃圾对象所使用的堆空间并还给程序
垃圾检测通常通过建立一个根对象的集合并且检查从这些根对象开始的可触及性来实现。对于程序来说,根对象总是可以访问的。从这个根对象开始,任何可以被触及的对象都被认为是活动对象,无法被触及的对象被认为是垃圾。
java虚拟机的根对象集合根据实现而不同,但是总会包含局部变量中的对象引用和栈帧的操作数栈(以及类变量中的对象引用)。另一个根对象的来源是被加载的类的常量池中的对象引用,比如字符串。还有一个来源是传递到本地方法中的,没有被本地方法释放的对象引用。另一个潜在的根对象的来源是,java虚拟机运行时数据区中从垃圾收集器的堆中分配的部分。
好下面进入主题,先看入下一段代码:
class Example1 {
protected void finalize() throws Throwable{
//......
super.finalize();
}
//......
}
该类就是自身含有一个对象终结方法finalize, Jvm在回收含有终结方法的垃圾对象时要完成的工作更加复杂。
存在终结方法时,JVM的垃圾收集器必须在每次回收时执行一些额外的操作。首先,垃圾收集器检测出不再被引用的对象(第一遍扫描)。然后,必须检测这些不再被引用的对象是否声明了终结方法,如果时间允许的话,可能垃圾收集器就在这个时间开始处理这些终结方法,执行完后,垃圾收集器又必须从根节点再次检测不再被引用的对象(第二边扫描),因为终结方法可能“复活”了某些不再被引用的对象,使得它们再次被引用了。最后,垃圾收集器才能释放那些在在两次扫描中发现的都没被引用的对象。
“每次对有终结方法对象的收集都要进行两遍的扫描会不会太影响效率呢?”
恩,很好的问题。
JVM早有准备了,在扫描到含有终结方法和运行这些终结方法之间,垃圾收集器可以有选择的插入一个步骤。当垃圾收集器执行了第一遍扫描后,并找到了一些不再被引用的对象需要需要执行终结时,它可以运行一次小型的追踪,从需要执行终结的对象开始(不是从根节点开始)。任何满足如下条件的对象——从跟节点开始不可触及和将要被终结的对象开始不可触及——这些对象不可能再执行终结方法时复活,它们可以立即被释放。
问题又来了“如果一个对象的终结方法被调用了,但是对象由于种种原因暂时还没销毁,还会不会再次被调用??”
哎。。
如果一个带有终结方法的对象不再被引用,并且它的终结方法运行过了,垃圾收集器必须使用某种方法(哪种方法还不清楚 ,见谅)记在这一点,而不能再次执行这个对象的终结方法。如果这个对象被它自己的或者其他对象的终结方法复活了,此时垃圾收集器必须像对待一个没有终结方法的对象一样对待它。
ok。。。。。。。
分享到:
相关推荐
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾收集器(Garbage Collector, GC)。...对于内存分析,理解不同垃圾收集器的工作机制和适用场景至关重要,这有助于优化JVM配置,提升系统性能。
- **软引用**:用于实现内存敏感的缓存,当内存不足时,垃圾收集器会清理软引用,将其对应的对象回收。 - **弱引用**:不会阻止对象被垃圾收集,只要垃圾收集器运行,弱引用关联的对象就会被回收。 - **虚引用**...
通过上述对JVM内存区域划分、JVM执行子系统、垃圾回收器和内存分配策略、编写高效优雅Java程序以及性能优化等方面的详细介绍,我们可以更好地理解和掌握Java程序的运行机制,进而提高程序的性能和质量。
在Java中,垃圾回收机制负责自动管理堆内存,确保在程序运行过程中有效地使用内存资源,避免内存泄漏。 1. 垃圾回收: - **垃圾回收(Garbage Collection, GC)** 是Java内存管理的核心,当一个对象不再被任何引用...
由于Java使用垃圾回收机制,对象的生命周期由垃圾回收器管理。当一个对象没有任何引用指向它时,JVM会在适当的时间回收其占用的内存空间,这就是对象的终结。 总结,Java类与对象的生命周期紧密关联,类的生命周期...
对象终结是指对象使用完毕后,由垃圾收集器进行回收的过程。 Java安全模型是确保Java平台安全运行的基础。本书详细阐述了类型安全性、类加载器体系、字节码校验、安全管理器、访问控制和代码签名等安全机制。类型...
8. **JVM工作原理**:理解Java虚拟机(JVM)的工作方式,包括类加载机制、内存模型、垃圾回收(GC)策略等,对于优化程序性能和排查问题非常有帮助。 这两份xls文件可能包含了上述知识点的具体题目和解答,通过解答...
面试中可能涉及的基础知识点包括:Java语法基础(如类、对象、封装、继承、多态等)、异常处理、集合框架(List、Set、Map的区别及使用)、IO流、线程同步与并发、垃圾回收机制、反射API以及设计模式等。对于高级...
- `finalize`:是对象的终结方法,当垃圾回收器准备回收对象时,会先调用`finalize()`,供对象进行必要的清理工作。 4. **&和&&的区别**: - `&`是位运算符,对两个操作数的二进制位进行逐位与运算。 - `&&`是...
- 反射机制允许在运行时动态访问和修改类和对象的属性和方法。 - Class.newInstance:创建类的新实例,常用于反射。 2. 工具类和常量 - java.lang.Math、java.util.Arrays、java.util.Collections:这些类提供...
- **finalize()的调用机制**:`finalize()`方法由JVM调用,用于对象被垃圾回收前的清理工作。它可能仅被执行一次,或者根本不执行,且不会自动调用父类的`finalize()`方法。 ### 类型比较与转换 - **原始类型与...
了解Java对象的生命周期、引用类型及垃圾回收机制对于有效定位和解决内存泄漏问题至关重要。 1. **Java对象的size**: - 对象的实际大小取决于其属性的类型和数量。 - 对象头部包含了元数据信息,如对象哈希码、...
Java垃圾回收机制是Java语言中一个非常重要的特性,它自动管理程序中的内存,避免程序员手动进行内存释放,降低了出现内存泄漏等问题的风险。垃圾回收的主要目标是识别并回收那些不再使用的对象所占据的内存空间,...
了解这些阶段有助于更高效地管理对象,减少内存泄漏,确保程序运行的稳定性和效率。 #### 三、循环中的对象创建优化 避免在循环体中频繁创建对象,即使对象占用内存较小。这会增加GC压力,降低程序执行效率。可以...
- **垃圾回收机制**:GC的工作原理,如何触发GC,以及Stop-the-world事件。 - **对象的生命周期**:创建、可达性分析、垃圾收集、对象终结。 6. **并发编程** - **线程**:创建线程的方式(Thread类、Runnable...
6. Finalized(终结):等待GC回收对象占用的空间。 7. Deallocated(释放):内存被回收或再分配。 二、优化内存的意义 内存优化可以避免内存泄漏、内存抖动等问题,提高应用的运行效率,减少电池消耗,提升用户...
Java虚拟机的垃圾回收机制提供了一种强保证:只要从根引用可以到达的对象,就不会被回收。这意味着只要对象的引用链还存在于执行代码中,那么该对象就会保留在内存中。垃圾回收器何时运行是自动的,通常在内存不足...