监控 Java 应用程序上的锁争用

2024-05-10

我正在尝试创建一个小基准(在 Groovy 中),以显示几个同步方法上的高线程争用。当监控自愿上下文切换时,应该会出现高争用,在 Linux 中,这可以通过“pidstat”来实现。

程序如下:

class Res {

    private int n;

    synchronized public void inc() {
        n++;
        def foo = []
        for (int i = 0; i < 1000; ++i) foo << "hello"
    }

    synchronized public int getN() {
        return n;
    }

}




while (true) {

    Res res = new Res()

    int N = 100000

    for (int i = 0; i < N; ++i) {
        new Thread({ 
            res.inc() 
            if (res.getN() == N) {
                println "ok" 
            }
        }).start()
    }

    while (res.getN() < N) {

    }


    println "========================="

}

但命令

pidstat -w -I -p 26848 5

在自愿上下文切换列上打印 0。该程序创建了 100000 个并发访问同步方法的线程。我不敢相信在这样的工作负载下,没有发生上下文切换。

我的基准有什么问题?


您的命令仅显示主线程的统计信息,不计算子 PID。

Hotspot JVM 有内部同步计数器,但需要一些魔法才能解锁它们:

  1. Run jconsole.exe -J-Djconsole.showUnsupported并连接到您的 JVM。
  2. Select 连接 -> 热点 MBean -> 创建从主菜单。
  3. Open sun.management.HotspotRuntime on the MBeans tab.
  4. You'll find a bunch of counters under InternalRuntimeCounters attribute:
    • sun.rt._sync_ContendedLockAttempts
    • sun.rt._sync_Parks
    • sun.rt._sync_Notifications
    • sun.rt._sync_Inflations
      etc.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

监控 Java 应用程序上的锁争用 的相关文章

随机推荐

  • 从 cin 读取整数序列并将它们存储在向量中

    这就是我读取整数的方法std cin并将它们存储在向量中 int number vector
  • Express js 错误:“express 已弃用 res.sendfile:请改用 res.sendFile”

    设置路径的正确方法是什么 在我的应用程序中 我使用此代码设置发送文件的路径 app get function req res get put post delete res sendfile dirname client views ind
  • 张量流急切模块错误

    我的操作系统是 Ubuntu 16 04 Python版本是3 5 张量流版本是14 0 当我尝试为 TF Eager 模块编写简单代码时 import tensorflow as tf import tensorflow contrib
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 为什么 [].push([]) 返回 1? [复制]

    这个问题在这里已经有答案了 为什么这会返回 1 push outputs 1 push 返回数组的新长度 one push two returns 2 array length is 2 one two push something ret
  • 将活动工作表作为电子邮件附件从 Google 工作表发送

    我有一个谷歌表单 可以捕获电子表格中的响应 目前 每次做出新响应时 它都会创建一个新工作表 我现在尝试将 邮寄活动工作表脚本 添加到创建新工作表的现有脚本中 但是我收到错误 请求失败https docs google com spreads
  • 什么是 C++11 扩展 [-Wc++11-extensions]

    我需要一些帮助来了解此错误发生的位置 警告 非静态数据成员的类内初始化是 C 11 扩展 Wc 11 extensions 这是它来自的代码部分 typedef struct Hand bool straight false bool fl
  • /WEB-INF 中的 JSP 返回“HTTP 状态 404 请求的资源不可用”

    我创建了一个 JSP 文件 sample jsp This is jsp program 我把它放在这里samplejsp项目 samplejsp WebContent WEB INF sample jsp 我通过以下网址打开了它 http
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • RemoveEventListener 在 Firefox 版本 58 中不起作用

    但它在 Chrome 中有效 这是我的 UI EventBus 代码 原型 addEventListener方法是一样的 只不过remove换成了add UI EventBus removeEventListener function ob
  • 在javascript中我们如何识别一个对象是Hash还是Array?

    我的 JSON 调用的输出可以是数组或哈希 我如何区分这两者 现代浏览器支持Array isArray obj method See MDN https developer mozilla org en US docs Web JavaSc
  • scrapy python 请求未定义

    我在这里找到了答案 code for site in sites Link site xpath a href extract CompleteLink urlparse urljoin response url Link yield Re
  • 转换 Java -> Grails ... 如何加载这些属性?

    我正在将 Java Web 应用程序转换为 Grails 1 2 1 在我的 Java 应用程序中 我有一个从 properties 文件加载属性的单例 我已经看到我可以将其加载到 Config groovy conf 文件中 如果我的属性
  • 关闭应用程序后如何调试

    我正在尝试重现问题 这需要在特定位置关闭并重新打开我的应用程序 这是我的问题 1 如何查看我的日志 使用NSLog命令 当我的 iPhone 未连接到 XCode 时 2 是否可以将iPhone模拟器的特定位置 例如市中心 设置为默认位置
  • 是否可以在 Apple M1 计算机上安装 Weblogic 12.2.1.4?

    我一直在寻找有关这方面的信息 但没有找到任何信息 我认为 Oracle 站点上没有可用于在 Apple M1 设备上安装 Weblogic 12 2 1 X 的版本 但也许可以使用 Rosetta 2 来完成此操作 有人尝试过吗 我不能 因
  • 如何访问 gem5 线程统计信息?

    我希望在我的一些工作中使用 gem5 并且对其功能有一个非常普遍的问题 我的问题是 使用 gem5 我可以获得有关单个线程的行为 系统资源使用情况的统计信息 无论是 SE 还是 FS 模式 例如 如果我的应用程序中运行 2 个线程 我是否可
  • 为什么将未使用的返回值转换为 void?

    int fn void whatever void fn 是否有任何理由将未使用的返回值强制转换为 void 或者我认为这完全是浪费时间 David s answer https stackoverflow com questions 68
  • Tkinter 绑定 Mac OS“command+q”

    当我按 Command q 时 我试图 停止 根窗口退出 但这是不可能的 其他快捷键在我的 Mac 操作系统上有效 即使在 Windows Linux 中 Alt F4 绑定也可以 捕获 但在 Mac 操作系统中对我来说是不可能的 有任何想
  • Python“self”关键字[重复]

    这个问题在这里已经有答案了 我是 Python 新手 通常使用 C 最近几天开始使用它 在类中 是否需要在对该类的数据成员和方法的任何调用前添加前缀 因此 如果我在该类中调用方法或从该类获取值 我需要使用self method or sel
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s