调整使用Java编写的使用本机C ++库的服务器应用程序的最佳方法是什么?
环境是32位Windows机器,内存为4GB。 JDK是Sun 1.5.0_12。
Java进程在启动时被给予1024MB内存(-Xmx),但由于缺少堆空间,我经常看到OutOfMemoryErrors。如果内存增加到1200MB,则由于缺少交换空间而发生OutOfMemoryErrors。如何在JVM和本机进程之间共享内存?
Windows / 3GB开关是否对本机进程和Sun JVM有任何影响?
答案 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对象空间分配内存,还是完全做其他事情?