【发布时间】: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)的源代码,它似乎也有同样的问题。
我的问题是:
- 有人遇到过这样的问题吗?如果是,您能否提出任何可能的解决方案?
- 我们使用的代码有问题吗?不建议为每个线程创建一个单独的
bsh.Interpreter实例吗?请注意,我们正在评估的脚本对于不同的线程是不同的。 - 在 Java 中是否有任何替代 BeanShell 解释器在高负载下运行良好的替代方案?
【问题讨论】:
标签: java multithreading beanshell