首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存沙箱

内存沙箱
EN

Stack Overflow用户
提问于 2015-05-14 00:43:10
回答 1查看 503关注 0票数 5

Java应该没有内存泄漏,但它仍然是可能的。当我的程序内存泄漏时,我可以修复它(我希望)。但是当一些第三方包拥有它时,我能做些什么呢?除了不要使用这个包外,几乎什么都没有。

还有别的解决办法吗?我喜欢沙箱这个主意。你可以在某些区域内做任何你想做的事情,而且你“身体上的”没有能力去打扰你的盒子之外的其他人。有办法在Java中创建这样的沙箱来使用内存吗?想象=为内存使用创建沙箱,允许一些包做它做的任何事情,获取结果,并删除这个沙箱与任何垃圾在这里!无GC并发症,不清除或处置记忆。把它删掉就好了。

是否有办法这样做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-14 00:58:18

最好的方法是启动另一个JVM,使用套接字(例如)与它通信,并在完成之后关闭JVM。

讨论我们是否可以在同一个JVM中对其进行沙箱的讨论会很有趣。

当您已经完成了使用第三方库,并且不再引用该库中的任何对象之后,还有什么垃圾仍然存在呢?

  1. 它们的类--即使您没有引用它们中的任何一个,如果它们是由与代码相同的类加载器加载的,这些类将保持不变。它们的静态字段可以引用更多的数据,等等。
  2. ThreadLocal -它可以设置一些线程局部变量,而不是清理它们。
  3. 线程-它可能产生了一些持久的线程。
  4. 在一些全球性的地方,例如System.setProperty(),它将停留在那里。

所以总的来说,这可能很困难。

但是,我们可以使用单独的类加载器和单独的线程来执行第三方库,在大多数情况下,这种策略可能可以卸载第三方创建的所有垃圾。

是否存在这样做的现有工具?我对此不太了解。我确实有一些实现热可重加载服务器的经验,我也有一些实用程序类可用于此目的。例如

代码语言:javascript
复制
// wrap 3rd party code, expose it as some java.*.* interface
public 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30227510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档