私は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;
}