高负载下Java Beanshell解释器中的锁争用

时间:2017-08-02 03:27:02

标签: java multithreading beanshell

我们在应用程序中使用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解释器是否可以替代高负载?

1 个答案:

答案 0 :(得分:1)

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

显然,Vector在其内部“被过度保护”,请参阅vector

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

你可以查看最新的2.0b5 beanshell,但我想你最好选择活跃的项目作为groovy