呼叫System.gc沒有立即執行的解決方法
轉載自:https://blog.csdn.net/yewei02538/article/details/52386642
檢視原始碼
當我們呼叫System.gc()的時候,其實並不會馬上進行垃圾回收,甚至不一定會執行垃圾回收,檢視系統原始碼可以看到
/**
* Indicates to the VM that it would be a good time to run the
* garbage collector. Note that this is a hint only. There is no guarantee
* that the garbage collector will actually be run.
*/
public static void gc() {
boolean shouldRunGC;
synchronized(lock) {
shouldRunGC = justRanFinalization;
if (shouldRunGC) {
justRanFinalization = false;
} else {
runGC = true;
}
}
if (shouldRunGC) {
Runtime.getRuntime().gc();
}
}
也就是justRanFinalization=true
的時候才會執行
查詢發現當呼叫runFinalization()的時候justRanFinalization
變為true
下面是runFinalization()的原始碼
/**
* Provides a hint to the VM that it would be useful to attempt
* to perform any outstanding object finalization.
*/
public static void runFinalization() {
boolean shouldRunGC;
synchronized(lock) {
shouldRunGC = runGC;
runGC = false;
}
if (shouldRunGC) {
Runtime.getRuntime().gc();
}
Runtime.getRuntime().runFinalization();
synchronized(lock) {
justRanFinalization = true;
}
}
其實當我們直接呼叫System.gc()
只會把這次gc請求記錄下來,等到runFinalization=true
的時候才會先去執行GC,runFinalization=true
之後會在允許一次system.gc()。之後在call System.gc()還會重複上面的行為。 所以System.gc()要跟System.runFinalization()一起搭配使用才好。
檢視ZygoteInit.java
裡面 gc()和runFinalizationSync()是配合使用的,這樣才有效果
static void gcAndFinalize() {
final VMRuntime runtime = VMRuntime.getRuntime();
/* runFinalizationSync() lets finalizers be called in Zygote,
* which doesn't have a HeapWorker thread.
*/
System.gc();
runtime.runFinalizationSync();
System.gc();
}
解決方案
由此可見,當我們需要呼叫的System.gc()
的時候 要這樣才會執行
System.gc();
runtime.runFinalizationSync();
System.gc();
相關文章
- Docker執行基於ubuntu映象的容器後沒有ifconfig和ping的解決方法DockerUbuntu
- 立即執行函式函式
- 執行start-dfs.sh後,datenode沒有啟動的解決辦法
- 執行yum install 的時候提示【沒有可用的軟體包】的解決方案
- 多執行緒併發執行及解決方法執行緒
- 呼叫JavaCalls::call()方法來執行Java方法Java
- Linux中沒有rc.local檔案的解決方法Linux
- win10系統執行巫師3遊戲沒反應的解決方法Win10遊戲
- CocosCreator 開發facebook小遊戲,呼叫排行榜的api並沒有執行遊戲API
- 執行Tensorboard出現kernel is dead的解決方法ORB
- 舉例說明js立即執行函式的寫法有哪些?JS函式
- js立即執行函式原理JS函式
- 03-立即執行函式函式
- 電腦沒有網路介面卡解決方法教程 沒有網路介面卡怎麼解決?
- win10系統沒有睡眠選項的解決方法Win10
- DMAIC如何作為解決問題的方法執行?AI
- windows10電腦使用印表機提示“本地列印後臺處理程式服務沒有執行”的解決方法Windows
- JavaScript 匿名立即自執行函式JavaScript函式
- 立即執行函式(IIFE)&&閉包函式
- 六種用ruby呼叫執行shell命令的方法
- win10沒有啟動畫面要怎麼解決_win10沒有歡迎介面的解決方法Win10動畫
- 解決MySQL的主從資料庫沒有同步的兩種方法MySql資料庫
- SQL Server 匯出Excel有換行的解決方法SQLServerExcel
- win10系統不能執行qq的解決方法Win10
- vscode無法執行input輸入解決方法VSCode
- Python執行緒安全問題及解決方法Python執行緒
- Thread 中的 join() 方法的作用是呼叫執行緒等待該執行緒執行完後,再繼續執行thread執行緒
- JS小知識——立即執行函式JS函式
- win10系統下沒有rthdcpl.exe程式的解決方法Win10
- Vue 之 多個路由繫結同一元件造成created不執行的解決辦法、created沒有執行的問題Vue路由元件
- Python | 多執行緒死鎖問題的巧妙解決方法Python執行緒
- Selenium 本地單執行緒執行時,報 renderer 超時異常,指令碼是沒有問題的,可以執行,不知道是什麼原因,百度也沒有找到解決的辦法執行緒指令碼
- idea執行java專案main方法報build failure錯誤的解決方法IdeaJavaAIUI
- win10磁碟合併提示沒有足夠的空間的解決方法Win10
- windows10電腦系統重灌後沒有聲音的解決方法Windows
- 執行時Hook所有Block方法呼叫的技術實現HookBloC
- 解決非小程式執行環境,不能呼叫wx.login()生成code
- JavaScript 立即執行函式、逗號運算JavaScript函式