我们在应用程序中使用 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 解释器有什么替代方案可以在高负载下正常工作吗?
正如您所看到的,beanshell 在侦听器对象上使用 Vector。
显然 Vector 的内部结构受到了“过度保护”,请参见vector
BeanShell 1.3.0于2003年8月发布,2.0b4版本于2005年5月发布。
你可以查看最新的2.0b5豆壳但我想你会更好地选择积极的项目作为groovy
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)