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

Ama*_*wal 22 java memory-management

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

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

编辑:我不能减少内存消耗,因为正在使用的内存是Java的内置pack200压缩,我用它来打包一些JAR文件.

Tim*_*oft 13

在32位窗口上-XmX的限制是-Xmx1500m.共享库阻碍了更大的堆.你需要大约2Gb的RAM才能做到这一点.

在非Windows操作系统上,你可以做得更大,64Bit JVM的功能更多.

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

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

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

而另一位评论者是对的,分页你的JVM的内存中图像并不快.后来JVM更擅长这样做(但他们也有更好的垃圾收集器)

如果你不能减少你的记忆消耗 - 而且我知道它有多难 - 然后有很多物理ram并分配大部分内存.


joe*_*e p 5

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

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();
Run Code Online (Sandbox Code Playgroud)

从那里,您可以计算出 80-90% 并以您想要的最大内存大小启动您的 jar。

我不知道这适用于所有操作系统(即 Windows),但是当我在 OSX 和 Linux 上对其进行测试时它可以工作。

  • 谢谢!我在 Windows 和 Linux 上尝试了该命令,它运行良好。 (2认同)
  • 貌似这个只能在sun JVM上运行,我需要部署到IBM JVM上,所以不能运行,每个都会用sun。 (2认同)