【问题标题】:Instances exponentially increasing - eating memory实例呈指数增长——吃掉内存
【发布时间】:2012-09-11 20:21:44
【问题描述】:

我创建了一个扫雷游戏,每次开始新游戏时都会生成一个二维 JButton 数组。问题是内存使用量呈指数增长(JProfiler 说它是 JButtons)。似乎不仅旧的 Jbutton 实例被保存在内存中,而且实例的数量翻了一番。我怎样才能告诉它摆脱旧的 JButtons?谢谢

private JButton[][] but;
but = new JButton[row][col];
for (int i = 0;i<row;i++)
{    
  for (int j = 0;j<col;j++){
      but[i][j]= new JButton();
      but[i][j].setName(i+":"+j);
      mine.add(but[i][j]);
      but[i][j].addMouseListener(this);
  }
 }

【问题讨论】:

  • 为什么旧实例不消失?
  • 添加新按钮时,您是否曾从组件中删除按钮?除此之外,它看起来不像内存泄漏。 PS:泰勒关于重用而不是重新创建的答案是一个很好的答案。
  • 另外,你的意思是从字面上看成指数还是只是“非常快”的一种意思?
  • 可能是 mine.add(but[i][j]);正在维护对旧实例的引用。
  • 我认为这是“几何上的”。无论如何,通常它应该以算法方式增长(100-200-300)。您确定您的代码不在循环内吗?我建议您在每次创建新按钮时记录一个语句,以检查它为何如此急剧上升。

标签: java swing memory-leaks jbutton jtogglebutton


【解决方案1】:

这听起来像是池模式的经典用例。

在程序开始时分配一个网格的按钮,并在每个游戏中重复使用它们。

【讨论】:

  • 但每个新游戏可能有不同大小的网格
  • 好的,所以当 i 和 j 代表您可能需要的最大按钮数时,使用一维网格,大小为 i*j。使用(row * numrows)+col 获取给定的单元格地址。这样,现有结构将适用于任意数量的单元格,不超过您分配的最大值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
相关资源
最近更新 更多