最好的方法是启动另一个JVM,例如通过套接字与之通信,然后在完成后杀死JVM。
讨论我们是否可以在同一JVM中对其进行沙箱处理将很有趣。
使用完第3方库后,您不再引用该库中的任何对象,那么仍在徘徊的垃圾又是什么?
它们的类-即使您未引用它们中的任何一个,如果它们由与您的代码相同的类加载器加载,则这些类将保留。而且它们的静态字段可以引用更多的持久数据,依此类推
ThreadLocal-它可能已经设置了一些线程局部变量,而没有清理它们
线程-它可能产生了一些持续存在的线程
在某些全局位置(例如System.setProperty()),它将保留在那里。
因此,总的来说,这可能很困难。
但是,我们可以使用单独的类加载器和单独的线程来执行第三方库,并且在大多数情况下,该策略可能可以卸载由第三方创建的所有垃圾。
是否有执行此操作的现有工具?我对此不太了解。我确实有一些实现热可重装服务器的经验,并且我有一些实用程序类可用于此目的。例如
// wrap 3rd party pre, expose it as some java.*.* interfacepublic class MyWrapper implements Callable<String>{ @Override public String call() { return ThirdParty.query(..); }}HotReloader hot = new HotReloader();Callable<String> func = (Callable<String>)hot.getAppInstance("pkg.MyWrapper");String result = func.call();// then dereference `hot` and `func`请参阅HotReloader



