我的 Java 应用程序通过运行“java -jar j.jar”进程来运行另一个 Java 应用程序。众所周知,J.jar 会根据给定的数据集使用大量内存,并且经常会获得 OutOfMemoryError 堆。所以我想在它上面使用-Xmx,这样我就可以分配尽可能多的内存(或接近)。我正在考虑获取系统上的总内存,然后在 -Xmx 中指定其中的 80-90%。
我的问题有什么解决办法吗?而且,我的解决方案听起来如何?
编辑:我无法减少内存消耗,因为正在使用的内存是 Java 的内置 pack200 压缩,我用它来打包一些 JAR 文件。
最佳答案
在 32 位窗口上 -XmX 的限制是 -Xmx1500m。 共享库阻碍了更大的堆。 您需要大约 2Gb 的 RAM 才能执行此操作。
在非 Windows 操作系统上,您可以做得更大,而 64 位 JVM 可以做得更多。
Windows XP 不会让您拥有超过 3Gb 的 RAM(不管您是否拥有 4Gb 物理内存,从 XP SP3 开始) Vista 可能与 YMMV 不同。
我已经在 64 位 Linux 上的 64 位 JVM 上尝试了 -Xmx4000M,它很好。 考虑到我有 6Gb 的物理内存,这不是一个大要求。
您的 80% 想法很有趣,但我的测试系统运行的百分比比没有不良影响的要高。 (只要你不尝试做任何其他事情。)
另一位评论者是对的,分页出 JVM 的内存镜像并不快。 后来的 JVM 在这方面做得更好(但他们也有更好的垃圾收集器)
如果你不能减少内存消耗——我知道这有多难——那么就拥有大量的物理内存并分配其中的大部分。
关于Java -Xmx,系统最大内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1190837/