首页 > 其他分享 >如何在OpenJ9场景下使用Arthas

如何在OpenJ9场景下使用Arthas

时间:2023-09-06 12:22:24浏览次数:43  
标签:场景 java Arthas taobao arthas OpenJ9 com

Alibaba开源的Arthas是一个非常有名的Java诊断工具,他可以解析JVM的运行资源占用,运行状况,可以查看类的加载过程,使用的类加载器等等。但是比较可惜的是,他没有对于OpenJ9做出额外的支持,因此当你的JVM选择OpenJ9后,使用arthas可能会存在一定问题。本文将从我的亲身使用出发,看看OpenJ9在使用Arthas时会遇到哪些问题?
  dashboard
  dashboard是arthas的指令之一,该指令用于展示当前系统的实时面板。但是在实际使用中会发现,如果OpenJ9中启用-Xgcpolicy:balanced的gc策略,会报如下的错误:

  [arthas@73192]$ dashboard
  process dashboard failed: init argument cannot be less than -1

  查看Arthas的日志文件,文件中有更加详细的日志:

  java.lang.IllegalArgumentException: init argument cannot be less than -1
  at java.lang.management.MemoryUsage.<init>(MemoryUsage.java:94)
  at com.ibm.java.lang.management.internal.MemoryPoolMXBeanImpl.getUsageImpl(Native Method)
  at com.ibm.java.lang.management.internal.MemoryPoolMXBeanImpl.getUsage(MemoryPoolMXBeanImpl.java:235)
  at com.taobao.arthas.core.command.monitor200.MemoryCommand.getUsage(MemoryCommand.java:82)
  at com.taobao.arthas.core.command.monitor200.MemoryCommand.memoryInfo(MemoryCommand.java:52)
  at com.taobao.arthas.core.command.monitor200.DashboardCommand$DashboardTimerTask.run(DashboardCommand.java:245)
  at java.util.TimerThread.mainLoop(Timer.java:555)
  at java.util.TimerThread.run(Timer.java:505)

  本来以为是Arthas对于OpenJ9不兼容导致的,但是经过一番研究发现事情并不是那么简单。

  写一个最简单的程序来进行验证:
public static void main(String[] args) {
    List<MemoryPoolMXBean> memoryPoolMXBeans = ManagementFactory.getMemoryPoolMXBeans();

    for (MemoryPoolMXBean memoryPoolMXBean : memoryPoolMXBeans) {
        memoryPoolMXBean.getUsage();
    }
}

  这么简单一个demo居然在OpenJ9 balanced gc策略下抛出了异常:

  Exception in thread "main" java.lang.IllegalArgumentException: init argument cannot be less than -1
  at java.management/java.lang.management.MemoryUsage.<init>(MemoryUsage.java:94)
  at java.management/com.ibm.java.lang.management.internal.MemoryPoolMXBeanImpl.getUsageImpl(Native Method)
  at java.management/com.ibm.java.lang.management.internal.MemoryPoolMXBeanImpl.getUsage(MemoryPoolMXBeanImpl.java:235)
  at org.example.openj9.Test.main(Test.java:12)

  经过测试验证,确认了这个是OpenJ9的bug,错怪Arthas了!

  经过和OpenJ9社区的沟通,发现这个bug会在空闲的region数小于Eden region数时产生,此时的"reserved size"会小于0,并导致报错。遗憾的是,此bug目前还未修复,预计将在后续的7月份的版本中进行修复并发布。
  trace
  使用trace可以排查具体的类的加载时长,排查执行慢的原因。不过在OpenJ9场景下使用trace会出现如下报错:
[arthas@22508]$ trace org.springframework* * '#cost > 1000'
Affect(class count: 4180 , method count: 33388) cost in 28438 ms, listenerId: 1
Enhance error! exception: java.lang.VerifyError
error happens when enhancing class: null, check arthas log: /Users/logs/arthas/arthas.lo
java.lang.VerifyError: null
        at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
        at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:156)
        at com.taobao.arthas.core.advisor.Enhancer.enhance(Enhancer.java:446)
        at com.taobao.arthas.core.command.monitor200.EnhancerCommand.enhance(EnhancerCommand.java:162)
        at com.taobao.arthas.core.command.monitor200.EnhancerCommand.process(EnhancerCommand.java:109)
        at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82)
        at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18)
        at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111)
        at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108)
        at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:385)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:826)

       查看日志发现如上报错:

  这让我百思不得其解,没办法只好求助Arthas社区,可是得到的结果就是Arthas不支持OpenJ9。没办法,既然不支持,那么我们就换种办法来排查问题。

  火焰图
  Arthas火焰图是基于开源项目async-profiler实现的,async-profiler使用C++实现。支持生成应用热点的火焰图。其也可以用于排查应用执行慢的问题。他本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
  然而在实际的使用中,会发现火焰图也不支持OpenJ9。
  没办法,又又又只能去社区寻找答案。最终经过排查,发现async-profiler是做了OpenJ9的支持的,不过,这些支持在2.7+版本后才陆续合并入主分支,而Arthas的最新版本引用的是2.6.x的async-profiler,因此不支持OpenJ9也是情理之中了。
  于是我们只好自己动手丰衣足食。好在Arthas集成async-profiler的方法非常粗暴,是直接使用的so文件,于是我们直接替换Arthas的async-profiler目录下的几个so文件,将之替换为最新版本的,果然火焰图能力就能够正常使用了。
  后续在提了Issue之后,Arthas社区近期反应已经将async-profiler升级至了高版本,因此只要下载最新版本就能让OpenJ9也可以使用Arthas的火焰图能力了。
  总结
  OpenJ9虽然有其优势,但是在实际中的用户远远不如HotSpot,因此在各个开源项目中的支持还远远不够。在折腾Arthas的过程中遇到了无数的坑,而且很多还是无法简单解决的,本文只是简单选取几个遇到的典型问题,希望能够有相同需求的朋友们能够一起来 踩坑 探索。

