2

私はJavaのジュニアで、メモリリークの問題に直面しています。Javaにはメモリの問題はないといつも思っていましたが、問題が発生しました。以下は私のテストコードです。

getList() メソッドで大きな ArrayList を作成し、メイン スレッドでこのメソッドを呼び出し続けます。私はリストを考えました:

ArrayList<String> list = t.getList();

in loop はローカル変数であり、新しいオブジェクトが作成されるため、次のラウンドで解放する必要があります。しかし、jvm はそうしませんでした。このスレッドはすべてのメモリを使い続けます。誰か理由を教えてくれませんか?ありがとう!

テスト コード:

package test;

import java.util.ArrayList;

public class test {


public static void main(String[] args){

    test t = new test();
    for(int k = 0; k < 10000; k ++){
        ArrayList<String> list = t.getList();

        System.out.println(k);
    }

}

public ArrayList<String> getList(){
    ArrayList<String> list = new ArrayList<String>();

    for(int i = 0; i < 100000; i ++){
        String a = "";
        for(int j = 0; j < 100; j++){
            a += "aaaa";
        }
        list.add(a);
    }

    return list;
}
}

変更された問題: 変更された問題では、スレッドもメモリを消費し続けます。しかし、ラウンドごとにメモリを解放する必要があると思いましたが、そうではありませんでした。そのため、ますます多くのメモリを占有しました。

public static void main(String[] args){

    test t = new test();
    for(int k = 0; k < 10000; k ++){
        String str1 = "string1";
        String str2 = "string2";
        double value = t.calculate(str1, str2);

        System.out.println(k + " " + value);
    }

}

public double calculate(String str1, String str2){
    double value = 0.0;

    ArrayList<String> list1 = getList(str1);
    ArrayList<String> list2 = getList(str2);

    value = cal(list1, list2); //will get the value based on lists

    return value;

}


public ArrayList<String> getList(String str1){
    ArrayList<String> list = new ArrayList<String>();

    //will generate  a long list

    return list;
}
4

3 に答える 3