我们在应用程序中使用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
实例?请注意,我们正在评估的脚本对于不同的线程是不同的。