2017-08-02 27 views
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我問題。

我的問題是:

  1. 有沒有人遇到過這樣的問題嗎?如果是的話,你能否提出任何可能的解決辦法?
  2. 我們正在使用的代碼有問題嗎?不建議每個線程創建一個單獨的實例bsh.Interpreter?請注意,我們正在評估的腳本對於不同的線程是不同的。
  3. Java中的BeanShell解釋器有沒有其他選擇,可以在高負載下正常工作?

回答

1

正如你可以看到beanshell在偵聽器對象上使用Vector。

顯然Vector是在其內部「過度保護」看到vector

BeanShell的1.3.0 2003年8月發佈,2005年5月版2.0b4

您可以檢查最新2.0b5 beanshell但我猜你會有更好的活動項目替代groovy

+0

他們是否有任何內存泄漏和鎖定與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