在Java中,每个对象都有一个名为finalize()的方法。在回收实际对象被利用的内存之前,垃圾Collector会调用此方法。它为对象提供了在垃圾收集之前执行清理操作的机会。
然而,finalize()的执行并不安全,它取决于垃圾Collector何时决定收集该对象。有时,垃圾收集可能不会在所有情况下立即发生,因此,可能不会立即调用 finalize() 方法。
这就是runFinalization()方法表演开始发挥作用。
了解runFinalization()
runFinalization() 方法是 Runtime 类的一部分,其目的是触发任何正在等待终结的对象的终结方法的执行。其句子结构如下:
public void runFinalization()
runFinalization() 示例:
下面是runFinalization()方法的实现:
Java
// Java Program to demonstrate
// runFinalization() Method
// Driver Class
public class FinalizationExample2 {
// main function
public static void main(String[] args) {
// Creating a large number of objects
for (int i = 0; i < 5; i++) {
new ObjectWithFinalize();
}
// Running garbage collection explicitly
System.gc();
// Running finalization explicitly
Runtime.getRuntime().runFinalization();
// Printing a message after running finalization
System.out.println("End of main");
}
}
class ObjectWithFinalize {
@Override
protected void finalize() throws Throwable {
System.out.println("Finalize method called");
}
}
Finalize method called Finalize method called Finalize method called Finalize method called Finalize method called End of main
上面例子的解释
- 我们在循环中创建了大量的ObjectWithFinalize对象。
- 之后,我们显式调用 System.gc() 来建议 JVM 运行垃圾Collector。
- 然后,我们使用 Runtime.getRuntime().runFinalization() 显式运行终结。
通过显式触发垃圾收集(System.gc()),我们增加了垃圾Collector运行的可能性,随后,可能会调用终结队列中对象的finalize()方法。
Note: System.gc() doesn’t guaranteed that garbage collections is triggered. It will suggest JVM to do so.
结论:
总之,Java 中的 runFinalization() 方法与 java.lang.Runtime 分离,是一个允许开发人员显式运行待终结对象的终结方法的工具。然而,它的使用是有考虑的,并且对于让废料Collector自动欺骗保持性的特权非常犹豫。
- 垃圾收集时间:报废上诉和最终确定的确切时间是不确定的,取决于垃圾Collector执行、内存方向方案和可用系统资源等因子。
- 非保证最终确定:作用于非常物理对象的finalise()方法不能保证立即或在特定时钟处失效;当显式命名 runFinalisation() 时它将刷新。 JVM 可以自行决定何时准备好运行终结方法。
- 自动内存管理:Java 的自动保持性管理(包括抓取)旨在减少手动干扰。开发人员很高兴依靠 JVM 的内在机制,而不是尝试显式验证终结的时间。
- 最佳实践:如果需要清理,建议使用 try-with-resources 或实现 AutoCloseable 用户接口等替代机制,而不是依赖 finalize()。
实际上,显式调用 runFinalization() 并尝试验证垃圾收集在 well-designed Java 应用程序中并不常见。开发人员通常专注于一段文字,resource-efficient 代码,并存储 JVM 以有效地进行内存管理。了解食物垃圾处理、最终确定和选择智能管理技术的原理对于简单而有效的 Java 程序来说是非常重要的。
相关用法
- Java Runtime maxMemory()用法及代码示例
- Java Runtime gc()用法及代码示例
- Java Runtime getRuntime()用法及代码示例
- Java Runtime freeMemory()用法及代码示例
- Java Runtime halt()用法及代码示例
- Java Runtime load()用法及代码示例
- Java Runtime availableProcessors()用法及代码示例
- Java Runtime exit()用法及代码示例
- Java Runnable用法及代码示例
- Java RuleBasedCollator clone()用法及代码示例
- Java RuleBasedCollator compare()用法及代码示例
- Java RuleBasedCollator equals()用法及代码示例
- Java RuleBasedCollator getCollationElementIterator(CharacterIterator)用法及代码示例
- Java RuleBasedCollator getCollationElementIterator(String)用法及代码示例
- Java RuleBasedCollator getCollationKey()用法及代码示例
- Java RuleBasedCollator getRules()用法及代码示例
- Java RuleBasedCollator hashCode()用法及代码示例
- Java Random doubles()用法及代码示例
- Java Random nextInt()用法及代码示例
- Java Reentrant getQueueLength()用法及代码示例
- Java ReentrantLock getHoldCount()用法及代码示例
- Java ReentrantLock getOwner()用法及代码示例
- Java ReentrantLock hasQueuedThread()用法及代码示例
- Java ReentrantLock hasQueuedThreads()用法及代码示例
- Java ReentrantLock isFair()用法及代码示例
注:本文由纯净天空筛选整理自sakshinagare2004大神的英文原创作品 Java Runtime runFinalization() Method with Examples。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。