我是Java的初级用户,面临内存泄漏问题。我一直认为java不会有内存问题,但我得到了一个。以下是我的测试代码。为什么Java不释放内存
我在getList()方法中创建了一个很大的ArrayList,并且一直在主线程中调用这个方法。我认为列表:
ArrayList<String> list = t.getList();
在循环中是一个局部变量,并且应该在下一轮中释放,因为将创建一个新对象。但是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;
}
你在技术上没有内存泄漏。 “吃所有的记忆”是什么意思?多少内存?你怎么知道这个线程是负责任的?毕竟,每次调用getList()时都会创建数千万个对象。 – chrylis
这对我来说并不陌生。你不能有足够大的内存来保存一次迭代。 –
以及它没有必要GC在下一轮释放内存。但是它的真实它应该在GC运行时释放 –