为什么在SWING中重复setLabel()会导致内存不足?

时间:2011-05-16 05:08:16

标签: java swing awt

类变量是这样的:

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)。正确?

为什么会发生这种内存泄漏?

请告知并谢谢。

3 个答案:

答案 0 :(得分:3)

我强烈怀疑你这里没有给我们看过的东西。就内存而言,10000个字符串 nothing 。如果每个字符串是,例如,64个字节(并且几乎肯定比实际大),则那些10000个字符串占用640K。我假设你有比这更大的内存,并且你没有将最大堆大小设置为微小的东西?

你能提供一个简短但完整的程序来证明这个问题吗?

我想知道是不是导致问题的字符串,但事实上你已经生成了440万个UI事件 - 并且因为你永远不会让UI处理它们,他们都在建立,没有办法让他们得到清理。这会更有意义(即使它仍然不是 许多物体) - 但我不确定为什么你会在现实生活中看到这一点 - 显然你给出的例子不是特别现实的一个,你必须在一个更正常的程序中用尽内存......

答案 1 :(得分:0)

我相信当您执行String new Label = String.valueOf(ii);时,您正在创建一个新字符串。当您使用setLabel()将其分配给标签时,会保存一个被下次覆盖的引用。因此,内存泄漏。

答案 2 :(得分:0)

Java中的垃圾收集器不是即时的。当没有对象的更多引用时,它变为可用被垃圾收集。

您正在创建(并丢弃)9999 String个对象。在收集内存之前,你的内存已经不足了。