类变量是这样的:
Button[] tab_but = new Button[440];
static int ii;
初始化tab_but后,我正在测试以下工作。
for (int j = 0; j < 9999; j++) {
String newLabel = String.valueOf(ii);
for (int i = 0; i < 440; i++) {
tab_but[i].setLabel(newLabel);
}
ii += 1;
}
最终它会“失去记忆”。
正如我所描述的那样,Object []分配在运行时迅速增加。
我认为我只替换了标签,因此应该清除以前的标签对象(String)。正确?
为什么会发生这种内存泄漏?
请告知并谢谢。
答案 0 :(得分:3)
我强烈怀疑你这里没有给我们看过的东西。就内存而言,10000个字符串 nothing 。如果每个字符串是,例如,64个字节(并且几乎肯定比实际大),则那些10000个字符串占用640K。我假设你有比这更大的内存,并且你没有将最大堆大小设置为微小的东西?
你能提供一个简短但完整的程序来证明这个问题吗?
我想知道是不是导致问题的字符串,但事实上你已经生成了440万个UI事件 - 并且因为你永远不会让UI处理它们,他们都在建立,没有办法让他们得到清理。这会更有意义(即使它仍然不是 许多物体) - 但我不确定为什么你会在现实生活中看到这一点 - 显然你给出的例子不是特别现实的一个,你必须在一个更正常的程序中用尽内存......
答案 1 :(得分:0)
我相信当您执行String new Label = String.valueOf(ii);
时,您正在创建一个新字符串。当您使用setLabel()
将其分配给标签时,会保存一个被下次覆盖的引用。因此,内存泄漏。
答案 2 :(得分:0)
Java中的垃圾收集器不是即时的。当没有对象的更多引用时,它变为可用被垃圾收集。
您正在创建(并丢弃)9999 String
个对象。在收集内存之前,你的内存已经不足了。