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

4
什么是调整使用本地C ++库的Java服务器应用程序的最佳方法?
环境是一台带有4GB RAM的32位Windows机器。JDK是Sun 1.5.0_12。
在启动时,Java进程被赋予1024MB的内存(-Xmx),但我经常看到由于堆空间不足而导致OutOfMemoryErrors。如果将内存增加到1200MB,则由于交换空间不足而出现OutOfMemoryErrors。内存如何在JVM和本地进程之间共享?
Windows /3GB开关对本地进程和Sun JVM有任何影响吗?
4个回答

2

我曾经在32位系统上(如msw等)使用Java时遇到了很多问题,但这些问题都被通过为JVM保留少于1GB的内存而解决。

否则,如上所述,该进程在系统中实际占用的内存将超过2GB;此时,该进程会“默默死亡”——没有错误、没有警告,只是进程非常安静地终止。

在同一系统上运行多个JVM(每个JVM的内存小于1GB),可以获得更好的稳定性和性能。


1

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

拥有3GB用户空间比2GB用户空间更有帮助,但如果你在2GB时已经遇到了交换空间不足的问题,我认为3GB只会让情况变得更糟。你的页面文件有多大?已经达到最大值了吗?

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


0
JVM和本地进程之间的内存是如何共享的?
Sun的JVM垃圾收集器是标记-清除,具有启用并发和增量GC的选项。
更准确地说,它是分阶段的,上述内容仅适用于tenured(长期)对象。对于年轻对象,GC仍然使用停止-复制收集器,这对于处理短寿命对象(所有典型的Java程序都会创建许多短寿命对象)更好。
复制收集器遍历堆中的所有元素,如果它们被引用,则将它们复制到新堆中,然后丢弃原始堆。因此,1M的活动对象需要高达2M的实际内存:如果每个对象都是活动的,则在垃圾收集期间将有两个副本。
因此,JVM需要比可在VM中运行的代码可用的系统内存要多得多,因为管理和垃圾收集存在相当大的开销。
Windows /3GB开关是否对本地进程和Sun JVM产生影响?

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


0

很遗憾,您没有充分解释您的问题。真正的问题是——为什么Java进程会增长这么多。您是否有内存泄漏?您是否有充分的理由在JVM中拥有那么多数据?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接