簡體   English   中英

G1不處理軟引用

[英]G1 doesn't process soft references

這是我簡單的gc測試:

public class Main {

  static class Data {
    public long[] l = new long[100];
  }

  static List<SoftReference<Data>> list = new ArrayList<>();

  public static void main(String[] args) {
    long i = 0;

    while (true) {
      list.add(new SoftReference<>(new Data()));
      ++i;
      if (i % 1000 == 0) {
        sleep(1);
        if (i % 1_000_000 == 0)
          sleep(1000);
      }
    }
  }

  static void sleep(long millis) {
    try { Thread.sleep(millis); } catch (InterruptedException ignored) {}
  }
}

使用這些args(啟用G1):

java -Xmx2G -Xms2G -XX:MaxPermSize=128m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
-XX:+PrintAdaptiveSizePolicy -Xloggc:jvm.log -XX:+UseG1GC 
-XX:InitiatingHeapOccupancyPercent=5 Main

我grep輸出:

grep -E "(Full|GC cleanup)" jvm.log

得到這樣的東西:

0.564: [GC cleanup 277M->277M(2048M), 0.0009922 secs]
0.879: [GC cleanup 443M->442M(2048M), 0.0009396 secs]
1.676: [GC cleanup 859M->856M(2048M), 0.0008681 secs]
3.530: [GC cleanup 1324M->1320M(2048M), 0.0012422 secs]
4.838: [GC cleanup 1711M->1707M(2048M), 0.0010601 secs]
6.334: [Full GC 2047M->102M(2048M), 1.2659685 secs]
8.322: [GC cleanup 534M->534M(2048M), 0.0009528 secs]
11.250: [GC cleanup 1460M->1450M(2048M), 0.0011207 secs]
13.499: [Full GC 2046M->512M(2048M), 1.3534848 secs]

似乎在ParallelGc的完整集合期間收集了軟引用,而並發集合幾乎無用。 VisualVm的堆轉儲也證明了這個版本。

我錯過了什么,或者它是G1中的一個錯誤?

檢查1.7.0_51-b13和1.8.0_45-b15 x64。

也許你對弱引用感到困惑?

GC不會被迫收集軟參考,除非它發現自己處於嚴重的內存壓力下。

有關更多信息,請參見此處

特別注意文檔中的以下引用:

軟參考對象,由垃圾收集器根據內存需求自行決定清除。

文檔提供的唯一真正保證如下:

在虛擬機拋出OutOfMemoryError之前,保證已清除對軟可訪問對象的所有軟引用。

-XX:SoftRefLRUPolicyMSPerMB= (默認值= 1000),用於管理軟引用的收集率。 較低的值使其更快地收集它們。

我不知道它是如何與G1的區域相互作用的。 某些地區可能很少被觸及,因此不會考慮它們的軟參考。

正如@sstan所提到的,WeakReferences可能會提供一些更可預測的行為,但代價是引用的壽命要短得多。


另一個問題是您沒有清除已排除的軟引用對象列表。 如果您使用引用隊列注冊refs,請在sleep(1000)之后輪詢該隊列以進行引用,並將其從列表中刪除,這樣您就不應該耗盡內存。 為了更快地查找,集合可能比列表更合適。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM