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

时间:2009-06-19 02:08:38

标签: java windows memory-management

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

环境是32位Windows机器,内存为4GB。 JDK是Sun 1.5.0_12。

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

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

4 个答案:

答案 0 :(得分:2)

我在设置方面遇到了很多麻烦(32位系统上的Java - msw和其他系统),只需将1GB以下的内存保存到JVM中就可以解决这些问题。

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

我在同一系统上运行了几个JVM(每个内存小于1GB)的稳定性和性能。

答案 1 :(得分:1)

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

在2GB用户空间内拥有3GB的用户空间应该会有所帮助,但如果你的2GB交换空间不足,我认为3GB会让情况变得更糟。你的页面文件有多大?最大化了吗?

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

答案 2 :(得分:0)

  

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

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

嗯,更确切地说,它是上演的,而上述内容仅适用于终身(长寿)对象。对于年轻的对象,GC仍然使用停止和复制收集器完成,这对于使用短期对象(以及所有典型的Java程序创建许多短期对象)要好得多。

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

因此,JVM需要的系统内存远远多于VM中运行的代码,因为管理和垃圾收集会产生大量开销。

  

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

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

答案 3 :(得分:0)

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

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