Java 终身生成垃圾收集
JVM垃圾收集器如何清理终身生成的? 直到分配的堆大小已满,还是 因为对于我的项目,我有一个Java 终身生成垃圾收集,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,JVM垃圾收集器如何清理终身生成的? 直到分配的堆大小已满,还是 因为对于我的项目,我有一个ThreadPoolExecutor,它提交了大量任务。 由于这些可运行任务是由内部类创建的,因此它们对外部实例有一定的引用。他们将很容易在伊甸园空间的GC中生存下来,并最终进入终身一代表单幸存者空间。而且,通过Java Profiler监视JVM,我注意到这一终身生成永远不会被清除(对于我来说,直到完全清除) 因此,我的问题是: 垃圾收集器如何为终身生成堆工作 如果我想强制执行内存的GC,以防止将来不可
ThreadPoolExecutor
,它提交了大量任务。
由于这些可运行任务
是由内部类
创建的,因此它们对外部实例有一定的引用。他们将很容易在伊甸园空间的GC
中生存下来,并最终进入终身一代
表单幸存者空间
。而且,通过Java Profiler监视JVM,我注意到这一终身生成
永远不会被清除(对于我来说,直到完全清除)
因此,我的问题是:
垃圾收集器如何为终身生成
堆工作
如果我想强制执行内存的GC
,以防止将来不可预知的堆问题,我该怎么办
垃圾收集器如何为永久性生成堆工作
嗯,跟你描述的差不多。在需要(或可能很快需要)空间之前,不会发生任何事情,此时会触发一个主要GC。我想这是故意的行为——我不想让世界暂停触发的频率超过应有的频率
如果我想强制内存的GC来防止将来不可预知的堆问题,我可以怎么做
从技术上讲,你不能。GC会在任何时候触发,而不管您给它什么提示。如果您想建议运行时执行GC,可以使用System.GC()
,但同样,这只是一个建议——运行时可以随意忽略它。据我所知,System.gc()
调用往往会引起注意。这是一个相当广泛的问题,答案会根据您使用的gc算法而变化。你可能想玩一下G1收集器,它根本没有伊甸园和终身空间。你的问题有点离题,但这可能有助于问题背后的意图。您是否能够通过使用静态类并将所需的任何数据传递给其构造函数来断开内部类的引用?@ChrisK我的可运行内部类的所有实例
都将更新外部类的一些计数。这些实例由ThreadPoolExecutor
控制(或者说使用),该执行器位于外部类实例中,具有较大的队列容量。那么,有什么建议吗?@ChrisK和关于垃圾收集器,我没有学到那么多。这都是JVM的默认配置。谢谢,调用System.gc()安全吗?@roror如果“安全”的意思是“不会使系统崩溃”,我会这么认为,除非您在某个地方有一些不可靠的终结器,并且/或者gc开销不会触发异常/错误。换句话说,是的,在大多数情况下调用System.gc()
是安全的。请注意,根据,这不一定是推荐的做法。