【问题标题】:Limiting memory of V8 Context限制 V8 上下文的内存
【发布时间】:2017-07-14 09:53:34
【问题描述】:

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

【问题讨论】:

    标签: v8


    【解决方案1】:

    现在应该很容易做到

    • context.EstimatedSize() 获取上下文的估计大小
    • isolate.TerminateExecution() 当上下文超出可接受的内存/cpu 使用率/其他情况时

    如果存在无限循环(或其他阻塞,例如高 cpu 计算),我认为您可以使用isolate.RequestInterrupt()

    【解决方案2】:

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

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

    查看此提交中的一些示例:

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

    特别是你有:

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

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

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 2011-11-03
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多