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 に答える