1

TestRun を実行しようとすると、次のエラーが発生しました。いろいろ試してみましたがわかりませんでした。助けて!Java Heap のメモリ不足エラーが発生しました。次のコードを実行すると、実行に時間がかかり、最終的に以下のようなエラーが表示されます。このコードを正しくする方法は? これをデバッグするのは私にとって非常に困難です.Exception in thread "main" java.lang.OutOfMemoryError: Java heap space.

package website;

import java.util.ArrayList;

import Combination.averageM;
import Combination.boatandstreamM;
import Combination.fractionsM;
import Combination.interestM;
import Combination.measurementM;
import Combination.numberM;
import Combination.percentageM;
import Combination.profitandlossM;
import Combination.simplificationM;
import Combination.timeanddistanceM;
import Combination.timeandwM;

public class ArrayOfSums {

    ArrayList<sums> als;
    String Q, A, scale, finalvalue;
    double fv;
    NewOptions pencil = new NewOptions();
    sums sumsObj;

    public ArrayList<sums> giveArrayOfSums(int x) {

        als = new ArrayList<sums>();
        int n = 0;
        switch (x) {

            case 1:
                simplificationM pen = new simplificationM();

                while (n <= 19) {

                    pen.simplificationM();
                    pencil.optionsCreator(pen.fv, pen.scale);
                    sumsObj = new sums(pen.Q, pen.A, pen.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3, pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 2:
                numberM pen1 = new numberM();

                while (n <= 19) {

                    pen1.numberM();
                    pencil.optionsCreator(pen1.fv, pen1.scale);
                    sumsObj = new sums(pen1.Q, pen1.A, pen1.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3, pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 3:
                percentageM pen2 = new percentageM();

                while (n <= 19) {

                    pen2.percentageM();
                    pencil.optionsCreator(pen2.fv, pen2.scale);
                    sumsObj = new sums(pen2.Q, pen2.A, pen2.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3, pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 4:
                numberM pen3 = new numberM();

                while (n <= 19) {

                    pen3.numberM();
                    pencil.optionsCreator(pen3.fv, pen3.scale);
                    sumsObj = new sums(pen3.Q, pen3.A, pen3.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3, pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 5:
                fractionsM pen4 = new fractionsM();

                while (n <= 19) {

                    pen4.fractionsM();
                    pencil.optionsCreator(pen4.fv, pen4.scale);
                    sumsObj = new sums(pen4.Q, pen4.A, pen4.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3, pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 6:
                profitandlossM pen5 = new profitandlossM();

                while (n <= 19) {

                    pen5.profitandlossM();
                    pencil.optionsCreator(pen5.fv, pen5.scale);
                    sumsObj = new sums(pen5.Q, pen5.A, pen5.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3, pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 7:
                averageM pen6 = new averageM();

                while (n <= 19) {

                    pen6.averageM();
                    pencil.optionsCreator(pen6.fv, pen6.scale);
                    sumsObj = new sums(pen6.Q, pen6.A, pen6.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3, pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 8:
                timeandwM pen7 = new timeandwM();

                while (n <= 19) {

                    pen7.timeandwM();
                    pencil.optionsCreator(pen7.fv, pen7.scale);
                    sumsObj = new sums(pen7.Q, pen7.A, pen7.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3, pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 9:
                timeanddistanceM pen8 = new timeanddistanceM();

                while (n <= 19) {

                    pen8.timeanddistanceM();
                    pencil.optionsCreator(pen8.fv, pen8.scale);
                    sumsObj = new sums(pen8.Q, pen8.A, pen8.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3, pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 10:
                boatandstreamM pen9 = new boatandstreamM();

                while (n <= 19) {

                    pen9.boatandstreamM();
                    pencil.optionsCreator(pen9.fv, pen9.scale);
                    sumsObj = new sums(pen9.Q, pen9.A, pen9.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3, pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 11:
                interestM pen11 = new interestM();

                while (n <= 19) {

                    pen11.interestM();
                    pencil.optionsCreator(pen11.fv, pen11.scale);
                    sumsObj = new sums(pen11.Q, pen11.A, pen11.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3,
                            pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

            case 12:
                measurementM pen12 = new measurementM();

                while (n <= 19) {

                    pen12.measurementM();
                    pencil.optionsCreator(pen12.fv, pen12.scale);
                    sumsObj = new sums(pen12.Q, pen12.A, pen12.finalvalue, pencil.jRadioButton1, pencil.jRadioButton2, pencil.jRadioButton3,
                            pencil.jRadioButton4);
                    als.add(sumsObj);
                }
                break;

        }

        return als;

    }

}

クラス合計:

package website;

public class sums {
    public String Question, Answer, Finalvalue, P1, P2, P3, P4;
    public int choosenOption;

    public sums(String Q, String A, String finalvalue, String p1, String p2, String p3, String p4) {
        Question = Q;
        Answer = A;
        Finalvalue = finalvalue;
        P1 = p1;
        P2 = p2;
        P3 = p3;
        P4 = p4;

    }

    public void setChoosen(int n) {
        choosenOption = n;
    }

}

クラス TestRun:

package website;

import java.util.ArrayList;

public class TestRun {

    /**
     * @param args
     */
    public static void main(final String[] args) {
        ArrayOfSums SumsTable = new ArrayOfSums();
        //session.setAttribute("sumtin",SumsTable.giveArrayOfSums(8));

        ArrayList<sums> SumsSet = (ArrayList<sums>) SumsTable.giveArrayOfSums(8);
        sums gotSum = (sums) SumsSet.get(1);

        System.out.println(gotSum.Question);

    }
}
4

5 に答える 5

2

これをデバッグするのは私にとって非常に困難です.Exception in thread "main" java.lang.OutOfMemoryError: Java heap space.

デバッグできる問題ではありません。メモリ制限に対してメモリを使いすぎています。この問題を引き起こす可能性のあるコードは 1 行もありません。

代わりに、プロファイラーを使用して、メモリが使用されている場所を特定する必要があります。最大値をメイン メモリの半分以下に増やし、プロファイラーを接続して (VisualVM は何もないよりはましです)、オブジェクトが保持されている場所を確認することをお勧めします。

市販のプロファイラーを使用すると、動作が少し改善され、問題がどこにあるかがより明確になります。私は YourKit を使用しており、無料で評価ライセンスを取得できます。

switch ケース (n++) 内のインクリメント演算子を見逃していました。したがって、ループは決して終了しません。

forループを次のように使用する習慣になります

for(int i = 0; i <= 19; i++)
于 2013-08-02T05:39:48.570 に答える
2

JVM のメモリが不足しているため、このエラーが発生しています。JVM パラメータを設定して、Java ヒープ サイズを増やす必要があります。
ここに問題があるのではないかと思いますが、

 while (n <= 19) {

                pen.  simplificationM ();
                pencil.optionsCreator(pen.fv, pen.scale);

                sumsObj = new sums(pen.Q, pen.A, pen.finalvalue 
                                  , pencil.jRadioButton1, pencil.jRadioButton2
                                  , pencil.jRadioButton3, pencil.jRadioButton4);
                als.add(sumsObj);
                n++;//added to increase value of n in each iteration
            }
            break;

上記のコードでは、値を増やしていないためnwhile(n<=19)無限ループが発生します。

于 2013-08-02T05:50:19.533 に答える
1

java.lang.OutOfMemoryErrorは、メモリ不足のために Java 仮想マシンがオブジェクトを割り当てることができず、ガベージ コレクタによって使用できるメモリがなくなった場合にスローされます。

これを取り除くには、jvm でこれらのパラメーターを増やすことができます。

  • Xms - 最小ヒープ サイズ

-Xms オプションは、Java ヒープの初期サイズと最小サイズを設定します。Java ヒープ (「ヒープ」) は、メモリのブロックがオブジェクトに割り当てられ、ガベージ コレクション中に解放されるメモリの一部です。

  • Xmx - 最大ヒープ サイズ

このオプションは、Java ヒープの最大サイズを設定します。Java ヒープ (「ヒープ」) は、メモリのブロックがオブジェクトに割り当てられ、ガベージ コレクション中に解放されるメモリの一部です。実行しているオペレーティング システムの種類によって、Java ヒープに設定できる最大値が異なる場合があります。

詳細については、http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.htmlを参照してください。

于 2013-08-02T05:38:00.963 に答える
0

これは、ヒープで使用されているメモリが許容量を超えているか、リストなどのオブジェクトが大きくなりすぎて JVM に割り当てられたメモリを超えている場合に発生します。
これは、オブジェクトが不要なときに配列を空にする、ガベージ コレクターでメモリをフラッシュする、ループで配列を使用しないようにする、スタックを単純に処理するなど、配列を処理することで解決できます。どうしても必要な場合を除き、JVM の許容メモリを単純に増やすことはお勧めできません。

于 2013-08-02T05:45:05.617 に答える
0

以下のように -Xmx および -Xms オプションを使用して、アプリケーションの実行中に jvm の Java ヒープ サイズを変更します。

java -Xmx512M -Xms512M TestRun 
于 2013-08-02T05:32:45.000 に答える