0

应用程序描述: 我有一个 JAVA 应用程序,用于生成图表。用户可以根据自己的需要在 GUI 的帮助下设置图表。

问题描述: 创建图表时使用了一定数量的内存,当创建新图表时,GC不会自动清除前一个图表使用的内存,但是,如果我插入 System.gc() 语句,内存是清除。每次生成新图表时,我希望内存清除所有死对象。

问题 为什么 GC 不能像在 Java 中那样自动工作?感谢您的投入。

4

2 回答 2

2

不要使用System.gc. 无法保证内存会被清除,这表明您的代码存在其他问题。GC 将按其应有的方式工作,并且通常不会为这些问题负责。

你怎么知道GC有问题?需要考虑的一些选项:

  • 您是否分析过您的代码以查看它如何使用内存以及是否正在释放内存?
  • 你持有物体的时间是否超过了应有的时间?
  • 如果一切顺利,您是否尝试过使用Xmxand增加堆大小Xms
  • 另一种选择是考虑调整GC 以使其行为符合您的要求。

关于 GC 系统的事情是您不必担心内存管理(在大多数情况下),并且您可以相信 GC 会为您处理它。您需要关心的只是您是否正在从堆中炸毁顶部,并且从您所描述的情况来看,您似乎并没有耗尽内存。您可以放心,GC 会在它认为合适的时候收集未使用的内存。要控制行为,您必须调整 GC。

于 2013-10-29T17:41:47.743 回答
2

在 java 中,不能保证垃圾收集器何时运行。这个想法是您不必担心内存。当您需要内存时,垃圾收集器现在应该已经清理了足够的空间。

如果它在您需要时无法腾出足够的空间,那么您将获得一个OutOfMemoryError.

System.gc()是一个提示,可帮助通知垃圾收集器何时可能是垃圾收集的好时机。但它不一定会启动垃圾收集器。

于 2013-10-29T17:42:14.740 回答