【问题标题】:Java memory usage with native processes本机进程的 Java 内存使用情况
【发布时间】:2009-06-19 02:08:38
【问题描述】:

优化使用原生 C++ 库的 Java 编写的服务器应用程序的最佳方法是什么?

环境是具有 4GB RAM 的 32 位 Windows 计算机。 JDK 是 Sun 1.5.0_12。

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

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

【问题讨论】:

    标签: java windows memory-management


    【解决方案1】:

    我在使用该设置时遇到了很多问题(32 位系统上的 Java - msw 和其他系统),所有问题都通过为 JVM 保留*不到 1GB 的 RAM 来解决。

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

    我在同一系统上运行多个 JVM(每个 JVM 的 RAM 低于 1GB)时获得了更高的稳定性和性能。

    【讨论】:

      【解决方案2】:

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

      拥有 3GB 用户空间而不是 2GB 用户空间应该会有所帮助,但如果您遇到 2GB 交换空间不足的问题,我认为 3GB 只会让情况变得更糟。你的页面文件有多大?刷爆了吗?

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

      【讨论】:

        【解决方案3】:

        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系统,所以无法验证。

        【讨论】:

          【解决方案4】:

          很遗憾,您没有很好地解释您的问题。真正的问题是 --- 为什么 Java 进程增长如此之快。你有内存泄漏吗?你有真正的理由在 JVM 中拥有这么多数据吗?

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

          【讨论】:

            猜你喜欢
            • 2011-02-14
            • 2017-02-14
            • 2018-05-09
            • 1970-01-01
            • 1970-01-01
            • 2010-10-19
            • 2016-05-30
            • 2023-03-24
            • 1970-01-01
            相关资源
            最近更新 更多