2009-06-19 86 views
4

调整使用本机C++库的使用Java编写的服务器应用程序的最佳方式是什么?使用本机进程的Java内存使用情况

该环境是一个32位Windows机器,具有4GB的RAM。 JDK是Sun 1.5.0_12。

在启动时,Java进程获得1024MB内存(-Xmx),但由于缺少堆空间,我经常看到OutOfMemoryErrors。如果内存增加到1200MB,则由于缺少交换空间而发生OutOfMemoryErrors。内存在JVM和本地进程之间如何共享?

Windows/3GB切换器对本机进程和Sun JVM有任何影响吗?

回答

2

我在设置(32位系统上的Java - msw和其他)上遇到了很多麻烦,它们都是通过在JVM的* 1GB内存下保留*来解决的。

否则,如上所述,系统中该进程的实际占用内存将超过2GB;在那个时候,我正在“沉默地死亡”的过程 - 没有错误,没有任何警告,只是这个过程非常安静地终止。

我在同一个系统上运行多个JVM(每个JVM都不到1GB RAM),我获得了更高的稳定性和性能。

0

在JVM和本机进程之间共享内存如何?

Sun的JVM的垃圾收集器是标记和扫描的,具有启用并发GC和增量GC的选项。

嗯,更准确地说,它是上演的,而上述只适用于终身(长寿命)的对象。对于年轻的对象,GC仍然使用停止和复制收集器,这对于处理短暂对象(并且所有典型的Java程序创建许多短暂对象)来说都更好。

复制收集器遍历堆中的所有元素,如果它们被引用则将它们复制到新堆中,然后丢弃前一堆。因此1M个实时对象需要高达2M的实际内存:如果每个对象都处于活动状态,则在垃圾收集期间将会有两个副本。

因此,JVM需要比VM内运行的代码多得多的系统内存,因为管理和垃圾回收会有相当大的开销。

Windows/3GB交换机对本机进程和Sun JVM有任何影响吗?

/3GB的允许用户虚拟存储器地址空间是3GB,但仅用于可执行文件,其头标有IMAGE_FILE_LARGE_ADDRESS_AWARE。据我所知,Sun的java.exe不是。我没有Windows系统,所以我无法验证。

1

我在JNI memory management here上找到了一些信息,这里是JVM JNI section on memory management

在2GB的用户空间上拥有3GB的用户空间应该会有所帮助,但是如果您在2GB的交换空间时出现问题,我认为3GB会让情况变得更糟。你的页面文件有多大?它最终出来了吗?

通过将jconsole连接到您的jvm,您可以更好地了解您的堆分配情况。

0

不幸的是,您还没有很好地解释您的问题。真正的问题是---为什么Java过程增长如此之多。你有内存泄漏吗?你有没有真正的理由在JVM中拥有那么多的数据?

C++库是从C堆栈中分配自己的内存,还是从Java对象空间分配内存,还是完全在做其他事情?