2015-03-31 195 views
0

我已經用Java編寫了一個程序,用於檢測它運行的計算機何時閒置。當空閒時間被重置(換句話說,使用鼠標或鍵盤)時,程序鎖定計算機。該程序設計用於在計算機啓動時運行,並在打開機器時繼續運行。我的問題是,程序運行時間越長,程序佔用的空間越多。我沒有看到任何理由爲什麼它應該;沒有什麼像一個ArrayList被不斷添加的。該程序在內存中以每小時10兆字節「擴展」。有沒有我應該做的垃圾收集?Java程序越來越大

+5

您是否嘗試過使用探查器來確定您的程序中哪些對象正在增長? JVisualVM是免費的,並且附帶JDK – 2015-03-31 15:44:29

+0

我沒有;我會給你一個鏡頭... – KnightOfNi 2015-03-31 15:46:06

+0

我想你是依靠一些本地電話。你確定所有的資源在不使用時都被釋放了嗎?你確定你沒有釋放它,而是一遍又一遍地調用同一個資源? – ortis 2015-03-31 15:50:05

回答

0

嘗試將堆大小設置爲較低的值......然後垃圾收集器應該先踢入。不時手動撥打System.gc()也應解決您的問題。如果一段時間後這會導致OutOfMemory異常和/或內存不斷增加,那麼您確實在某處存在內存泄漏。

1

這聽起來不像你甚至有問題。 10 MB真的不是那麼大。這可能是垃圾收集器根本沒有「決定」在一段時間內運行。您可以嘗試通過調用System.gc()直接調用GC,但是實際上,除非內存不足或出現性能問題,否則我不會太擔心。

0

只要程序使用new運算符,運行時就會分配新內存,直到垃圾回收器決定是否回收可用空間時纔會釋放新內存。所以,即使你沒有通過添加一個永遠不會被清除的集合來「泄漏」內存,你仍然在使用內存,你的使用將隨着時間的推移而增長。

考慮消除對new的調用(例如,通過重新使用現有對象)或調整JVM上的堆大小設置,以便在需要消耗內存時更頻繁地啓動垃圾回收器。