当前位置: 首页 > 面试题库 >

记忆沙盒

左华灿
2023-03-14
问题内容

Java应该没有内存泄漏,但是仍然可能。当我的程序出现内存泄漏时,我可以修复它(我希望)。但是,当某些第三方程序包具备该功能时,我该怎么办?几乎什么都没有,除非不使用此软件包。

还有其他解决方案吗?我喜欢沙盒的想法。您被允许在某个区域内做任何您想做的事情,而您的“身体上的”没有能力打扰其他人。有没有办法为Java中的内存使用创建此类沙箱?想象一下=创建用于内存使用的沙箱,允许某些程序包做任何事情,获取结果,并使用此处剩余的垃圾删除此沙箱!GC无并发症,无需清洗或处置内存。只需删除并忘记它即可。

有办法吗?


问题答案:

最好的方法是启动另一个JVM,例如通过套接字与之通信,然后在完成后杀死JVM。

讨论我们是否可以在同一JVM中对其进行沙箱处理将很有趣。

使用完第3方库后,您不再引用该库中的任何对象,那么仍在徘徊的垃圾又是什么?

  1. 它们的类-即使您未引用它们中的任何一个,如果它们由与您的代码相同的类加载器加载,则这些类将保留。而且它们的静态字段可以引用更多的持久数据,依此类推

  2. ThreadLocal-它可能已经设置了一些线程局部变量,而没有清理它们

  3. 线程-它可能产生了一些持续存在的线程

  4. 在某些全局位置(例如System.setProperty()),它将保留在那里。

因此,总的来说,这可能很困难。

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

是否有执行此操作的现有工具?我对此不太了解。我确实有一些实现热可重装服务器的经验,并且我有一些实用程序类可用于此目的。例如

// 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



 类似资料:
  • A我是Drools的新手,读过一些文档和教程,当然,我的问题有一个简单的解决方案。我使用onle规则文件和类计数器,如下所示。环境为:Wintel JDK 1.7(71),DROOLS 6.1.0 有个规矩 这是kModule 跑步的结果 我的问题是: > 为什么“反淋浴1”规则只涉及最后插入的事实?是否存在任何隐藏行为? 3、为什么在count==1的retract object Counter

  • 问题内容: 我有一个程序可以通过递归传递大量数据,例如1000个变量。递归将至少运行50或60次。我担心的是,由于没有足够的空间,是否有可能数据在内存位置上被覆盖,或者如果没有内存,那么我会得到一些例外,即程序内存已经用完(我没有收到这样的错误)? 是否存在错误的解决方案,因为该程序没有更多的内存并且在现有位置上被覆盖? 问题答案: 涉及两个存储区域:堆栈和堆。堆栈是保存方法调用的当前 状态 (即

  • 问题内容: 我的代码中有一些函数,使用记忆很有意义(甚至是强制性的)。 我不想为每个功能分别手动实现。有什么办法(例如在Python中),我可以只使用注释或做其他事情,以便在需要的地方自动获得这些注释? 问题答案: Spring 3.1现在提供了一个注释,它可以做到这一点。 顾名思义,@Cacheable用于划分可缓存的方法-即将结果存储到缓存中的方法,以便在后续调用(具有相同参数)时返回缓存中的

  • 我的想法是有一个这样的东西,您可以在其中存储以前的答案并在以后查找它们。我想这可以通过lambda表达式来完成,但我不太熟悉它们。我不太确定如何编写这个方法,希望得到一些帮助。 用这种方法能做到这一点吗?

  • 我想创建一个程序来模拟Unix服务器上的内存不足(OOM)情况。我创造了这个超级简单的记忆食客: 它消耗的内存与中定义的一样多,现在正好是50 问题是它是有效的。即使在具有1的系统上 当我检查top时,我看到这个过程消耗了50 系统规范:Linux内核3.16(Debian)很可能启用了Overmit(不知道如何检查),没有交换和虚拟化。

  • 问题内容: 内存屏障可确保数据缓存保持一致。但是,是否可以保证TLB保持一致? 我看到一个问题,即在线程之间传递MappedByteBuffer时,JVM(java 7更新1)有时会因内存错误(SIGBUS,SIGSEG)而崩溃。 例如 没有Thread.yield(),我有时会在force(),put()和C的memcpy()中崩溃,所有这些都表明我试图非法访问内存。使用Thread.yield