有没有办法在代码本身中增加Java堆空间?

时间:2012-12-08 23:35:49

标签: java memory jvm jvm-arguments

  

可能重复:
  Is it possible to dynamically change maximum java heap size?

我知道Java启动器有一个XMX选项,但是有一些预处理指令可以做到这一点(所以运行我的代码的所有计算机都会增加它们的堆)。

就像现在一样,java.exe只能达到~280MB最大值(崩溃之前) - 这是正常的吗?

3 个答案:

答案 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);
        }
    }
}