3

我有一个脚本服务器,可以在我们的服务器上运行任意 java 脚本代码。在任何给定时间,都可以运行多个脚本,我想防止一个行为不端的脚本耗尽机器上的所有内存。我可以通过让每个脚本在自己的进程中运行并使用现成的监视工具来监视每个进程的内存使用情况,杀死并重新启动那些失控的进程来做到这一点。我不想这样做,因为我想避免每次这些脚本之一发疯时重新启动二进制文件的成本。v8 中有没有办法设置每个上下文/隔离内存限制,我可以用它来沙箱运行脚本?

4

3 回答 3

1

单个进程可以运行多个隔离,如果您有 1 个隔离与 1 个上下文的比率,您可以轻松

  1. 限制每个隔离的内存使用
  2. 获取堆统计信息

请参阅此提交中的一些示例:

https://github.com/discourse/mini_racer/commit/f7ec907547e9a6ea888b2587e4edee3766752dd3

特别是你有:

v8::HeapStatistics stats;
isolate->GetHeapStatistics(&stats);

还有一些花哨的功能,例如您可以使用的内存分配回调。

于 2017-07-14T01:53:34.550 回答
1

现在应该很容易做到

  • context.EstimatedSize()获得上下文的估计大小
  • isolate.TerminateExecution()当上下文超出可接受的内存/cpu使用率/无论什么时候

为了在存在无限循环(或其他阻塞,如高 CPU 计算)时获得访问权限,我认为您可以使用isolate.RequestInterrupt()

于 2016-01-09T15:40:26.540 回答
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

资料来源:

于 2012-04-25T16:38:28.293 回答