内存沙盒
Sandbox for memory
Java 应该不会有内存泄漏,但它仍然是可能的。当我的程序有内存泄漏时,我可以修复它(我希望)。但是当一些第三方包有它时我该怎么办?除了不使用这个包外几乎什么都没有。
还有其他解决办法吗?我喜欢沙箱的想法。你可以在某个区域内做任何你想做的事,你 "physical" 没有能力打扰你框外的其他人。有没有办法为 Java 中的内存使用创建这样的沙箱?想象一下=为内存使用创建沙箱,允许一些包做任何它做的事情,获取结果并删除这个沙箱,不管这里留下什么垃圾!没有 GC 的并发症,没有清理或处置内存。删掉就好了。
有办法吗?
最好的方法是启动另一个 JVM,通过套接字与其通信(例如),完成后终止 JVM。
讨论我们是否可以在同一个 JVM 中对其进行沙箱化会很有趣。
在您使用完第 3 方库后,您不再引用该库中的任何对象,仍然挥之不去的垃圾可能是什么?
它们的 类 - 即使您没有引用它们中的任何一个,如果它们由与您的代码相同的类加载器加载,这些 类 将持续存在。他们的静态字段可以引用更多的延迟数据,等等
ThreadLocal - 它可能已经设置了一些线程局部变量,并且没有清理它们
线程 - 它可能会产生一些持续存在的线程
在全球某个地方 - 例如System.setProperty() - 它会留在那里。
所以总的来说,这可能很难。
但是,我们可以使用一个单独的类加载器和一个单独的线程来执行第 3 方库,这种策略在大多数情况下可能可以卸载所有第 3 方创建的垃圾。
是否有现成的工具可以做到这一点?我对此不太了解。我确实有一些实现可热重载服务器的经验,并且我有一些实用程序 类 可用于此目的。例如
// 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`
Java 应该不会有内存泄漏,但它仍然是可能的。当我的程序有内存泄漏时,我可以修复它(我希望)。但是当一些第三方包有它时我该怎么办?除了不使用这个包外几乎什么都没有。
还有其他解决办法吗?我喜欢沙箱的想法。你可以在某个区域内做任何你想做的事,你 "physical" 没有能力打扰你框外的其他人。有没有办法为 Java 中的内存使用创建这样的沙箱?想象一下=为内存使用创建沙箱,允许一些包做任何它做的事情,获取结果并删除这个沙箱,不管这里留下什么垃圾!没有 GC 的并发症,没有清理或处置内存。删掉就好了。
有办法吗?
最好的方法是启动另一个 JVM,通过套接字与其通信(例如),完成后终止 JVM。
讨论我们是否可以在同一个 JVM 中对其进行沙箱化会很有趣。
在您使用完第 3 方库后,您不再引用该库中的任何对象,仍然挥之不去的垃圾可能是什么?
它们的 类 - 即使您没有引用它们中的任何一个,如果它们由与您的代码相同的类加载器加载,这些 类 将持续存在。他们的静态字段可以引用更多的延迟数据,等等
ThreadLocal - 它可能已经设置了一些线程局部变量,并且没有清理它们
线程 - 它可能会产生一些持续存在的线程
在全球某个地方 - 例如System.setProperty() - 它会留在那里。
所以总的来说,这可能很难。
但是,我们可以使用一个单独的类加载器和一个单独的线程来执行第 3 方库,这种策略在大多数情况下可能可以卸载所有第 3 方创建的垃圾。
是否有现成的工具可以做到这一点?我对此不太了解。我确实有一些实现可热重载服务器的经验,并且我有一些实用程序 类 可用于此目的。例如
// 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`