如何验证/强制类被垃圾收集

时间:2011-02-02 11:29:25

标签: java memory reference garbage-collection

我正处于一种场景,我通过入口点定义的API(例如“OSGi”)在特定的类加载器中启动应用程序。我已经制定了具体的方法,例如:startstop。启动的应用程序位于名为applications的数组中。

如果我想结束应用程序,我会调用它的stop方法。但是假设应用程序是恶意的并且它不清理它的类/资源,我怎么能强制它被垃圾收集???

如果我在主应用程序上执行简单的applications[i] = null;,是否会强制将未清除任何资源的恶意应用程序进行垃圾回收?

3 个答案:

答案 0 :(得分:1)

不,你不能告诉垃圾收集器强制收集一个特定的对象。将引用设置为null并不能保证任何内容。

您可以在单独的进程中运行潜在的恶意应用程序,并在完成该进程后终止该进程。然后操作系统将确保释放所有资源(内存和其他资源)。

答案 1 :(得分:1)

如果应用程序的唯一引用保存在应用程序[i]中,则需要这样做。但是,无法预测下一个GC循环。因此,应用程序的生命周期可能比预期的长

答案 2 :(得分:1)

垃圾收集器将自己收集未使用的对象(没有引用的对象)。它不能被迫,也无法预测。但是可以通过调用

来询问它
System.gc()

请注意,这并不保证任何东西,它只是“暗示”垃圾收集应该开始。 但这通常被认为是不好的做法,因为它会严重影响垃圾收集过程和JVM的性能。

因此,在大多数情况下,最好确保没有参考文献,以便在GC认为合适时可以收集对象。