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