On 05/06/2012 15:29, Chris Dennis wrote:
Alan,
The 5g issue is kind of complicated. The current behavior of 32bit JVMs as I
understand it is that the 5g will get narrowed down to a 32bit value by the
printf used to propagate the value across from the launcher and in to the
system properties of the spawned JVM. Consider the result of running the
following test class on a 32bit and 64bit VM:
public class TestMaxDirectMemory {
public static void main(String[] args) {
System.out.println(sun.misc.VM.maxDirectMemory());
}
}
$ java -showversion -d32 -XX:MaxDirectMemorySize=5g TestMaxDirectMemory
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-11M3635)
Java HotSpot(TM) Client VM (build 20.6-b01-415, mixed mode)
1073741824
$ java -showversion -d64 -XX:MaxDirectMemorySize=5g TestMaxDirectMemory
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-11M3635)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode)
5368709120
This is why in the LimitDirectMemory.java source I added some logic based on
sun.arch.data.model to perform the equivalent narrowing conversion internally.
It seems to me that we have a bunch of open and independent questions here:
1. What to do about the current MaxDirectMemorySize=-1 behavior. Changing this might be
a little tricky since -1 is currently used to propagate "unset" - causing the
JDK code that consumes this value to use the default value.
2. What to do about the current error being thrown when trying to set
MaxDirectMemorySize to an illegal value?
$ ${JAVA_HOME_16}/bin/java -XX:MaxDirectMemorySize=foo
Unrecognized VM option 'MaxDirectMemorySize=foo'
Could not create the Java virtual machine.
$ ${JAVA_HOME_17}/bin/java -XX:MaxDirectMemorySize=foo
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
3. Should we change the behavior for out of range values (e.g. 5G passed to a
32bit VM) passed to MaxDirectMemorySize?
Once these are decided there is also the question of what bug-id each of these
can or should be fixed under.
Chris
I would suggest moving the thread to hotspot-dev or hotspot-runtime-dev.
On attempting to use -XX:MaxDirectMemorySize=5g on a 32-bit system then
ideally this should be a fatal error, I don't think we would truncate
the value to 32-bit. On specifying a value of -1 then I would suggest it
should be consistent to other others, for example -XX:MaxHeapSize=-1
will fail with an unrecognized VM option error.
-Alan.