调优使用原生C++库的Java语言编写的服务器应用程序的最佳方式是什么?
该环境是一台具有4 4GB的32位Windows计算机。JDK是Sun 1.5.0_12。
Java进程在启动时被分配了1024MB的内存(-Xmx),但是我经常看到OutOfMemoryErrors,因为缺少堆空间。如果内存增加到1200MB,则由于缺少交换空间而发生OutOfMemoryErrors。如何在JVM和本机进程之间共享内存?
Windows开关对本机进程和Sun /3GB有影响吗?
发布于 2009-06-19 20:43:47
我在这个设置上遇到了很多问题(32位系统上的Java- msw和其他系统),这些问题都是通过为JVM保留*不到1 1GB的RAM来解决的。
否则,如上所述,该进程在系统中实际占用的内存将超过2 2GB;在这一点上,我对该进程进行了“静默死亡”--没有错误,没有警告,只是进程非常安静地终止了。
在同一系统上运行几个JVM (每个JVM的RAM都不到1 1GB )时,我获得了更高的稳定性和性能。
发布于 2009-06-19 20:31:23
我在JNI memory management here上找到了一些信息,下面是JNI section on memory management。
3 2GB的用户空间超过2 2GB的用户空间应该会有所帮助,但如果你在2 2GB时遇到交换空间不足的问题,我认为3 2GB只会让情况变得更糟。你的页面文件有多大?它是不是已经满了?
通过将jconsole连接到jvm,您可以更好地了解堆分配。
发布于 2009-06-19 03:59:16
如何在JVM和本机进程之间共享内存?
Sun的JVM的垃圾收集器是标记和清除的,具有支持并发和增量GC的选项。
好吧,更准确地说,它是阶段性的,上面的规定只适用于长期(长期)对象。对于年轻的对象,GC仍然是使用stop-and-copy收集器完成的,这对于处理短期对象要好得多(并且所有典型的Java程序都会创建许多短期对象)。
复制收集器遍历堆中的所有元素,如果它们被引用,则将它们复制到新堆中,然后丢弃前一个堆。因此,1M的活动对象需要高达2M的实际内存:如果每个对象都是活动的,则在垃圾收集期间将有两个所有内容的副本。
因此,JVM需要的系统内存远远超过在VM中运行的代码所能使用的内存,因为管理和垃圾收集需要大量的开销。
Windows /3GB开关对本机进程和Sun JVM有影响吗?
/3GB允许用户虚拟内存地址空间为3 3GB,但仅适用于标头标记为IMAGE_FILE_LARGE_ADDRESS_AWARE的可执行文件。据我所知,Sun的java.exe并非如此。我这里没有Windows系统,所以我无法验证。
https://stackoverflow.com/questions/1016053
复制相似问题