2

我正在使用一些第三方源代码,它打算使用 GUI 运行,但我在不使用 GUI 的情况下集成它,并且我注意到我正在使用的第三方代码存在严重的内存泄漏。所以我想知道,是否有可能以某种方式在沙箱之类的东西中创建该第三方应用程序实例的对象,我可以稍后在其中删除该对象,并且对该代码正在调用的任何对象的所有引用都将被删除垃圾收集器。

这样的事情可能吗?有什么替代方法可以实现类似的场景,或者唯一的可能是从 java -jar customApp ... 等流程构建器调用其他应用程序?虽然有点丑。。。

编辑:是否会在单独的线程中运行该代码,然后等待线程完成导致垃圾收集器删除与那里调用的对象相关的所有对象?

4

1 回答 1

1

首先,在您使用内存分析器(例如 yourkit)实际研究内存使用情况并完全理解内存消耗的原因之前,您不太可能成功驯服它。

其次,如果内存是本机而不是 Java 的问题,则根本没有什么可做的。

以下可能接近您的愿望。

将有问题的库加载到它自己的类加载器中,并且仅通过您在主类加载器中加载的非常狭窄的接口引用它,然后继承到特殊的类加载器中。这将使对在库中创建的对象的引用更难保留,但这绝不是不可能的。例如,如果库创建线程并将引用放入ThreadLocal对象中,那么您就回到了开始的地方,除非您可以告诉它终止线程。尽管如此,如果库在静态引用中堆积了大量的对象,这将无济于事。

于 2016-08-28T20:48:36.507 回答