高负载下 Java Beanshell 解释器中的锁争用

2023-11-29

我们在应用程序中使用 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)的源代码,似乎也有同样的问题。

我的问题是:

  1. 有人遇到过这样的问题吗?如果是,您能否建议任何可能的解决方案?
  2. 我们使用的代码有问题吗?是否不建议创建单独的实例bsh.Interpreter每个线程?请注意,我们正在评估的脚本对于不同的线程是不同的。
  3. Java 中的 BeanShell 解释器有什么替代方案可以在高负载下正常工作吗?

正如您所看到的,beanshell 在侦听器对象上使用 Vector。

显然 Vector 的内部结构受到了“过度保护”,请参见vector

BeanShell 1.3.0于2003年8月发布,2.0b4版本于2005年5月发布。

你可以查看最新的2.0b5豆壳但我想你会更好地选择积极的项目作为groovy

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高负载下 Java Beanshell 解释器中的锁争用 的相关文章

随机推荐

  • 如果日期无效,Spring mvc Joda 日期时间转换器将失败

    我有一个域对象 我想从包含 Joda DateTime 的 JSP 映射 public beanClass private Long id DateTimeFormat private DateTime start getters and
  • 使用 Win API 设置壁纸

    我想以编程方式设置壁纸 这是迄今为止我找到的唯一解决方案 SystemParametersInfoW SPI SETDESKWALLPAPER 1 void wallpaperImageFilePath utf16 SPIF UPDATEI
  • aria-hidden 的存在是否足够,或者是否需要将值设置为“true”(aria-hidden="true")

    html 隐藏 属性是一个布尔值 不需要设置值 只要存在就足够了 那么 aria hidden 属性呢 仅仅存在就足够了吗 或者是否需要设置值 true aria hidden必须具有 true false 值 但请注意 aria hidd
  • 应用内购买服务器模型

    我对应用内购买服务器模型有几个问题 我有我的数据库和一个存储项目描述的表 例如 我有一把剑 价格为 0 49 美元 一把狼牙棒 价格为 0 99 美元 因此表包含字段 id 名称 价格 信息 描述 我想在我的 iOs 应用程序中显示这些商品
  • 使用ANTLR 3.3?

    我正在尝试开始使用 ANTLR 和 C 但由于缺乏文档 教程 我发现它非常困难 我发现了一些针对旧版本的半心半意的教程 但此后 API 似乎发生了一些重大变化 谁能给我一个简单的例子来说明如何创建语法并在短程序中使用它 我终于成功地将我的语
  • 将流式 (utf8) 数据转换为字符串的安全方法是什么?

    假设我是一个用 objc swift 编写的服务器 客户端正在向我发送大量数据 这实际上是一个很大的 utf8 编码字符串 作为服务器 我有 NSInputStream 触发事件来表示它有数据要读取 我获取数据并用它构建一个字符串 但是 如
  • 如何使R中的A列唯一并保留B列中具有最大值的行

    我有一个包含几列 17 的数据框 第 2 列有几行具有相同的值 我只想保留其中一行 特别是第 17 列中具有最大值的行 例如 A B a 1 a 2 a 3 b 5 b 200 Would return A B a 3 b 200 加上其余
  • gdb 在 Centos 上找不到调试信息

    我试图找出一个非常奇怪的问题 我有带有 gdb 的 CentOS 6 5 系统 GNU gdb GDB 红帽企业 Linux 7 2 75 el6 and gcc 海湾合作委员会 GCC 4 8 2 20131212 红帽4 8 2 8 我
  • 如何解析 ASP.NET 网站中的 CSV 文件?

    在我的网站中 我有许多 CSV 文件 我需要解析它们并将其数据插入到我的 MySQL 数据库中 如何以编程方式解析网站中的 CSV 我建议看看TextFieldParser 类在 Net中 您需要包括 Imports Microsoft V
  • OpenCV CV::Mat 和 Eigen::Matrix

    有没有一种可逆的方式来转换 OpenCVcv Mat反对Eigen Matrix 例如 某种做法 cv Mat cvMat Eigen Matrix eigMat camera gt retrieve cvMat magic to conv
  • python中的Pi计算[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 n 迭代次数 由于某种原因 此代码将需要更多的迭代才能从其他代码获得更准确的结果 任何人都可以解释为什么会发生这种情况吗 谢谢 n s x 1000 1 0 for i in ran
  • Grails 应用程序上的破损管道异常

    我使用 jdk 1 7 和 MySQL Workbench 6 3 在 Grails 2 4 4 上开发了一个应用程序 它可以工作一段时间 但在部署几个小时后 我尝试登录 它停止工作并抛出异常 java net SocketExceptio
  • 2 个用户之间的产品订单

    我有三个模型 用户 产品 报价以及这些模型之间的关系的问题 设想 用户 1 发布产品 用户 2 可以向用户 1 发送报价 例如 10 美元 用户 1 可以接受或拒绝报价 我现在的问题是 用户 产品和报价之间的正确关系是什么 我该如何处理这些
  • 为什么不推荐使用带有单个参数(没有转换说明符)的 printf ?

    我正在读的一本书里是这么写的printf不推荐使用单个参数 没有转换说明符 建议替换 printf Hello World with puts Hello World or printf s Hello World 有人可以告诉我为什么吗p
  • Windows 上 PHP7 的 php_ibm_db2.dll 扩展? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我很难找到一个php ibm db2 dllWindows 上 PHP7 的扩展 最新版本在https pecl php net package i
  • 如何使 readLine() 超时

    我的应用程序基本上是一个 CLI 具有所有预期的功能 如提示 历史记录等 它需要等待 STDIN 来获取用户输入 为此 我使用 readLine 系统调用 我创建了一个网络套接字 用于将从用户读取的消息发送到服务器 我的应用程序是单线程的
  • 给定三个点如何计算圆的中心点?

    我正在使用 Javascript 并且我知道 3 个点的位置 我想用它们来找出圆的中心点 我发现了这个逻辑 不是选择的答案 而是有 11 票赞成的答案 https math stackexchange com questions 21365
  • 如何在 Perl 中找到从某个包继承的所有包?

    我有许多不同的网站 我从这些网站下载数据并将其转换为其他格式 使用 Perl 以便在工作中使用 这些网站都是从一个 Perl 脚本运行的 如下所示 usr bin perl use strict use My Package1 use My
  • 使用 Woocommerce 挂钩显示匹配订单项元值中选定的 BACS 帐户

    基于 选择要在 WooCommerce 的感谢页面中显示的 BACS 帐户 回答我的问题之一的代码 我更改了 Woocommerce 核心文件 class wc gateway bacs php 以便选择感谢页面上显示的正确银行帐户 该帐户
  • 高负载下 Java Beanshell 解释器中的锁争用

    我们在应用程序中使用 Java BeanShell 解释器 v1 2 b7 来动态执行标准 Java 语法 示例代码 bsh Interpreter interpreter new bsh Interpreter interpreter s