簡體   English   中英

為什么在SWING中重復setLabel()會導致內存不足?

[英]Why does repeating setLabel() in SWING cause out of memory?

類變量是這樣的:

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)。 對?

為什么會發生這種內存泄漏?

請指教,謝謝。

我強烈懷疑您還沒有向我們展示某些內容。 10000個字符串對於內存而言毫無意義。 例如,如果每個字符串為64個字節(並且幾乎肯定比實際大),那么這10000個字符串將占用640K。 我假設您有更多的內存,並且沒有將最大堆大小設置為很小的值嗎?

您能否提供一個簡短但完整的程序來說明這里的問題?

我想知道是不是導致問題的字符串 ,而是您生成了440萬個UI事件的事實-而且因為您從未讓UI處理它們,所以它們都無法建立他們被清除。 這會更有意義(即使仍然沒有那么多對象)-但我不確定為什么您會在現實生活中看到這種情況-顯然,您給出的示例並不是一個特別現實的示例,您必須在更普通的程序中耗盡了內存...

我相信當您執行String new Label = String.valueOf(ii); 您正在創建一個新字符串。 當使用setLabel()將其分配給標簽時,將保存一個引用,該引用將在下一次被覆蓋。 因此,內存泄漏。

Java中的垃圾收集器不是即時的。 如果不再有對對象的引用,則可以對其進行垃圾回收。

您正在創建(並丟棄)9999個String對象。 您的內存不足,無法收集它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM