你不能在 Java 中強制進行垃圾收集。你可以使用一些策略讓 Java 虛擬機確定任務的優先級,但垃圾收集的不確定性意味著不能強制執行該過程。參加java培訓,在短時間內盡快掌握垃圾收集器的相關知識,有助于你更好地進行開發工作。
同樣,你也無法阻止 Java 垃圾回收的發生。你可以更改 Java 虛擬機 (JVM) 中的一些配置設置,這些設置會影響觸發垃圾收集 (GC) 例程的變量,但你無法完全阻止 Java GC 的發生。或者你可以嗎?
Epsilon GC,也稱為 Java 的無操作垃圾收集器,提供內存分配工具,但它不執行任何內存回收。Epsilon GC 不只是阻止 Java 垃圾收集的發生——它完全消除了 GC。
Epsilon GC 是隨 JDK 11 發布的一項實驗性功能。要在啟用了 Epsilon GC 的 JVM 上啟動應用程序或微服務,請包括以下 JVM 選項:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
Epsilon GC 的優缺點
那么,Epsilon GC 有什么了不起的呢?使用它將應用程序和微服務部署到 JVM 的 DevOps 專業人員可以獲得最低的內存管理延遲。在java培訓中,也有關于內存管理和垃圾回收的相關課程,學好這些技能和知識,保障程序穩定運行。
缺點?當 JVM 達到其分配內存的限制時,它會崩潰并出現 OutOfMemoryError,從而終止 JVM。一旦 Java 堆用完,就不能再分配對象了。而且由于不允許內存回收,JVM 將失敗,并將 OutOfMemoryError 寫入日志并將堆轉儲寫入文件系統。
何時使用 Epsilon GC
為什么會有人想使用一個正常運行有可能終止 JVM 的 Java 內存管理工具? Epsilon GC 有一些有效的用例,包括:
性能測試例程,其中 GC 例程會扭曲收集的指標;
JVM 在退出時終止的極其短暫的例程;
適用于內存占用已確定的超延遲敏感應用程序;
對于主要執行迭代和條件邏輯的無垃圾應用程序;
用于 Kubernetes 上基于 Java 的高度集群化微服務部署,其中間歇性 JVM 故障不太可能導致服務降級;
對于在啟動時分配大量內存然后在工作日結束時循環關閉的服務器。想學習垃圾回收的使用技巧和方法,不妨報名參加java培訓,在專業老師和系統課程的指導教學下,可以快速提升自己。
Epsilon GC 的一個常見用例是確定 JVM 的最佳內存管理設置。要確定應用程序的最佳 Java 堆大小設置,可以在打開無操作垃圾收集器的負載下測試應用程序。然后可以使用 Java Flight Recorder 和 JDK Mission Control 等分析工具來確定最小和最大堆大小的最佳 Xms 和 Xmx 設置。這種方法生成的性能指標不受執行內存回收所需的額外開銷的影響。
當開發人員和 DevOps 專業人員詢問停止 JVM 的能力時,他們通常希望將其延遲 10 或 15 分鐘,以避免在關鍵服務窗口期間發生停止世界事件。但是,沒有這樣的命令、API 或 JDK 實用程序會暫時暫停 Java GC。
最接近的可用選項是利用 Epsilon GC、JEP-318 并完全關閉 GC。然后,圍繞不可避免的堆轉儲和 OutOfMemoryError 構建 Java 內存管理策略,如果對象創建超過分配給堆的內存量,就會發生這種情況。想深入了解關于java垃圾回收的問題,可以報名參加java培訓,學習更多的內存管理技巧,寫出高質量和已與維護的代碼!