我有一个脚本服务器,可以在我们的服务器上运行任意java脚本代码。在任何给定的时间,可以运行多个脚本,我想防止一个行为不端的脚本占用机器上的所有内存。我可以通过让每个脚本在自己的进程中运行并使用现成的监视工具监视每个进程的ram使用情况,杀死并重新启动失控的进程来实现这一点。我不想这样做,因为我想避免每当其中一个脚本疯狂时重启二进制文件的成本。在v8中是否有一种方法可以设置每个上下文/隔离内存限制,我可以使用它来对运行的脚本进行沙箱化?
答案 0 :(得分:1)
现在应该很容易做到
context.EstimatedSize()
获取估算的上下文大小isolate.TerminateExecution()
当上下文超出可接受的内存/ CPU使用量/无论为了获得访问权限,如果存在无限循环(或其他阻塞,如高cpu计算),我认为你可以使用isolate.RequestInterrupt()
答案 1 :(得分:0)
这是不可能的。 此进程的所有JavaScript上下文共享相同的对象堆。
WebKit / Chromium尝试在上下文OOM之后禁用上下文。 http://code.google.com/searchframe#OAMlx_jo-ck/src/third_party/WebKit/Source/WebCore/bindings/v8/V8Proxy.cpp&exact_package=chromium&q=V8Proxy&type=cs&l=361
来源:
答案 2 :(得分:0)
单个进程可以运行多个分离,如果您有1个分离到1个上下文比例,则可以轻松
请参阅此提交中的一些示例:
https://github.com/discourse/mini_racer/commit/f7ec907547e9a6ea888b2587e4edee3766752dd3
特别是你有:
v8::HeapStatistics stats;
isolate->GetHeapStatistics(&stats);
您还可以使用内存分配回调等奇特功能。