首页 文章

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

提问于
浏览
4

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

该环境是一台32位Windows机器,内存为4GB . JDK是Sun 1.5.0_12 .

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

Windows / 3GB开关对本机进程和Sun JVM有什么影响吗?

4 回答

  • 1

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

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

    我在同一系统上运行了几个JVM(每个RAM低于1GB)的稳定性和性能 .

  • 0

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

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

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

  • 2

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

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

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

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

    因此,JVM需要比VM中运行的代码可用的系统内存更多的系统内存,因为管理和垃圾收集存在大量开销 .

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

    /3GB 允许用户虚拟内存地址空间为3GB,但仅适用于 Headers 为 IMAGE_FILE_LARGE_ADDRESS_AWARE 的可执行文件 . 据我所知,Sun的 java.exe 不是 . 我没有't have a Windows system here, so I can' t验证 .

  • 0

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

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

相关问题