Default for XX:MaxDirectMemorySize

59,775

Solution 1

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.

Solution 2

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.

Solution 3

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();
Share:
59,775
Timur Fanshteyn
Author by

Timur Fanshteyn

Software Developer, Team Manager. Specializing in Java and .Net technologies in financial transaction processing.More at http://blog.tfanshteyn.com

Updated on January 31, 2020

Comments

  • Timur Fanshteyn
    Timur Fanshteyn over 4 years

    What is the default value for XX:MaxDirectMemorySize?

  • StaxMan
    StaxMan almost 11 years
    This -- docs.oracle.com/cd/E15289_01/doc.40/e15062/… -- directly contradicts it, claiming it'd be "unlimited"?
  • Admin
    Admin almost 11 years
    The docs.oracle.com link points to the docs for JRockit, not OpenJDK.
  • Asaf Mesika
    Asaf Mesika almost 11 years
    The comment suggests that the value, if not specified on the command line, is taken from maxDirectMemory(). This link here (mail.openjdk.java.net/pipermail/core-libs-dev/2012-January/‌​…) correct the typo here (there's no such method) to maxMemory(), which in turn equals to the -Xmx you set on the command line.
  • Cheeso
    Cheeso about 10 years
    The comment is wrong, according to my reading of the code. But not only because there is no such method. The part that says, "The initial value of this field is arbitrary" seems wrong. See line 253 in the link at docjar.com/html/api/sun/misc/VM.java.html . In the openJDK code, in the absence of a value for MaxDirectMemorySize, it uses the default of 64M. If MaxDirectMemorySize is present and is set to -1, then it uses Runtime.getRuntime().maxMemory().
  • John Gardner
    John Gardner about 10 years
    @cheeso, yes, that's consistent with what I said in my comment on the original question in 2010 :D
  • jmj
    jmj almost 9 years
  • John Gardner
    John Gardner almost 9 years
    that might be the case for jdk7 on openjdk, in May of 2014. but this question was specifically about the default size on the sun 1.6 jvm, back in 2010.
  • jon
    jon over 8 years
    This answer is still incorrect. As the comment in the code states, the value on line 171 is arbitrary and reset later. This is because the property "sun.nio.MaxDirectMemorySize" is always set, even if -XX:MaxDirectMemorySize is not specified on the command line. In 6b27, it's on hotspot/src/share/vm/prims/jvm.cpp:344 (copies value from option to property) and hotspot/src/share/vm/runtime/globals.hpp:3530 (default of -1). In 7u40, it's jvm.cpp lines 349-357, and in 8u40 it's jvm.cpp 359-367.
  • Matt
    Matt almost 7 years
    @leventov: in future, please add a new answer, rather than making such radical edits to someone else's answer.