1
我們在我們的應用程序中使用Java BeanShell解釋器(v1.2 b7)來動態執行標準Java語法。在高負載下鎖定Java Beanshell解釋器中的爭用
示例代碼
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),它似乎也有sa我問題。
我的問題是:
- 有沒有人遇到過這樣的問題嗎?如果是的話,你能否提出任何可能的解決辦法?
- 我們正在使用的代碼有問題嗎?不建議每個線程創建一個單獨的實例
bsh.Interpreter
?請注意,我們正在評估的腳本對於不同的線程是不同的。 - Java中的BeanShell解釋器有沒有其他選擇,可以在高負載下正常工作?
他們是否有任何內存泄漏和鎖定與groovy解釋器相關的爭用問題?我發現很少有博客寫關於常規口譯員的問題。你有任何經驗嗎? https://stackoverflow.com/questions/36407119/groovyshell-in-java8-memory-leak-duplicated-classes-src-code-load-test-pr https://stackoverflow.com/questions/24169976/諒解-GOOGY-GRILL-CLASS-LOADER-leak https://www.linkedin.com/pulse/jmeter-tuning-jsr223-groovy-vs-java-beanshell-raw-nagendran – Aman