0

以下のプログラムを実行すると、forループがi=1031521で実行を開始したときに例外が発生しました。このタイプのメモリ使用量を克服するにはどうすればよいですか?

class wwww
    {
        public static void main(String args[])
        {
            String abc[]=new String[4194304];
            String wwf="";
            int s_count=524286;
            for(int i=0;i<4194304;i++)
            {
                System.out.println("----------enter--------"+i);
                abc[i]=""+i;
                System.out.println("----------exit--------"+i);
            }
        }
    }

例外は次のとおりです。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2882)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.
java:100)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390
)
    at java.lang.StringBuilder.append(StringBuilder.java:119)
    at wwww.main(wwww.java:12)
4

3 に答える 3

1

これは、jvmに割り当てられたすべてのヒープスペースを使い果たしたためです。

プログラムの実行中に引数を使用して、割り当てるヒープサイズを指定できます。

これは例です:

java -Xmx256m MyClass

ここでは、最大256MBのヒープスペースが割り当てられます

于 2012-11-28T06:50:47.807 に答える
1

このタイプのメモリ使用量を克服するにはどうすればよいですか?

このタイプのメモリ使用量は実行しないでください。一般的な形式の4194304文字列を作成しています""+i。その形式の4194304文字列を一度に使用する必要はありません。一度に必要なのは1つだけで、必要なときにいつでも作成できます。

于 2012-11-28T07:45:57.080 に答える
0

次のいずれかを実行できます。

  1. プログラムに与えるヒープサイズを増やします。これは、への-Xmxコマンドライン引数を介して行われjavaます。
  2. より少ないメモリを使用するようにプログラムを再設計します。これらすべての文字列を一度にメモリに保持する必要が本当にありますか?
于 2012-11-28T06:52:28.513 に答える