Java 虚拟机诊断利器

1.png

背景

最近学习Java字节码过程中遇到了反射,有段代码是这样的:

package com.example.classstudy;import java.lang.reflect.Method;/*** @author TY*/
public class ReflectionTest {private static int count = 0;public static void foo() {new Exception("test#" + (count++)).printStackTrace();}public static void main(String[] args) throws Exception {Class<?> clz = Class.forName("com.example.classstudy.ReflectionTest");Method method = clz.getMethod("foo");for (int i = 0; i < 20; i++) {method.invoke(null);}}
}

就是一段简单的反射调用 foo 方法,执行 20 次,然后看执行结果:

2.png

可以看到在 15 次调用 foo 方法后,第 16 次调用 foo 方法是走的 GeneratedMethodAccessor1 来调用的。我嘞个擦,怎么回事,调着调着就不一样了,于是跟代码,跟到了下面这个类:

3.png

其中这句代码就是对反射调用的次数做了控制


if (++this.numInvocations > ReflectionFactory.inflationThreshold() 
&& !ReflectUtil.isVMAnonymousClass(
this.method.getDeclaringClass())) {MethodAccessorImpl var3 = (MethodAccessorImpl)(new MethodAccessorGenerator()).generateMethod(this.method.getDeclaringClass(), this.method.getName(), this.method.getParameterTypes(), this.method.getReturnType(), this.method.getExceptionTypes(), this.method.getModifiers());this.parent.setDelegate(var3);}

this.numInvocations 的默认值是 0,而 ReflectionFactory.inflationThreshold() 默认是 15,当大于 15 的时候会通过 ASM 技术动态生成 GeneratedMethodAccessor1 类来调用 invoke 方法,但是,因为是动态生成的,我们怎么才能看到这个类实际长什么样子呢?

Arthas

这个时候,就可以用上阿里的 arthas(阿尔萨斯)了。

4.png

首先下载 arthas:

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

然后启动 arthas:

java -jar arthas-boot.jar

启动之后界面长这个样子:

5.png

其中什么 23012, 28436 等是当前环境中现有的 java 进程,然后需要连接到哪个进程就输前面的编号(1234 啥的),输了之后回车。那么我首先改写一下最开始的那个程序,让他不退出:

package com.example.classstudy;import java.lang.reflect.Method;/*** @author TY*/
public class ReflectionTest {private static int count = 0;public static void foo() {new Exception("test#" + (count++)).printStackTrace();}public static void main(String[] args) throws Exception {Class<?> clz = Class.forName("com.example.classstudy.ReflectionTest");Method method = clz.getMethod("foo");for (int i = 0; i < 20; i++) {method.invoke(null);}System.in.read();}
}

重新启动程序之后,查看 arthas 界面:

6.png

可以看到 32480 正是我们运行的程序,输入编号 2 去连接到该进程:

7.png

然后就可以将动态生成的类 dump 下来:

dump sun.reflect.GeneratedMethodAccessor1

8.png

可以看到字节码被 dump 下来了,找到该文件用 javap 来查看:

javap -c -v -p -l GeneratedMethodAccessor1.class

9.png

没有问题,可以查看到,然后剩下的就是人肉翻译字节码啦。。。

本篇关于Arthas的使用其实很少,我只是因为学到这个地方简单的用了下,但是已经感受到了 Arthas 的强大之处,它甚至还支持 web 界面。。。

10.png

相当厉害!

 

 

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDC报告:中国公有云服务市场同比增长49.7%,领跑全球

IDC最新发布的《全球及中国公有云服务市场&#xff08;2020年&#xff09;跟踪》报告显示&#xff0c;2020年全球公有云服务整体市场规模&#xff08;IaaS/PaaS/SaaS&#xff09;达到3,124.2亿美元&#xff0c;同比增长24.1%&#xff0c;中国公有云服务整体市场规模达到193.8亿…

是谁在调用我?使用 arthas+jprofiler 做复杂链路分析

