標準のJava構文を動的に実行するために、アプリケーションでJava BeanShellインタプリタ(v1.2 b7)を使用しています。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インタプリタに関連するメモリリークやロック競合の問題はありますか?私はgroovy通訳の問題について書かれたブログはほとんどないと思う。あなたはそれについて何か経験がありますか? https://stackoverflow.com/questions/36407119/groovyshell-in-java8-memory-leak-duplicated-classes-src-code-load-test-pr https://stackoverflow.com/questions/24169976/理解 - groovy-grails-classloader-leak https://www.linkedin.com/pulse/jmeter-tuning-jsr223-groovy-vs-java-beanshell-raw-nagendran – Aman