【发布时间】:2011-12-02 20:06:42
【问题描述】:
编辑: 没有内存泄漏,只是对 Netbeans Profiler 告诉我的内容有误解。 Live Profiling Results -> Allocated Objects 是指在程序生命周期内分配的 TOTAL,而不是当前内存中的总数。为此,请获取堆转储。很抱歉造成混乱,但也许其他人会发现这一点,它会为他们解决这个问题。
我正在使用 NetBeans 7.0.1 分析器来解决我的应用程序中的内存增长问题,并且发现了两个主要问题。我已经成功创建了测试应用程序,并在分析器中看到了相同的结果,如下所示。我无法在其他任何地方找到对这些的参考。
案例 1:循环遍历 HashMap 的条目集导致对象 java.util.HashMap&EntryIterator 增长。除了找出使用不同容器的解决方案之外,这里还有什么可做的吗?每次在 while 循环中遍历集合对我们的应用程序来说都是必要的。
public static void main(String[] args) throws InterruptedException {
boolean run = true;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer> ();
map.put(1, 2);map.put(3, 4);map.put(5, 6);map.put(7, 8);
while(true){
for (Entry<Integer, Integer> entry : map.entrySet()) {
Integer i = entry.getValue();
}
//app specific code here
Thread.sleep(50);
}
}
案例 2:在循环中创建空的 ArrayList 会导致 java.lang.Object[] 的增长。我希望 ArrayLists 在 while 循环结束时有资格进行 GC。我的假设是错误的吗?还是有别的什么在起作用?
public static void main(String[] args) throws InterruptedException {
boolean run = true;
while(run){
ArrayList<Integer> a1 = new ArrayList<Integer>();
ArrayList<Integer> a2 = new ArrayList<Integer>();
// app specific code here
Thread.sleep(50);
}
}
【问题讨论】:
-
你的假设是这些对象在下一个GC周期没有被回收吗?对象在各处创建。问题在于引用它们的那些。
-
在需要更多内存之前,可能不会回收内存。你确定垃圾收集器已经运行了吗?
-
问题在于我解释 Netbeans 分析器结果的方式。我用“分配的对象”来表示当前分配的内容,但它实际上是指在程序生命周期中创建的对象数量。我知道这看起来不对。很抱歉给大家带来了困惑,感谢您的回复。
-
你为什么不自己回答这个问题呢?
标签: java collections memory-leaks garbage-collection