2012-08-12 97 views
2

我正在开发一个Java应用程序,有时会做一些繁重的工作。
当这种情况发生时,它比平时使用更多的内存,所以应用程序的分配内存空间增加了。Java - 分配的空间不减少

我的问题是为什么分配的空间不会减少,一旦工作完成?
使用探查器,我可以看到例如70mb被分配,但只有5mb被使用! 它看起来像分配的空间只能增长,而不是缩小。

感谢

+0

你需要等待GC来陪伴。 – 2012-08-12 11:24:10

+0

我试过等20分钟,没有任何改变。我也尝试做一个System.gc() – jitowix 2012-08-12 11:25:49

+0

System.gc()只是在另一个线程上调用GC。你需要让它做到这一点。 20分钟不做任何事情都不会打电话给GC。 GC只在需要RAM时调用,而不是在使用率变高时调用。 – 2012-08-12 11:27:07

回答

1

JVM决定何时将内存释放回操作系统。在我使用Windows XP的经验中,这几乎从未发生过。有时候,当命令提示符(或Swing窗口)最小化时,我似乎回放了内存。我相信Linux上的JVM更适合返回内存。

0

一般可以有2个原因。

也许你的程序有内存管理问题。例如,如果您将某些对象存储在集合中,并且绝不会从集合中移除这些对象,它们将永远不会被垃圾收集。如果这是一个案例,你有一个应该找到并修复的错误。

但是可能你的代码是确定的,但是GC仍然不会删除那些没有被使用的对象。其原因是GC保持自己的生活并决定自己的决定。例如,如果它认为它有足够的内存,它不会删除使用的对象,直到内存使用达到某个阈值。

要确认您在这里遇到的情况,请尝试以编程方式或使用分析器(通常分析器具有运行GC的按钮)调用System.gc()。如果在强制GC运行后删除使用的对象,则代码无误。否则,请尝试找到该错误。您正在使用的分析器应该可以帮助您。

+0

那么我的对象都被删除(不再引用),所以它不是问题。并从探查器(yourKit)运行gc只发布一点ram(大约7mb,对应于eden空间):( – jitowix 2012-08-12 11:51:08

2

通常,JVM在释放已分配的内存方面非常受限制。不过,您可以将其配置为更积极地释放。尝试发送这些设置到JVM当您启动程序:

-XX:GCTimeRatio=5 

-XX:AdaptiveSizeDecrementScaleFactor=1