内存不足:Java堆空间

内存不足:Java堆空间,java,garbage-collection,big-o,Java,Garbage Collection,Big O,我正在做一个大O记号的家庭作业。我们需要创建整数数量不断增加的列表,然后计算对列表进行排序所需的时间,以确定哪个大O集合是sort() 我已经编写了一些代码来实现这一点,并生成了关于排序方法在每个列表大小的几个迭代过程中所用时间的数据 我能够对50000个整数的列表进行排序,但是如果我再次尝试执行完全相同的操作,我将耗尽内存。我认为垃圾收集器应该回收我的内存,因此理论上重复这个操作应该没有问题 我已经读过关于将我的大变量设置为null,并且不将对我的大列表的引用存储在for循环块之外的内容。我认

我正在做一个大O记号的家庭作业。我们需要创建整数数量不断增加的列表,然后计算对列表进行排序所需的时间,以确定哪个大O集合是sort()

我已经编写了一些代码来实现这一点,并生成了关于排序方法在每个列表大小的几个迭代过程中所用时间的数据

我能够对50000个整数的列表进行排序,但是如果我再次尝试执行完全相同的操作,我将耗尽内存。我认为垃圾收集器应该回收我的内存,因此理论上重复这个操作应该没有问题

我已经读过关于将我的大变量设置为null,并且不将对我的大列表的引用存储在for循环块之外的内容。我认为对我的整数列表的任何引用都没有理由保持活动状态

我做错了什么,垃圾收集器无法回收我的内存

        private static TreeMap<Integer, ArrayList<Long>> doExperiment(int iterations, int step, int trials, List listType) {
    TreeMap<Integer, ArrayList<Long>> results = new TreeMap();
    for (int i = 1; i <= iterations; i++) {
        // Data size ranges from 1000 - 50,0000 if step = 1000 and iterations = 50
        int dataSize = i * step;
        ArrayList<Long> trialResults = new ArrayList<Long>();
        for (int j = 1; j <= trials; j++) {
            // This may be LinkedList, ArrayList depending on the parameter.
            List thisList = listType;
            // dataSize works up to 50,000 Integers.
            Testing t = new Testing(dataSize, thisList);
            long nanos = t.timedSort();
            // Prints a formatted string to standard output.
            processResults(nanos, j, trials, i, iterations);
            // The large list exists only within this Testing instance. Set it to null
            t = null;
            // Please, garbage collection Gods...
            System.gc();
        }
        results.put(dataSize, trialResults);
    }
    return results;
}
私有静态树映射doExperiment(int迭代、int步骤、int试验、列表列表类型){
TreeMap results=新的TreeMap();
对于(int i=1;i
System.gc();
),不保证启动垃圾收集器

List thisList=listType;
-复制引用(我猜这是错误的) 因此,当您进行
Testing t=newtesting(dataSize,thisList);
-这实际上与
Testing t=newtesting(dataSize,listType);

您可能希望执行以下操作:
List thisList=new ArrayList(listType);
-是。这将创建新列表,但在本例中,测试将操作新列表,但不会使用相同的列表

ArrayList<Long> trialResults = new ArrayList<Long>(); // you create new list
....
results.put(dataSize, trialResults); // do you want to put empty list in the result? 
ArrayList trialResults=new ArrayList();//创建新列表
....
results.put(dataSize,trialResults);//是否将空列表放入结果中?
System.gc();
-不保证启动垃圾收集器

List thisList=listType;
-复制引用(我猜这是错误的) 因此,当您进行
Testing t=newtesting(dataSize,thisList);
-这实际上与
Testing t=newtesting(dataSize,listType);

您可能希望执行以下操作:
List thisList=new ArrayList(listType);
-是。这将创建新列表,但在本例中,测试将操作新列表,但不会使用相同的列表

ArrayList<Long> trialResults = new ArrayList<Long>(); // you create new list
....
results.put(dataSize, trialResults); // do you want to put empty list in the result? 
ArrayList trialResults=new ArrayList();//创建新列表
....
results.put(dataSize,trialResults);//是否将空列表放入结果中?
公共静态void main(字符串[]args){
//此处的TODO代码应用程序逻辑
DoeExperiment(50000,5,“ArrayList”);
DoeExperiment(50000,5,“LinkedList”);
}
私有静态void doExperiment(int迭代、int试用、字符串列表类型){
List=null;
List holdStartTimes=new ArrayList();
List holdEndTimes=new ArrayList();
开关(列表类型)
{
案例“ArrayList”:
列表=新的ArrayList();
打破
案例“LinkedList”:
列表=新的LinkedList();
打破
}
对于(int t=0;t
公共静态void main(字符串[]args){
//此处的TODO代码应用程序逻辑
DoeExperiment(50000,5,“ArrayList”);
DoeExperiment(50000,5,“LinkedList”);
}
私有静态void doExperiment(int迭代、int试用、字符串列表类型){
List=null;
List holdStartTimes=new ArrayList();
List holdEndTimes=new ArrayList();
开关(列表类型)
{
案例“ArrayList”:
列表=新的ArrayList();
打破
案例“LinkedList”:
列表=新的LinkedList();
打破
}
对于(int t=0;t
关于
测试t=…
然后
t=null
,然后在循环中后跟
System.gc()
,这似乎不正确。首先,
System.gc()
不能保证立即进行垃圾收集,其次,您不希望连续数百次运行GC。我认为现在的情况是,您仍然会遇到许多Te实例