2015-03-31 142 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上的堆大小设置,以便在需要消耗内存时更频繁地启动垃圾回收器。