Maximum Java heap size of a 32-bit JVM on a 64-bit OS

前端 未结 17 2478

The question is not about the maximum heap size on a 32-bit OS, given that 32-bit OSes have a maximum addressable memory size of 4GB, and that the JVM\'s max heap size depen

17条回答
  •  萌比男神i
    2020-11-22 07:09

    You can ask the Java Runtime:

    public class MaxMemory {
        public static void main(String[] args) {
            Runtime rt = Runtime.getRuntime();
            long totalMem = rt.totalMemory();
            long maxMem = rt.maxMemory();
            long freeMem = rt.freeMemory();
            double megs = 1048576.0;
    
            System.out.println ("Total Memory: " + totalMem + " (" + (totalMem/megs) + " MiB)");
            System.out.println ("Max Memory:   " + maxMem + " (" + (maxMem/megs) + " MiB)");
            System.out.println ("Free Memory:  " + freeMem + " (" + (freeMem/megs) + " MiB)");
        }
    }
    

    This will report the "Max Memory" based upon default heap allocation. So you still would need to play with -Xmx (on HotSpot). I found that running on Windows 7 Enterprise 64-bit, my 32-bit HotSpot JVM can allocate up to 1577MiB:

    [C:scratch]> java -Xmx1600M MaxMemory
    Error occurred during initialization of VM
    Could not reserve enough space for object heap
    Could not create the Java virtual machine.
    [C:scratch]> java -Xmx1590M MaxMemory
    Total Memory: 2031616 (1.9375 MiB)
    Max Memory:   1654456320 (1577.8125 MiB)
    Free Memory:  1840872 (1.75559234619 MiB)
    [C:scratch]>
    

    Whereas with a 64-bit JVM on the same OS, of course it's much higher (about 3TiB)

    [C:scratch]> java -Xmx3560G MaxMemory
    Error occurred during initialization of VM
    Could not reserve enough space for object heap
    [C:scratch]> java -Xmx3550G MaxMemory
    Total Memory: 94240768 (89.875 MiB)
    Max Memory:   3388252028928 (3184151.84297 MiB)
    Free Memory:  93747752 (89.4048233032 MiB)
    [C:scratch]>
    

    As others have already mentioned, it depends on the OS.

    • For 32-bit Windows: it'll be <2GB (Windows internals book says 2GB for user processes)
    • For 32-bit BSD / Linux: <3GB (from the Devil Book)
    • For 32-bit MacOS X: <4GB (from Mac OS X internals book)
    • Not sure about 32-bit Solaris, try the above code and let us know.

    For a 64-bit host OS, if the JVM is 32-bit, it'll still depend, most likely like above as demonstrated.

    -- UPDATE 20110905: I just wanted to point out some other observations / details:

    • The hardware that I ran this on was 64-bit with 6GB of actual RAM installed. The operating system was Windows 7 Enterprise, 64-bit
    • The actual amount of Runtime.MaxMemory that can be allocated also depends on the operating system's working set. I once ran this while I also had VirtualBox running and found I could not successfully start the HotSpot JVM with -Xmx1590M and had to go smaller. This also implies that you may get more than 1590M depending upon your working set size at the time (though I still maintain it'll be under 2GiB for 32-bit because of Windows' design)

提交回复
热议问题