如何在“图书馆”中运行图书馆;沙盒“;使用Java的模式?
我正在使用一些第三方源代码,这意味着要与GUI一起运行,但我在不使用GUI的情况下对其进行集成,我注意到我正在使用的第三方代码存在严重的内存泄漏。所以我想知道,是否有可能以某种方式在沙箱之类的东西中创建该第三方应用程序实例的对象,在沙箱中我可以稍后删除该对象,并且该代码调用的任何对象的所有引用都将被垃圾收集器删除 这样可能吗?除了实现类似的场景,还有什么替代方案,或者希望唯一的可能性是从流程生成器(如java-jar customApp)调用另一个应用程序。。。?不过这有点难看 编辑:如何在“图书馆”中运行图书馆;沙盒“;使用Java的模式?,java,server,sandbox,sandbox-solution,Java,Server,Sandbox,Sandbox Solution,我正在使用一些第三方源代码,这意味着要与GUI一起运行,但我在不使用GUI的情况下对其进行集成,我注意到我正在使用的第三方代码存在严重的内存泄漏。所以我想知道,是否有可能以某种方式在沙箱之类的东西中创建该第三方应用程序实例的对象,在沙箱中我可以稍后删除该对象,并且该代码调用的任何对象的所有引用都将被垃圾收集器删除 这样可能吗?除了实现类似的场景,还有什么替代方案,或者希望唯一的可能性是从流程生成器(如java-jar customApp)调用另一个应用程序。。。?不过这有点难看 编辑: 在一个单
在一个单独的线程中运行该代码,然后等待线程完成,会不会导致垃圾收集器删除与那里调用的内容相关的所有对象?首先,直到您使用内存探查器(例如yourkit)实际研究了内存使用情况,并完全了解内存消耗的原因,你不可能成功地驯服它 第二,如果内存是本机的问题,而不是Java的问题,那么根本没有什么可以做的 以下内容可能与您的愿望相近
将有问题的库加载到它自己的类加载器中,并仅通过一个非常狭窄的接口引用它,该接口加载到主类加载器中,然后继承到特殊的类加载器中。这将使保留对库中创建的对象的引用变得更加困难,但决不是不可能的。例如,如果库创建线程,并将引用放入
ThreadLocal
对象,那么您就回到了开始的位置,除非您可以告诉它终止线程。尽管如此,如果库在静态引用中堆积成吨的对象,这也不会有帮助。您当然可以将本机代码包装到自己制作的对象中,但这并不能防止它泄漏内存。GC无法处理由本机代码分配的内存。我认为目前这是不可靠的。您还必须能够卸载类对象,我不认为JVM在所有情况下都可以这样做。最好只是找到一个没有内存泄漏的库。(如果您指的是本机库而不是Java库,那么是的,所有的赌注都是肯定的。)