[英]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.