XX:MaxDirectMemorySizeのデフォルト値は何ですか?
から http://www.docjar.com/html/api/Sun/misc/VM.Java.html
そうですか:
163 // A user-settable upper limit on the maximum amount of allocatable direct
164 // buffer memory. This value may be changed during VM initialization if
165 // "Java" is launched with "-XX:MaxDirectMemorySize=<size>".
166 //
167 // The initial value of this field is arbitrary; during JRE initialization
168 // it will be reset to the value specified on the command line, if any,
169 // otherwise to Runtime.getRuntime.maxDirectMemory().
170 //
171 private static long directMemory = 64 * 1024 * 1024;
そのため、デフォルトでは64 MBになっています。
_Sun.misc.VM
_ から Runtime.getRuntime.maxMemory()
です。これが_-Xmx
_で構成されています。例:もしあなたがしない設定_-XX:MaxDirectMemorySize
_とdo設定する場合_-Xmx5g
_、「デフォルト」のMaxDirectMemorySize
も5 Gbになり、アプリのヒープ+ダイレクトメモリの合計使用量は5 + 5 = 10 Gbまで増える可能性があります。
JDK8の場合:
64MBは当初任意に設定されており、...
(From: https://github.com/frohoff/jdk8u-dev-jdk/blob/master/src/share/classes/Sun/misc/VM.Java#L186 )
// A user-settable upper limit on the maximum amount of allocatable direct
// buffer memory. This value may be changed during VM initialization if
// "Java" is launched with "-XX:MaxDirectMemorySize=<size>".
//
// The initial value of this field is arbitrary; during JRE initialization
// it will be reset to the value specified on the command line, if any,
// otherwise to Runtime.getRuntime().maxMemory().
//
private static long directMemory = 64 * 1024 * 1024;
...しかし、directMemoryはmaxMemory()に設定されます〜=ここでヒープサイズ(maxDirectMemorySize-Parameterが設定されていない場合):
(from: https://github.com/frohoff/jdk8u-dev-jdk/blob/master/src/share/classes/Sun/misc/VM.Java#L286 )
// Set the maximum amount of direct memory. This value is controlled
// by the vm option -XX:MaxDirectMemorySize=<size>.
// The maximum amount of allocatable direct buffer memory (in bytes)
// from the system property Sun.nio.MaxDirectMemorySize set by the VM.
// The system property will be removed.
String s = (String)props.remove("Sun.nio.MaxDirectMemorySize");
if (s != null) {
if (s.equals("-1")) {
// -XX:MaxDirectMemorySize not given, take default
directMemory = Runtime.getRuntime().maxMemory();
} else {
long l = Long.parseLong(s);
if (l > -1)
directMemory = l;
}
}
テストはこの主張「test.Java.nio.Buffer.LimitDirectMemory.Java」をサポートしているようです:
if (size.equals("DEFAULT"))
return (int)Runtime.getRuntime().maxMemory();