在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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。