【问题标题】:Java - Allocated space not reducedJava - 分配的空间没有减少
【发布时间】:2012-08-08 22:38:21
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 你需要等待GC来。
  • 我尝试等待 20 分钟,但没有任何改变。我也尝试做一个 System.gc()
  • System.gc() 只是在另一个线程上调用 GC。你需要让它做它的事情。 20 分钟内什么都不做不会调用 GC。 GC 仅在需要 RAM 时调用,而不是在使用率高时调用。
  • 你不能调用 GC.collect() 来强制收集吗?
  • 我相信这是正确的——一旦分配了内存,它就不会返回给操作系统。 GC 会清理使用过的内容,但不会返回任何内容供其他应用使用。

标签: java ram


【解决方案1】:

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

-XX:GCTimeRatio=5

-XX:AdaptiveSizeDecrementScaleFactor=1

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      通常有两个原因。

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

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

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

      【讨论】:

      • 好吧,我的对象都被删除了(不再引用),所以这不是问题。从分析器(yourKit)运行 gc 只释放一点内存(大约 7mb,对应于伊甸园空间):(
      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多