我正在使用一些第三方源代码,这是用GUI运行的,但是我在不使用GUI的情况下集成它,我注意到第三方代码严重的内存泄漏我是使用。所以我想知道,是否有可能以某种方式在沙盒中创建第三方应用程序实例的对象,我可以在以后删除该对象,并且所有对该代码调用的对象的引用都将被删除垃圾收集器。
这样的事情可能吗?有什么替代方案可以实现类似的场景,或者希望唯一的可能性是从java -jar customApp等流程构建器调用其他应用程序?虽然这有点难看......
编辑: 是否会在单独的Thread中运行该代码然后等待线程完成,导致垃圾收集器删除与所谓的那些相关的所有对象?
答案 0 :(得分:1)
首先,在您实际使用内存分析器(例如yourkit)研究内存使用情况并完全理解内存消耗的原因之前,您不太可能成功驯服它。
其次,如果本机而不是Java存储器是问题,那么根本就没有什么可做的。
以下内容可能与您的愿望相近。
将有问题的库加载到自己的类加载器中,并且只通过在主类加载器中加载的非常窄的接口引用它,然后继承到特殊的类加载器。这将使引用更难以保留到库中创建的对象,但绝不是不可能的。例如,如果库创建了线程,并将引用放入ThreadLocal
个对象中,那么你就可以回到你开始的地方,除非你能告诉它杀死线程。尽管如此,如果图书馆在静态参考文献中堆积了大量的对象,这不会有帮助。