使用数组列表时内存泄漏

时间:2018-01-17 07:49:53

标签: java memory arraylist memory-leaks

我正在执行以下程序并将值存储在内存对象中,但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;

提前致谢

3 个答案:

答案 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更改为更高的值并检查它是否适合您。