呼叫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
- 指令碼在crontab裡沒有執行的解決辦法之一指令碼
- 立即執行函式函式
- Win10系統執行IIS提示沒有註冊.netFrameWoek4.0的解決方法Win10
- 執行start-dfs.sh後,datenode沒有啟動的解決辦法
- 提示“印表機後臺程式服務沒有執行”的解決辦法!
- win10系統執行巫師3遊戲沒反應的解決方法Win10遊戲
- 最新的ADT沒有NDK引數的解決方法
- javascript中的自執行(立即執行)函式(function(){…})()JavaScript函式Function
- JavaScript中的立即執行函式JavaScript函式
- win10系統執行IIS沒有註冊.netFrameWoek4.0註冊不了的解決方法Win10
- 詳解javascript立即執行函式表示式(IIFE)JavaScript函式
- 多執行緒併發執行及解決方法執行緒
- jdbc 呼叫 sql server 的儲存過程時“該語句沒有返回結果集”的解決方法JDBCSQLServer儲存過程
- Linux crontab 沒有執行Linux
- CocosCreator 開發facebook小遊戲,呼叫排行榜的api並沒有執行遊戲API
- js立即執行函式原理JS函式
- 電腦沒有網路介面卡解決方法教程 沒有網路介面卡怎麼解決?
- 解決wkwebview 沒有alertWebView
- Linux中沒有rc.local檔案的解決方法Linux
- win10系統沒有睡眠選項的解決方法Win10
- win10沒有啟動畫面要怎麼解決_win10沒有歡迎介面的解決方法Win10動畫
- tweak 中常用的方法呼叫方法和 執行時APIAPI
- 呼叫JavaCalls::call()方法來執行Java方法Java
- JavaScript 匿名立即自執行函式JavaScript函式
- 立即執行函式(IIFE)&&閉包函式
- windows10電腦使用印表機提示“本地列印後臺處理程式服務沒有執行”的解決方法Windows
- Winform 呼叫WCF客戶端,所有服務端方法在執行的時候均找不到(編譯沒有問題)ORM客戶端服務端編譯
- 解決MySQL的主從資料庫沒有同步的兩種方法MySql資料庫
- DMAIC如何作為解決問題的方法執行?AI
- Oracle中JOB的建立後不執行解決方法Oracle
- Windows XP 禁止執行組策略的解決方法(轉)Windows
- SQL Server 匯出Excel有換行的解決方法SQLServerExcel
- 執行採購員到底有沒有出路?
- 六種用ruby呼叫執行shell命令的方法
- 執行runInstaller沒有介面彈出
- javascript中常用的幾種立即執行函式JavaScript函式
- win10系統下沒有rthdcpl.exe程式的解決方法Win10