我是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;
}