我正在执行以下程序并将值存储在内存对象中,但GC无法清除对象内存导致内存不足异常
请帮助您提供见解
package sampletest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
public class studentDB
{
public static List<Student> retrieve()
throws ParseException
{
List<Student> students = new ArrayList();
for (int i = 0; i < 100000; i++)
{
Student student = new Student();
student.setAge(new Integer(i));
student.setBirthDate(new SimpleDateFormat("ddMMyyyy").parse("01061986"));
student.setName("Student" + new String(new Integer(i).toString()));
students.add(student);
}
return students;
提前致谢
答案 0 :(得分:2)
这实际上不是内存泄漏 - 你只是在使用太多内存。
这就是List
是一个接口的原因 - 因此您可以构建自己的List
。这个可以即时构建Student
。
public static List<Student> retrieve() {
return new AbstractList<Student>(){
@Override
public int size() {
return MAX_STUDENTS;
}
@Override
public Student get(int index) {
// Make each student on demand.
Student student = new Student();
student.setAge(new Integer(index));
// Date parsing removed because that just untidys the demo.
student.setName("Student" + index);
return student;
}
};
}
答案 1 :(得分:0)
在此处返回List<Student> students
。
调用此方法时,您将获得此列表对象的引用。您必须释放该引用,否则它将永远不会被GC清除。
当然,如果列表太大,而你的内存不足以包含它,这里也会抛出内存不足的例外。
答案 2 :(得分:0)
从我看到你试图模拟数据库调用并提供Stub功能用于测试目的。正如其他人所说,它不是代码的问题,而是分配的堆的数量。尝试将Xmx args更改为更高的值并检查它是否适合您。