简介&#xff1a; Arthas 是阿里巴巴开源的应用诊断利器&#xff0c;提供了 profiler 命令&#xff0c;可以生成热点火焰图。通过采样录制调用链路来做性能分析&#xff0c;极大提升了线上排查性能问题的效率。 作者 | 羽涅 阿里巴巴 CCO 技术部技术专家&#xff0c;承担 CCO …

Arthas 初探--安装初步适用

简介&#xff1a; 由于在项目中遇到一种情况&#xff0c;某段代码在进行单元测试和在 tomcat 容器中运行的性能相差数百倍&#xff0c;因此需要分析在不同环境下某个方法执行的具体时间&#xff0c;从而确定问题。Arthas 可以做到无侵入的监控应用远行情况。 作者 | agmtopy 由…

用 Arthas 神器来诊断 HBase 异常进程

1. 异常突起 HBase 集群的某一个 RegionServer 的 CPU 使用率突然飙升到百分之百&#xff0c;单独重启该 RegionServer 之后&#xff0c;CPU 的负载依旧会逐渐攀上顶峰。多次重启集群之后&#xff0c;CPU 满载的现象依然会复现&#xff0c;且会持续居高不下&#xff0c;慢慢地…

赠书 | 如何部署一个Knative Service

我们以一个go语言编写的程序代码为例&#xff0c;创建一个简单的Web服务&#xff0c;当该服务接收到HTTP GET请求时会根据环境变量TARGET传递的内容向response输出Hello $TATGET! 内容。1. 创建一个文件名为helloworld.go的文件。程序源码如下&#xff1a;package mainimport (…

一文读懂阿里云网络-SLB负载均衡新姿势

简介&#xff1a; 简介&#xff1a;负载均衡是洛神网络中最为关键的网元之一&#xff0c;其担负着网络流量分发的重任&#xff0c;有了它之后&#xff0c;用户在浏览应用的时候才能体会到“丝般顺滑”的感觉。欢迎免费体验SLB性能保障型负载均衡产品&#xff01; 通过此文&…

聊聊缓存机制:双写兜兜转转,又回到了串行化

来源 | moon聊技术责编 | 寇雪芹头图 | 下载于ICphoto什么是双写&#xff1f;这个很好理解&#xff0c;双写就是说&#xff0c;一份数据在数据库存一份&#xff0c;在缓存中也存一份&#xff0c;给缓存一个过期时间&#xff0c;当读不到缓存时从数据库读出来然后写入缓存。为什…

如何基于大数据及AI平台实现业务系统实时化?

简介&#xff1a; 后疫情时代的新社会模式及经济形态必将催生出新的商业模式&#xff0c;在线业务及相关应用场景的流量呈现井喷式发展&#xff0c;常规的离线系统及离线机器学习平台已无法满足业务发展要求。 作者&#xff1a;高旸&#xff08;吾与&#xff09;&#xff0c;阿…

基于 Flink 的典型 ETL 场景实现

简介&#xff1a; 本文将从数仓诞生的背景、数仓架构、离线与实时数仓的对比着手&#xff0c;综述数仓发展演进&#xff0c;然后分享基于 Flink 实现典型 ETL 场景的几个方案。 作者&#xff1a;买蓉 美团点评高级技术专家整理&#xff1a;赵阳&#xff08;Flink 社区志愿者&…

商用密码技术与应用创新的方向是什么?安全牛发布《商密报告》全面揭晓

编辑 | 宋慧 出品 | CSDN云计算 头图 | 付费下载于东方IC 2021年4月22日&#xff0c;由安全牛举办的2021商用密码技术创新研讨会暨《2021商用密码创新应用指南》&#xff08;以下简称《商密报告》&#xff09;发布会在北京举行。 北京谷安天下科技有限公司副总裁贺晓辉在研讨…

Flink 源码 | 自定义 Format 消费 Maxwell CDC 数据

Flink 1.11 最重要的 Feature —— Hive Streaming 之前已经和大家分享过了&#xff0c;今天就和大家来聊一聊另一个特别重要的功能 —— CDC。 CDC概述 何为CDC&#xff1f;Change Data Capture&#xff0c;将数据库中的’增’、’改’、’删’操作记录下来。在很早之前是通…