标签:场景,java,Arthas,taobao,arthas,OpenJ9,com
From: https://www.cnblogs.com/a509968115/p/17682000.html

相关文章

  • [数据库] SQL特定查询场景之时间段切分方法
    1序言大数据项目、数据分析场景中,经常遇到需要切分时段的需求。如下是一些项目上的经验总结。2实时数仓即席查询场景的解决方法2.1函数拼接法方法特点:时间数据以时间戳形式存储在数据库,而非以时间字符串查询时实时运算时间段基于此,支持根据终端用户所处位置/时区......
  • 探索STM32F030的低功耗特性及应用场景
    TM32F030是意法半导体推出的一款低功耗微控制器,它采用ARMCortex-M0内核,带有丰富的外设和高度灵活的可编程性,适用于多种应用场景。本文将探索STM32F030的低功耗特性及其应用场景。STM32F030参数详情。一、STM32F030的低功耗特性1.低功耗模式STM32F030可以进入多种低功耗模式,包......
  • Linux中有哪些常用的网络命令,分别适用于什么场景?
    Linux作为一种广泛使用的操作系统,其网络功能非常强大。在Linux系统中,有很多网络相关的命令可以用于管理和配置网络,比如ifconfig、netstat、ping、traceroute、route等等。本文将对一些常用的Linux网络命令进行详细介绍。一、ifconfig命令ifconfig命令用于显示和配置Linux系统的网......
  • 国标EHOME视频平台EasyCVR云边端协同与算力调度在AI视频检测场景中的应用意义
    AI在医疗卫生、能源动力、交通航天、语言图像识别等领域发挥着重要作用,并且在安防领域也具有巨大潜力。应用人工智能、深度学习、视频结构化技术、物联网技术和大数据分析等创新技术,使得安防视频监控具备强大的能力。基于AI的智能识别分析技术已经成为视频监控的标准配置。通过智能......
  • 三维模型OBJ格式轻量化压缩在大规模场景的加载和渲染的作用分析
    三维模型OBJ格式轻量化压缩在大规模场景的加载和渲染的作用分析 OBJ格式是一种常用的三维模型文件格式,它存储了三维模型的几何信息和纹理坐标等相关属性。在大规模场景中加载和渲染三维模型时,OBJ格式的轻量化压缩对于提高性能和效率起到了重要的作用。首先,使用OBJ格式的轻量......
  • 光纤传感器的特点及应用场景梳理
    一特点:光纤具有很多优异的性能,例如:具有抗电磁和原子辐射干扰的性能,径细、质软、重量轻的机械性能;绝缘、无感应的电气性能;耐水、耐高温、耐腐蚀的化学性能等,它能够在人达不到的地方(如高温区),或者对人有害的地区(如核辐射区),起到人的耳目的作用,而且还能超越人的生理界限,接收人的......
  • IPSec的工作原理及应用场景
    IPSec(InternetProtocolSecurity)是一组开放的网络安全协议,为IP网络提供安全性的协议和服务集合。它被设计为同时支持IPv4和IPv6网络,主要通过加密与验证等方式,为IP数据包提供安全服务。IPSec主要包括网安协议AH(AuthenticationHeader)和ESP(EncapsulatingSecurtiyPayload),以及密钥管......
  • 工业物联网平台如何应对高并发应用场景
    随着数字化进程的不断发展,数字化技术正在逐渐融入到我们的工业、商业、生活等各个领域和行业中。越来越多、越来越复杂的个体与设备接入到数字网络中,海量数据的高并发问题是无法避免的,这也是工业物联网系统面对的巨大挑战。对此,数之能提供高并发、官翻机接入的工业物联网平台,可以适......
  • 5G工业网关常见应用场景介绍
    5G工业网关是指基于5G网络技术的工业物联网网关设备,用于连接和管理工业设备和各个物联网子系统。它可以实现数据采集、远程监控、远程控制和数据传输等功能,广泛应用于工业自动化、智能制造、智能交通等领域。以下是一些5G工业网关的应用场景:  1、工业自动化:5G工业网关可以与......
  • @Transactional 失效场景
    @Transactional失效场景1.方法不是public修饰的。2.同一个类里面,不同方法的相互调用必须都带上@Transactional注解,否则会失效。3.默认是针对runtimeException异常进行回滚,如果需要对其他异常回滚需要使用rollbackFor属性指定异常类型。4.异常被你的catch“吃了”导致@Tran......