web-dev-qa-db-ja.com

XXのデフォルト:MaxDirectMemorySize

XX:MaxDirectMemorySizeのデフォルト値は何ですか?

29
Timur Fanshteyn

から 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になっています。

17
John Gardner

_Sun.misc.VM_ から Runtime.getRuntime.maxMemory() です。これが_-Xmx_で構成されています。例:もしあなたがしない設定_-XX:MaxDirectMemorySize_とdo設定する場合_-Xmx5g_、「デフォルト」のMaxDirectMemorySizeも5 Gbになり、アプリのヒープ+ダイレクトメモリの合計使用量は5 + 5 = 10 Gbまで増える可能性があります。

20
leventov

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」をサポートしているようです:

(from https://github.com/frohoff/jdk8u-dev-jdk/blob/da0da73ab82ed714dc5be94acd2f0d00fbdfe2e9/test/Java/nio/Buffer/LimitDirectMemory.Java#L74

 if (size.equals("DEFAULT"))
            return (int)Runtime.getRuntime().maxMemory();
4
Robert Wunsch