Default for XX:MaxDirectMemorySize

后端 未结 3 1043
太阳男子
太阳男子 2021-01-01 09:31

What is the default value for XX:MaxDirectMemorySize?

相关标签:
3条回答
  • 2021-01-01 10:07

    From sun.misc.VM, it's Runtime.getRuntime.maxMemory(), that's what is configured with -Xmx. E. g. if you don't configure -XX:MaxDirectMemorySize and do configure -Xmx5g, the "default" MaxDirectMemorySize will also be 5 Gb, and the total heap+direct memory usage of the app may grow up to 5 + 5 = 10 Gb.

    0 讨论(0)
  • 2021-01-01 10:21

    From http://www.docjar.com/html/api/sun/misc/VM.java.html

    i see:

     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;
    

    so it appears to default to 64 megs.

    0 讨论(0)
  • 2021-01-01 10:26

    For JDK8:

    The 64MB are set arbitrarily initially, ...

    (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;
    

    ... but then the directMemory is set to maxMemory() ~= Heapsize here (if the maxDirectMemorySize-Parameter is not set):

    (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;
          }
      }
    

    The test seems to support this claim, "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();
    
    0 讨论(0)
提交回复
热议问题