SO answerは、-Xmx
JVMフラグについていくつかを明確にしています。は、-Xmxはハードな制限ですか?
import java.util.List;
import java.util.ArrayList;
public class FooMain {
private static String memoryMsg() {
return String.format("%s. %s. %s"
, String.format("total memory is: [%d]",Runtime.getRuntime().totalMemory())
, String.format("free memory is: [%d]",Runtime.getRuntime().freeMemory())
, String.format("max memory is: [%d]",Runtime.getRuntime().maxMemory()));
}
public static void main(String args[]) {
String msg = null;
try {
System.out.println(memoryMsg());
List<Object> xs = new ArrayList<>();
int i = 0 ;
while (true) {
xs.add(new byte[1000]);
msg = String.format("%d 1k arrays added.\n%s.\n"
, ++i
, memoryMsg());
}
} finally {
System.out.printf(msg);
}
}
}
はjavac FooMain.java
でそれをコンパイルします。私は次のようでした実験しようとしています。私は私が手500万バイトの最大ヒープサイズでそれを実行すると:
java -Xmx5000000 FooMain
total memory is: [5242880]. free memory is: [4901096]. max memory is: [5767168]
4878 1k arrays added.
total memory is: [5767168]. free memory is: [543288]. max memory is: [5767168].
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.String.toCharArray(String.java:2748)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:3048)
at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2744)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:2702)
at java.util.Formatter.format(Formatter.java:2488)
at java.util.Formatter.format(Formatter.java:2423)
at java.lang.String.format(String.java:2792)
at FooMain.memoryMsg(FooMain.java:7)
at FooMain.main(FooMain.java:21)
数字は十分に接近しているが、それらは正確にに達し終わりtotal memory
の例外を除いて(非常に正確ないないようですmax memory
)。特に、それぞれ1000バイトの5368の配列は、5000000以上、または5242880バイト以上を取る必要があります。これらの数字はどのように理解されるべきですか?
これは私が使用しているJavaで、OpenJDKのソースコードを見てみると
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) Server VM (build 24.80-b11, mixed mode)
ガベージコレクションがその間に蹴られたかもしれません... –
@RobertNiestrojすべての参照が保持されているため、それはできません。 –
@RobertNiestrojなぜGCedする必要がありますか?私は配列を 'List'に追加しています。参照が範囲外になることはありません。 –