Exception in thread "main"java.lang.OutOfMemoryError: GC overhead limit exceeded
4363 ワード
OutOfMemoryError、メモリオーバーフローであることはよく知られていますが、GC overhead limit exceededとはどういう意味ですか?
GC overhead limit exceededこれはJDK 6に新たに追加されたエラータイプであり、GCが多くの時間を費やして小さな空間を解放するとこの異常が投げ出され、JDK自身の保護メカニズムである.
GC overhead limt exceed検査はGC時間を統計することによってOOMが必要かどうかを予測する.Sunの公式定義は、「パラレル/コンカレント回収器は、GC回収時間が長すぎるとOutOfMemroyErrorを放出する.長い定義は、98%以上の時間をGCに使用し、2%未満のスタックメモリを回収したことです.メモリが小さすぎてアプリケーションが正常に動作しないようにします」と話しています.
次のコードはGC overhead limit exceededをシミュレートできます
前述したように、GC overhead limit exceededはJDKの保護メカニズムであり、この保護メカニズムを必要としない場合は、次のパラメータを追加することでこの保護メカニズムを削除することができます.-XX:-UseGCOverheadLimit-XX:-UseGCOverheadLimitを追加した後、上記のコードを実行すると、スタックメモリオーバーフロー異常が放出されることが予想されます.それはいったいそうですか.下記の運転結果をご覧ください
ここまで読んで、JDKがあらゆる方法でこの戦略を設計したのは、いったい何の役に立つのだろうかと思うかもしれません.この異常をcatchしても、アプリケーションを救うことはできないようですが、アプリケーションが切れる前に、データの保存や現場の保存(Heap Dump)など、必死にもがくことができます.
GC overhead limit exceededこれはJDK 6に新たに追加されたエラータイプであり、GCが多くの時間を費やして小さな空間を解放するとこの異常が投げ出され、JDK自身の保護メカニズムである.
GC overhead limt exceed検査はGC時間を統計することによってOOMが必要かどうかを予測する.Sunの公式定義は、「パラレル/コンカレント回収器は、GC回収時間が長すぎるとOutOfMemroyErrorを放出する.長い定義は、98%以上の時間をGCに使用し、2%未満のスタックメモリを回収したことです.メモリが小さすぎてアプリケーションが正常に動作しないようにします」と話しています.
次のコードはGC overhead limit exceededをシミュレートできます
public class ConstantPoolOOMTest {
/**
* VM Args:-XX:PermSize=5m -XX:MaxPermSize=5m
* @param args
*/
public static void main(String[] args) {
List list = new ArrayList<>();
int i=1;
try {
while(true){
list.add(UUID.randomUUID().toString());
i++;
}
} finally {
System.out.println(" :"+i);
}
}
}
:
:57241
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.Long.toUnsignedString(Unknown Source)
at java.lang.Long.toHexString(Unknown Source)
at java.util.UUID.digits(Unknown Source)
at java.util.UUID.toString(Unknown Source)
at com.ghs.test.ConstantPoolOOMTest.main(ConstantPoolOOMTest.java:18)
前述したように、GC overhead limit exceededはJDKの保護メカニズムであり、この保護メカニズムを必要としない場合は、次のパラメータを追加することでこの保護メカニズムを削除することができます.-XX:-UseGCOverheadLimit-XX:-UseGCOverheadLimitを追加した後、上記のコードを実行すると、スタックメモリオーバーフロー異常が放出されることが予想されます.それはいったいそうですか.下記の運転結果をご覧ください
:58162
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Long.toUnsignedString(Unknown Source)
at java.lang.Long.toHexString(Unknown Source)
at java.util.UUID.digits(Unknown Source)
at java.util.UUID.toString(Unknown Source)
at com.ghs.test.ConstantPoolOOMTest.main(ConstantPoolOOMTest.java:18)
ここまで読んで、JDKがあらゆる方法でこの戦略を設計したのは、いったい何の役に立つのだろうかと思うかもしれません.この異常をcatchしても、アプリケーションを救うことはできないようですが、アプリケーションが切れる前に、データの保存や現場の保存(Heap Dump)など、必死にもがくことができます.