如何减少不再需要的列表的内存消耗?

时间:2012-04-12 15:30:49

标签: java

我已经搜索过这个,但似乎无法找到答案。

基本上我有一些代码可以创建数组的副本(使用Arrays.copyOf来创建int[]),它会做一些工作并输出结果或发送Arrays.copyOf到一个队列进行进一步处理。

如果我更改副本,我的结果不再正确,所以我觉得我需要它,但我想知道在完成后我能做些什么,因为根据我的记忆分析,它占用了我所有的记忆和垃圾收集帮助,但它只是再次建立。我真的不确定这是否会有所帮助,但我想测试一下我的程序是否像在内存占用较小的情况下那样运行,如果我在将它提交到队列后以某种方式删除int[]

我是Java的新手,所以如果这个逻辑完全有缺陷,还有另一种方法可以实现相同的结果吗?底线是我正在创建一个新阵列,它被使用了一点但在不再需要时徘徊(它需要15G的最大内存,然后我相信垃圾收集器进来并减少它但是它会在几个内部回到最大值秒再次)。也许我可以将变量设置为null或者一旦我确定它不需要(我正在复制的对象非常大)?

这里有一些代码只是为了表明我的意思(它有点蹩脚,但希望它可以让你理解它在代码中的设置,所有这些都在多线程可调用内):

 while(!queue.isEmpty()) {
                int[] data_list = Arrays.copyOf(current.list, current.list.length);

                    if (things work) {
                        Sysout("print results");
                    } else if (current.k > 0) {
                        queue.add(new Queue(data_list)); 

                    }
                }
            }

1 个答案:

答案 0 :(得分:1)

一般来说,这里要做的就是“相信垃圾收集器知道它在做什么”。 JVM非常擅长确定何时不再需要对象,尤其是例如如果它可以证明某个对象没有“逃避”创建它的方法。

Java甚至没有提供删除对象使用的内存的方法,除了删除对它的所有引用 - 这正是你正在做的。