2

我正在开发一个 Java 应用程序,它有时会做一些繁重的工作。
在这种情况下,它会使用比平时更多的内存,因此应用程序分配的内存空间会增加。

我的问题是为什么工作完成后分配的空间没有减少?
使用分析器,我可以看到例如分配了 70mb,但只使用了 5mb!看起来分配的空间只能增长,不能缩小。

谢谢

4

3 回答 3

2

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

-XX:GCTimeRatio=5

-XX:AdaptiveSizeDecrementScaleFactor=1
于 2012-08-13T19:36:26.050 回答
1

JVM 决定何时将内存释放回操作系统。根据我使用 Windows XP 的经验,这几乎不会发生。有时,当命令提示符(或 Swing 窗口)最小化时,我似乎会释放内存。我相信 Linux 上的 JVM 更擅长返回内存。

于 2012-08-12T17:08:40.867 回答
0

一般可能有2个原因。

可能您的程序存在内存管理问题。例如,如果您将一些对象存储在集合中并且从不从集合中删除这些对象,则它们将永远不会被垃圾回收。如果是这种情况,您有一个应该找到并修复的错误。

但可能你的代码没问题,但 GC 仍然不会删除不常用的对象。这样做的原因是 GC 过着自己的生活并决定自己的决定。例如,如果它认为它有足够的内存,它不会删除已使用的对象,直到内存使用量达到某个阈值。

要识别您在此处遇到的情况,请尝试以System.gc()编程方式或使用分析器调用(通常分析器具有运行 GC 的按钮)。如果在强制 GC 运行您的代码后删除使用的对象是可以的。否则尝试定位错误。您已经在使用的 Profiler 应该可以帮助您。

于 2012-08-12T11:44:32.610 回答