7

我的 Linux 机器上有 16GB RAM,并使用 -Xmx4096m 参数将最大 Java 堆内存设置为 4GB。但是当我开始我的过程时出现以下错误。

最大堆大小无效:-Xmx4096m 指定的大小超过了最大可表示大小。无法创建Java虚拟机。

当我将值设置为 2048m 时它工作正常。

我需要更改任何其他配置参数以增加堆大小吗?

提前致谢!

4

3 回答 3

2

它不仅与您拥有多少内存有关

在 32 位机器上,最大可用堆为 1628MB 在 64 位机器上,最大可用堆为 2^64(理论上),但有限制

于 2012-09-28T10:07:12.250 回答
1

您使用的是什么操作系统?查看Oracle 热点常见问题解答。请注意以下部分:

为什么我不能使用 32 位 JVM 获得更大的堆?

如果您使用的是 32 位系统,请将其降低到 1.6G。对于 64 位系统,请查看提供的链接中支持的系统列表。

于 2012-09-28T10:16:37.350 回答
0

试试 -Xmx4066M 比4G少一点

键入命令提示符 (cmd) 后

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

显示以下结果,以便从位到 Mb,您必须将其除以 1024^2=1'048'576 bits/mb

  • uintx HeapSizePerGCThread = 87241520 位(83,1999 ... MiB)
  • uintx InitialHeapSize = 268435456 位 (256 MiB)
  • uintx LargePageHeapSizeThreshold = 134217728 位 (128 MiB)
  • uintx MaxHeapSize = 4263510016 位 (4066 MiB)<4G

当我尝试更改 -Xmx4G 并显示时,这显示给我 MaxHeapSize =0 ...

但是当我做 -XmX4066M 它对我有用。

我的问题是 InitalHeapSize 我尝试更改 -Xms2G 或 -Xms2000M 但它对我不起作用或每次都会刷新......

在我做了一个新项目之后

public class MaxMemory {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    Runtime rt = Runtime.getRuntime();
    long totalMem = rt.totalMemory();
    long maxMem = rt.maxMemory();
    long freeMem = rt.freeMemory();
    long usedMem= totalMem-freeMem;
    double megs = 1048576.0;

    System.out.println ("Max Memory:   " + maxMem + " (" + (maxMem/megs) + " MiB)");
    System.out.println ("Total Memory: " + totalMem + " (" + (totalMem/megs) + " MiB)");
    System.out.println ("Used:  " + usedMem + " (" + (usedMem/megs) + " MiB)");
    System.out.println ("Free Memory:  " + freeMem + " (" + (freeMem/megs) + " MiB)");  

}

它使我在我的一个程序中得到以下结果:

最大内存:259522560 (247.5 MiB)

总内存:259522560 (247.5 MiB)

已使用:246496784 (235.07765197753906 MiB)

可用内存:13025776 (12.422348022460938 MiB)

我可能不会增加这个我认为是InitialHeapSize的“最大内存”

我试图改变它

控制面板 > java 控制面板 > java (tab) > view (button) > RuntimeParameter (block) > -Xms2000M

,当然出去后我点击申请,但什么也没发生......仍然耗尽我的记忆;'[

于 2017-10-11T15:25:22.587 回答