应用程序描述: 我有一个 JAVA 应用程序,用于生成图表。用户可以根据自己的需要在 GUI 的帮助下设置图表。
问题描述: 创建图表时使用了一定数量的内存,当创建新图表时,GC不会自动清除前一个图表使用的内存,但是,如果我插入 System.gc() 语句,内存是清除。每次生成新图表时,我希望内存清除所有死对象。
问题 为什么 GC 不能像在 Java 中那样自动工作?感谢您的投入。
应用程序描述: 我有一个 JAVA 应用程序,用于生成图表。用户可以根据自己的需要在 GUI 的帮助下设置图表。
问题描述: 创建图表时使用了一定数量的内存,当创建新图表时,GC不会自动清除前一个图表使用的内存,但是,如果我插入 System.gc() 语句,内存是清除。每次生成新图表时,我希望内存清除所有死对象。
问题 为什么 GC 不能像在 Java 中那样自动工作?感谢您的投入。
不要使用System.gc
. 无法保证内存会被清除,这表明您的代码存在其他问题。GC 将按其应有的方式工作,并且通常不会为这些问题负责。
你怎么知道GC有问题?需要考虑的一些选项:
Xmx
and增加堆大小Xms
?关于 GC 系统的事情是您不必担心内存管理(在大多数情况下),并且您可以相信 GC 会为您处理它。您需要关心的只是您是否正在从堆中炸毁顶部,并且从您所描述的情况来看,您似乎并没有耗尽内存。您可以放心,GC 会在它认为合适的时候收集未使用的内存。要控制行为,您必须调整 GC。
在 java 中,不能保证垃圾收集器何时运行。这个想法是您不必担心内存。当您需要内存时,垃圾收集器现在应该已经清理了足够的空间。
如果它在您需要时无法腾出足够的空间,那么您将获得一个OutOfMemoryError
.
System.gc()是一个提示,可帮助通知垃圾收集器何时可能是垃圾收集的好时机。但它不一定会启动垃圾收集器。