Java进程内存使用值得注意的几点

1. 当我们通过命令行启动一个Java应用时,JVM是作为一个一般的操作系统进程运行的。因此,Java运行时和其它进程一样都面临着本机处理器提供的寻址能力和操作系统提供的用户空间对内存使用的限制。
32位处理器寻址范围可达2^32即4GB, 64位处理器寻址范围可达2^64位即16exabyte,其中相当一部分寻址范围都会被操作系统内核占用。Windows默认占用的的内存是2GB,导致32位Windows下任何进程最多占用2GB内存。

进一步阅读:
http://sinewalker.wordpress.com/2007/03/04/32-bit-windows-and-jvm-virtual-memory-limit/

2. 有时会发现同样的Java应用在64位机器上运行时比在32位机器上用了更多的内存,性能也有所下降。这是因为JVM中指向对象的指针在32位下占用4个字节,在64位下要占用8个字节。
进一步阅读:
http://blog.juma.me.uk/2008/10/14/32-bit-or-64-bit-jvm-how-about-a-hybrid/
http://blog.juma.me.uk/tag/compressed-oops/
http://www.docstoc.com/docs/36747975/Improving-64-bit-Java-performance-using-Compressed-References

3. HotSpot JVM从1.6.0_14开始提供-XX:+UseCompressedOops选项改善其在64位下的表现。在java堆小于32G情况下打开该选项,JVM会将引用指针压缩至4个字节来减少内存占用。1.6.0_23之后改选项就默认打开了。
进一步阅读:
http://www.oracle.com/technetwork/java/javase/6u14-137039.html
http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html

4. Java进程用到的内存重要非heap和heap两大块,通过-Xms和-Xmx设置的只是heap的大小。所以经常见到Java进程占用比-Xmx设置更多的内存就没啥奇怪了。

你可能感兴趣的:(java)