可能重复:
是否可以动态更改最大 Java 堆大小?
我知道 Java 启动器有一个 XMX 选项,但是是否有某种预处理指令来代替它(这样所有运行我的代码的计算机都会增加它们的堆)。
就像现在一样,java.exe 最多只能达到~280MB(在它崩溃之前)——这正常吗?
可能重复:
是否可以动态更改最大 Java 堆大小?
我知道 Java 启动器有一个 XMX 选项,但是是否有某种预处理指令来代替它(这样所有运行我的代码的计算机都会增加它们的堆)。
就像现在一样,java.exe 最多只能达到~280MB(在它崩溃之前)——这正常吗?
答案是不”。
内存大小在启动时传递给 JVM。JVM 内部运行的代码无法更改它。
如果你仔细想想,这是有道理的,因为 JVM 是一个不是用 java 编写的程序,它可以执行 java 字节码。允许 Java 代码控制其容器是不安全的。
如果你可以增加它,它不会是最大值。
它不能增加的原因是它在启动时分配。它只能在 JVM 启动之前设置。
您可以做的是以更高的最大值重新启动应用程序。例如,在开始时检查最大值,如果它不够高,则运行相同的程序,但最大值更高。
注意:如果你使用堆外内存,它可以是 GB 甚至 TB 更多,因为它不是最大值的一部分。
就像现在一样,java.exe 最多只能达到~280MB(在它崩溃之前)——这正常吗?
崩溃可能意味着任何事情,原因可能是任何事情。我建议您更详细地调查它为什么不起作用,我怀疑您会发现最大内存不是问题。(除非您有一台 1 GB 的小型机器,在这种情况下,默认最大内存约为 250 MB)
“启动具有更多内存的新进程”可以在代码中完成吗?
是的。请参阅这个简单的示例。
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);
}
}
}