Java本地进程的内存使用情况

调整使用本机C ++库的用Java编写的服务器应用程序的最佳方法是什么?

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

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

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

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

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

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

我在这里找到了关于JNI内存管理的一些信息,这里是关于内存管理的JVM JNI 部分 。

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

通过把jconsole连接到你的jvm,你可以更好地理解你的堆分配。

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

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

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

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

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

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

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

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

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