代码之家  ›  专栏  ›  技术社区  ›  parkr

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

  •  4
  • parkr  · 技术社区  · 16 年前

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

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

    Java进程在启动时给出了1024MB的内存(-XMX),但由于缺少堆空间,我经常会看到OutOfMeMyRebug。如果内存增加到1200MB,则会由于缺少交换空间而出现内存不足错误。JVM和本机进程之间如何共享内存?

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

    4 回复  |  直到 16 年前
        1
  •  2
  •   gvlx    16 年前

    我在这个设置上遇到了很多麻烦(Java在32位系统上——MSW和其他),它们都是通过在JVM中保留1GB的RAM来解决的。

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

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

        2
  •  1
  •   Community CDub    8 年前

    我发现了一些关于 JNI memory management here 这是JVM JNI section on memory management .

    3GB的用户空间超过2GB的用户空间应该会有所帮助,但是如果在2GB的交换空间用完时出现问题,我认为3GB只会使情况变得更糟。你的页面文件有多大?它是最大限度的吗?

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

        3
  •  0
  •   ephemient    16 年前

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

    Sun的JVM的垃圾收集器是MarkandSweep,有启用并发和增量GC的选项。

    好吧,更准确地说,它是分阶段的,上面只适用于终身(长寿)的物体。对于年轻对象,GC仍然使用停止和复制收集器来完成,这对于使用短命对象(以及所有典型的Java程序创建许多短命对象)都要好得多。

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

    因此,与在虚拟机中运行的代码相比,JVM需要的系统内存要多得多,因为管理和垃圾收集的开销很大。

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

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

        4
  •  0
  •   vy32    16 年前

    不幸的是,你没有很好地解释你的问题。真正的问题是,为什么Java进程如此庞大。你有记忆泄漏吗?在JVM中有这么多数据的真正原因吗?

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