我正在开发一个Java应用程序,有时会做一些繁重的工作 在这种情况下,它会使用比平时更多的ram,因此应用程序的已分配内存空间会增加。
我的问题是,为什么工作完成后分配的空间不会减少? 使用分析器,我可以看到例如分配了70mb,但只使用了5mb! 看起来分配的空间只会增长,而不会缩小。
由于
答案 0 :(得分:2)
通常,JVM在释放已分配的内存时非常严格。您可以将其配置为更加积极地释放。尝试在启动程序时将这些设置发送到JVM:
-XX:GCTimeRatio=5
-XX:AdaptiveSizeDecrementScaleFactor=1
答案 1 :(得分:1)
JVM决定何时将内存释放回操作系统。根据我使用Windows XP的经验,这几乎不会发生。偶尔,当命令提示符(或Swing窗口)最小化时,我似乎释放了内存。我相信Linux上的JVM在返回内存方面更胜一筹。
答案 2 :(得分:0)
通常可以有两个原因。
您的程序可能存在内存管理问题。例如,如果您将某些对象存储在集合中并且从不从集合中删除这些对象,则它们将永远不会被垃圾回收。如果是这种情况,您有一个应该找到并修复的错误。
但可能你的代码还可以,但是GC仍然不会删除那些没有使用过的对象。这样做的原因是GC生活在自己的生活中并决定自己的决定。例如,如果它认为它有足够的内存,则在内存使用率达到某个阈值之前,它不会删除已使用的对象。
要识别您在这里遇到的情况,请尝试以编程方式或使用分析器调用System.gc()
(通常是分析器具有运行GC的按钮)。如果在强制GC运行后删除了使用的对象,则代码就可以了。否则尝试找到错误。您已经使用的Profiler应该可以帮助您。