阿里巴巴大数据实践:大数据建设方法论OneData

来源&#xff1a;数智化转型俱乐部 面对爆炸式增长的数据&#xff0c;如何建设高效的数据模型和体系&#xff0c;对这些数据进行有序和有结构地分类组织和存储&#xff0c;避免重复建设和数据不一致性&#xff0c;保证数据的规范性&#xff0c;一直是大数据系统建设不断追求的…

干货!一文搞懂无状态服务

来源 | 机智的程序员小熊责编 | 寇雪芹头图 | 下载于视觉中国事故的发生是量的积累的结果&#xff0c;任何事情都没有表面看起来那么简单&#xff0c;在软件运行的过程中&#xff0c;随着用户量的增加&#xff0c;不考虑高可用&#xff0c;迟早有一天会发生故障&#xff0c;不得…

后疫情时代,这家在线教育机构如何乘“云”而上

简介&#xff1a; 阿里云依托于云计算的基础设施特性&#xff0c;能够帮助教育机构避免业务侧重复投入、提高资源利用率、降低开发和运维成本&#xff0c;使洋葱学院激发出更大的活力&#xff0c;在后疫情时代得到更多用户的青睐 新冠疫情让现代人类和国际社会经历了大规模的隔…

2021全球权威AI性能竞赛MLPerf最新榜单: 浪潮获18项冠军几近半壁江山

4月22日&#xff0c;全球权威AI基准评测MLPerf公布2021年最新榜单&#xff0c;在全部有效41个项目中&#xff0c;浪潮获得18项性能第一&#xff0c;斩获几近半数冠军。 MLPerf™由图灵奖得主大卫•帕特森 &#xff08;David Patterson&#xff09;联合谷歌、斯坦福、哈佛大学…

NFS文件锁一致性设计原理解析

简介&#xff1a; 在存储系统中&#xff0c; NFS&#xff08;Network File System&#xff0c;即网络文件系统&#xff09;是一个重要的概念&#xff0c;已成为兼容POSIX语义的分布式文件系统的基础。它允许在多个主机之间共享公共文件系统&#xff0c;并提供数据共享的优势&am…

作为工程师,你真的了解无服务器?

译者 | 王欢来源 | 分布式实验室头图 | 下载于ICphoto最近&#xff0c;我在YouTube上看了一个非常出色的开发人员的视频。它的标题是“无服务器毫无意义”。虽然我非常喜欢该视频&#xff0c;但也不敢确定作者关于无服务器的观点是否完全正确&#xff0c;因此我想在本文中进行讨…

recaf反编译 java jar包

文章目录1. 获取方式2. 软件运行3. 导入jar4. 模式切换5. 字符串混淆解析1. 获取方式 添加QQ群获取197453088 2. 软件运行 java -jar recaf-2.21.13.jar3. 导入jar 4. 模式切换 5. 字符串混淆解析 如何解密Allatori 混淆的字符串 Java ALLATORIxDEMO

分布式锁在存储系统中的技术实践

简介&#xff1a; 阿里云存储提供了完整的分布式锁解决方案&#xff0c;经过了阿里云众多云产品宝贵的业务场景中长期锤炼&#xff0c;稳定高可靠&#xff0c;且提供了多种语言的SDK选择&#xff0c;甚至是RESTful集成方案。 1 背景 针对共享资源的互斥访问历来是很多业务系统…

Spring Cloud 应用在 Kubernetes 上的最佳实践 — 高可用(混沌工程)

简介&#xff1a; 从上篇开始&#xff0c;我们进入到了高可用的章节&#xff0c;上篇提到的熔断能力&#xff0c;是历年保障大促当天晚上整个系统不被洪峰流量打垮的法宝&#xff0c;本篇介绍的措施与熔断有不一样的地方&#xff1f; 前言 从上篇开始&#xff0c;我们进入到了…