Groovy脚本:如何防止可能的内存泄漏或无限循环

Groovy脚本:如何防止可能的内存泄漏或无限循环,groovy,Groovy,我们打算允许我们的客户在我们的平台内执行他们自己的groovy脚本。他们将只允许访问受控制的方法,但我们有一个问题。 尽管我们会尽一切可能小心,但我们可能会遇到长时间运行循环的风险——导致内存泄漏或无限循环,从而影响我们的平台。 groovy脚本中是否有任何固有的方法可以防止这种可能性?您可以使用 好文章 如果可以限制DSL(客户端可以运行的代码),使其只能调用对象上的方法,那么就由您来保证内存不会以任何方式泄漏或滥用 通过传递自定义编译器配置来构建GroovyShell 使用方法添加编译器自定

我们打算允许我们的客户在我们的平台内执行他们自己的groovy脚本。他们将只允许访问受控制的方法,但我们有一个问题。 尽管我们会尽一切可能小心,但我们可能会遇到长时间运行循环的风险——导致内存泄漏或无限循环,从而影响我们的平台。
groovy脚本中是否有任何固有的方法可以防止这种可能性?

您可以使用

好文章

如果可以限制DSL(客户端可以运行的代码),使其只能调用对象上的方法,那么就由您来保证内存不会以任何方式泄漏或滥用

  • 通过传递自定义
    编译器配置来构建
    GroovyShell
  • 使用方法
    添加编译器自定义程序(…)
  • 您可能希望让DSL中的所有函数调用通过您的自定义类。为此,让shell解析脚本,将脚本转换为
    DelegatingScript
    ,并将其传递给对象:

    DemoDSLHelper delegate = new DemoDSLHelper(); // Your custom class with custom methods you want to expose in the DSL
    GroovyShell shell = new GroovyShell(createCompilerConfiguration());
    Script script = shell.parse(scriptText);
    ((DelegatingScript)script).setDelegate(delegate);
    Object result = script.run();
    
  • 在一个单独的JVM中运行它,这样您就可以使用依赖于操作系统的原语(容器化等)对进程实施限制,或者在它不遵守您的规则(持续时间、资源消耗等)的情况下简单地杀死它。如果它必须在做其他事情的JVM中运行,那么至少需要对DSL中接受的内容进行严格限制


  • 通过完整的可运行示例。

    您可以使用

    好文章

    如果可以限制DSL(客户端可以运行的代码),使其只能调用对象上的方法,那么就由您来保证内存不会以任何方式泄漏或滥用

  • 通过传递自定义
    编译器配置来构建
    GroovyShell
  • 使用方法
    添加编译器自定义程序(…)
  • 您可能希望让DSL中的所有函数调用通过您的自定义类。为此,让shell解析脚本,将脚本转换为
    DelegatingScript
    ,并将其传递给对象:

    DemoDSLHelper delegate = new DemoDSLHelper(); // Your custom class with custom methods you want to expose in the DSL
    GroovyShell shell = new GroovyShell(createCompilerConfiguration());
    Script script = shell.parse(scriptText);
    ((DelegatingScript)script).setDelegate(delegate);
    Object result = script.run();
    
  • 在一个单独的JVM中运行它,这样您就可以使用依赖于操作系统的原语(容器化等)对进程实施限制,或者在它不遵守您的规则(持续时间、资源消耗等)的情况下简单地杀死它。如果它必须在做其他事情的JVM中运行,那么至少需要对DSL中接受的内容进行严格限制


  • 还有完整的可运行示例。

    为什么不在一段时间后终止脚本?循环本身可能是有限的,但今年或明年仍然无法完成。为什么不在一段时间后终止脚本呢?一个循环本身可能是有限的,但仍然不会在今年或明年完成。谢谢Hugues的要点。SecureASTCustomizer看起来很有用。这篇文章也很好。谢谢你的要点。SecureASTCustomizer看起来很有用。这篇文章也不错。