5

可能重复:
是否可以动态更改最大 Java 堆大小?

我知道 Java 启动器有一个 XMX 选项,但是是否有某种预处理指令来代替它(这样所有运行我的代码的计算机都会增加它们的堆)。

就像现在一样,java.exe 最多只能达到~280MB(在它崩溃之前)——这正常吗?

4

3 回答 3

4

答案是不”。

内存大小在启动时传递给 JVM。JVM 内部运行的代码无法更改它。

如果你仔细想想,这是有道理的,因为 JVM 是一个不是用 java 编写的程序,它可以执行 java 字节码。允许 Java 代码控制其容器是不安全的。

于 2012-12-08T23:45:55.473 回答
1

如果你可以增加它,它不会是最大值。

它不能增加的原因是它在启动时分配。它只能在 JVM 启动之前设置。

您可以做的是以更高的最大值重新启动应用程序。例如,在开始时检查最大值,如果它不够高,则运行相同的程序,但最大值更高。

注意:如果你使用堆外内存,它可以是 GB 甚至 TB 更多,因为它不是最大值的一部分。

就像现在一样,java.exe 最多只能达到~280MB(在它崩溃之前)——这正常吗?

崩溃可能意味着任何事情,原因可能是任何事情。我建议您更详细地调查它为什么不起作用,我怀疑您会发现最大内存不是问题。(除非您有一台 1 GB 的小型机器,在这种情况下,默认最大内存约为 250 MB)

于 2012-12-09T00:00:20.843 回答
1

“启动具有更多内存的新进程”可以在代码中完成吗?

是的。请参阅这个简单的示例。

import java.awt.EventQueue;
import javax.swing.JOptionPane;
import java.io.File;

class BigMemory {

    public static void main(String[] args) throws Exception {
        if (args.length==0) {
            ProcessBuilder pb = new ProcessBuilder(
                "java",
                "-Xmx1024m",
                "BigMemory",
                "anArgument"
                );
            pb.directory(new File("."));
            Process process = pb.start();
            process.waitFor();
            System.out.println("Exit value: " + process.exitValue());
        } else {
            Runnable r = new Runnable() {
                public void run() {
                    JOptionPane.showMessageDialog(
                        null,
                        "Max Memory: " +
                        Runtime.getRuntime().maxMemory() +
                        " bytes.");
                }
            };
            EventQueue.invokeLater(r);
        }
    }
}
于 2012-12-09T00:04:15.547 回答