Java -Xmx,系统上的最大内存

2022-09-01 21:12:50

我的 Java 应用程序通过运行进程 “java -jar j.jar” 来运行另一个 Java 应用程序。众所周知,J.jar会根据给定的数据集使用大量内存,并且通常会得到一个 OutOfMemoryError 堆。所以我想在上面使用-Xmx,这样我就可以分配尽可能多的内存(或接近)。我正在考虑获取系统上的总内存,然后在-Xmx中指定其中的80-90%。

我的问题有什么解决方案吗?而且,我的解决方案听起来如何?

编辑:我无法减少内存消耗,因为使用的内存是通过Java的内置pack200压缩,我用它来打包一些JAR文件。


答案 1

-XmX 在 32 位窗口上的限制为 -Xmx1500m。共享库会妨碍更大的堆。您需要大约2Gb的RAM才能执行此操作。

在非Windows操作系统上,你可以变得更大,而64位JVM的能力要大得多。

Windows XP不会让你拥有超过3Gb的RAM(不在乎你是否有4Gb的物理,从XP SP3开始)Vista可能不同YMMV。

我在64位Linux上的64位JVM上尝试了-Xmx4000M,它很好。考虑到我有6Gb的物理RAM,这不是一个大的要求。

你80%的想法很有趣,但我的测试系统运行百分比高于这个百分比,没有不良影响。(只要你不尝试做其他任何事情。

另一个评论者是对的,分页出JVM的内存中图像并不快。后来的JVM更擅长做到这一点,不那么混乱(但他们也有更好的垃圾收集器)

如果你不能减少你的内存消耗 - 我知道这有多难 - 那么有很多物理RAM并分配大部分。


答案 2

根据您的操作系统,这可能适用于获取可用和可用内存大小:

java.lang.management.OperatingSystemMXBean mxbean = java.lang.management.ManagementFactory.getOperatingSystemMXBean();
com.sun.management.OperatingSystemMXBean sunmxbean = (com.sun.management.OperatingSystemMXBean) mxbean;
long freeMemory = sunmxbean.getFreePhysicalMemorySize();
long availableMemory = sunmxbean.getTotalPhysicalMemorySize();

从那里,您可以找出80-90%,并以所需的最大内存大小启动jar。

我不知道这是否适用于所有操作系统(即Windows),但是当我用OSX和Linux测试它时,它有效。