【问题标题】:Memory leak when using array list使用数组列表时的内存泄漏
【发布时间】:2018-06-26 00:49:16
【问题描述】:

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

提前感谢

【问题讨论】:

  • "[...] 但 GC 无法清除对象内存 [...]" - 只要您持有对 List 的引用并且不要从所说的List 中删除元素,GC 为什么要清除对象?你如何使用返回的List
  • GC 无法清除正在使用的变量的内存。
  • 这个问题有什么意义?你真的问“我创建了很多对象(无论出于何种原因)并返回它们以供以后使用,但我希望 GC 删除它们”。当您显然不关心这些对象时,创建这些对象有什么意义?

标签: java memory arraylist memory-leaks


【解决方案1】:

这并不是真正的内存泄漏 - 您只是使用了太多内存。

这就是为什么List 是一个接口 - 这样您就可以构建自己的Lists。这个可以即时构建您的Students。

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

【讨论】:

    【解决方案2】:

    在这里你返回List&lt;Student&gt; students

    当你调用这个方法时,你会得到这个列表对象的引用。您必须释放引用,否则 GC 永远不会清除它。

    当然,如果列表太大,你的内存不够容纳它,这里也会抛出内存不足的异常。

    【讨论】:

      【解决方案3】:

      据我所知,您正在尝试模拟数据库调用并为测试目的提供存根功能。正如其他人所说,这不是代码的问题,而是分配的堆数量。尝试将 Xmx 参数更改为更高的值并检查它是否适合您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多