【问题标题】:Lock contention in Java Beanshell interpreter under high load高负载下 Java Beanshell 解释器中的锁争用
【发布时间】:2017-08-02 12:57:01
【问题描述】:

我们在应用程序中使用 Java BeanShell 解释器 (v1.2 b7) 来动态执行标准 Java 语法。

示例代码

bsh.Interpreter interpreter = new bsh.Interpreter();
interpreter.set("context", ctx);
interpreter.set("transaction", transaction);
interpreter.set("log", log);
interpreter.eval(script);

我们在高负载下遇到问题,当多个线程同时执行上述代码时,我们会看到线程锁争用。我们有多个线程处于等待状态,这会降低应用程序的性能。

以下是等待和阻塞线程的调用堆栈跟踪:

等待线程调用堆栈

java.util.Vector.addElement():619
bsh.classpath.ClassManagerImpl.addListener():N/A
bsh.BshClassManager.addCMListener():N/A
bsh.NameSpace.<init>():N/A
bsh.BlockNameSpace.<init>():N/A
bsh.BSHBlock.eval():N/A
bsh.BSHBlock.eval():N/A
bsh.BSHWhileStatement.eval():N/A
bsh.Interpreter.eval():N/A
bsh.Interpreter.eval():N/A
bsh.Interpreter.eval():N/A

阻塞的线程调用堆栈

java.util.Vector.indexOf():408
java.util.Vector.indexOf():382
java.util.Vector.removeElement():641
bsh.classpath.ClassManagerImpl.addListener():N/A
bsh.BshClassManager.addCMListener():N/A
bsh.NameSpace.<init>():N/A
bsh.BshMethod.invokeDeclaredMethod():N/A
bsh.Name.invokeLocalMethod():N/A
bsh.Name.invokeMethod():N/A
bsh.BSHMethodInvocation.eval():N/A
bsh.BSHPrimaryExpression.eval():N/A
bsh.Interpreter.eval():N/A
bsh.Interpreter.eval():N/A
bsh.Interpreter.eval():N/A

我检查了最新版本(v2.0 b4)的源代码,它似乎也有同样的问题。

我的问题是:

  1. 有人遇到过这样的问题吗?如果是,您能否提出任何可能的解决方案?
  2. 我们使用的代码有问题吗?不建议为每个线程创建一个单独的bsh.Interpreter 实例吗?请注意,我们正在评估的脚本对于不同的线程是不同的。
  3. 在 Java 中是否有任何替代 BeanShell 解释器在高负载下运行良好的替代方案?

【问题讨论】:

    标签: java multithreading beanshell


    【解决方案1】:

    如您所见,beanshell 在侦听器对象上使用 Vector。

    很明显,Vector 在其内部受到“过度保护”,请参阅vector

    BeanShell 1.3.0 于 2003 年 8 月发布,2.0b4 版本于 2005 年 5 月发布。

    您可以查看最新的 2.0b5 beanshell,但我想您最好选择活动项目替代 groovy

    【讨论】:

    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多