我正处于一种场景,我通过入口点定义的API(例如“OSGi”)在特定的类加载器中启动应用程序。我已经制定了具体的方法,例如:start
和stop
。启动的应用程序位于名为applications
的数组中。
如果我想结束应用程序,我会调用它的stop
方法。但是假设应用程序是恶意的并且它不清理它的类/资源,我怎么能强制它被垃圾收集???
如果我在主应用程序上执行简单的applications[i] = null;
,是否会强制将未清除任何资源的恶意应用程序进行垃圾回收?
答案 0 :(得分:1)
不,你不能告诉垃圾收集器强制收集一个特定的对象。将引用设置为null并不能保证任何内容。
您可以在单独的进程中运行潜在的恶意应用程序,并在完成该进程后终止该进程。然后操作系统将确保释放所有资源(内存和其他资源)。
答案 1 :(得分:1)
如果应用程序的唯一引用保存在应用程序[i]中,则需要这样做。但是,无法预测下一个GC循环。因此,应用程序的生命周期可能比预期的长
答案 2 :(得分:1)
垃圾收集器将自己收集未使用的对象(没有引用的对象)。它不能被迫,也无法预测。但是可以通过调用
来询问它System.gc()
请注意,这并不保证任何东西,它只是“暗示”垃圾收集应该开始。 但这通常被认为是不好的做法,因为它会严重影响垃圾收集过程和JVM的性能。
因此,在大多数情况下,最好确保没有参考文献,以便在GC认为合适时可以收集对象。