A NoOp Garbage Collector
JDK上對這個特性的描述是: 開發一個處理內存分配但不實現任何實際內存回收機制的GC, 一旦可用堆內存用完, JVM就會退出.
如果有System.gc()調用, 實際上什么也不會發生(這種場景下和-XX:+DisableExplicitGC效果一樣), 因為沒有內存回收, 這個實現可能會警告用戶嘗試強制GC是徒勞.
用法 : -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
class Garbage {
int n = (int)(Math.random() * 100);
@Override
public void finalize() {
System.out.println(this + " : " + n + " is dying");
}
}
public class EpsilonTest {
public static void main(String[] args) {
boolean flag = true;
List<Garbage> list = new ArrayList<>();
long count = 0;
while (flag) {
list.add(new Garbage());
if (list.size() == 1000000 && count == 0) {
list.clear();
count++;
}
}
System.out.println("程序結束");
}
}
如果使用選項-XX:+UseEpsilonGC, 程序很快就因為堆空間不足而退出
使用這個選項的原因 :
提供完全被動的GC實現, 具有有限的分配限制和盡可能低的延遲開銷,但代價是內存占用和內存吞吐量.
眾所周知, java實現可廣泛選擇高度可配置的GC實現. 各種可用的收集器最終滿足不同的需求, 即使它們的可配置性使它們的功能相交. 有時更容易維護單獨的實現, 而不是在現有GC實現上堆積另一個配置選項.
主要用途如下 :
性能測試(它可以幫助過濾掉GC引起的性能假象)
內存壓力測試(例如,知道測試用例 應該分配不超過1GB的內存, 我們可以使用-Xmx1g –XX:+UseEpsilonGC, 如果程序有問題, 則程序會崩潰)
非常短的JOB任務(對象這種任務, 接受GC清理堆那都是浪費空間)
VM接口測試
Last-drop 延遲&吞吐改進