众所周知,阿里开源的Arthas已经成为Java开发中调优的基本工具,其功能在于监控JVM运行情况,并对CPU、内存状况生成报告或者是火炬图。

从JDK5开始,java.lang.instrument可以使用Instrumentation构建一个独立于应用程序的代理程序(agent),用来监测运行在 JVM 上的其他进程,甚至替换和修改某些类的定义,这是一种虚拟机级别的 AOP (动态代理模式)。一开始,JDK只支持在类运行之前对类进行增强,通过java -javaagent参数指定代理类的方式。利用代理类(agent),在目标运行类被加载之前,通过修改二进制字节码的形式对目标类进行增强。至于什么类被增强,得看agent是否对类进行了判断,如果没有判断那任何类都会被增强。

VM启动前设置Instrument例子:https://blog.csdn.net/chuixue24/article/details/103829931

此处作者编写了两个类输出1和2,在agent中加载了2的字节码文件(为一个byte数组)对1的字节码在类加载前进行了替换。

JDK6以后,Instrumentation类进一步的有了agentmain方法,允许在一个类运行时对其增强。然后sun公司提供了com.sun.tools.attach包,这个包在JDK的lib文件夹的tools.jar内。

使用attach可以向目标JVM attach一个agent,然后方便的监控一个 JVM,运行一个外加的代理程序。

也就是说它的运行时增强也是改写class文件然后重新加载JVM内的类实现的。

attach操作系统层面实现使用了套接字:http://lovestblog.cn/blog/2014/06/18/jvm-attach/?spm=ata.13261165.0.0.26d52428n8NoAy

使用ASM重写字节码:https://www.cnblogs.com/chengxuzhixin/p/14552275.html

网易二面-Arthas的底层原理的更多相关文章

  1. 【T-SQL进阶】02.理解SQL查询的底层原理

    本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...

  2. 理解SQL查询的底层原理

    阅读目录 一.SQL Server组成部分 二.查询的底层原理 本系列[T-SQL]主要是针对T-SQL的总结. T-SQL基础 [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  3. Synchronized之二:synchronized的实现原理

    Java提供了synchronized关键字来支持内在锁.Synchronized关键字可以放在方法的前面.对象的前面.类的前面. 当线程调用同步方法时,它自动获得这个方法所在对象的内在锁,并且方法返 ...

  4. SQL 执行 底层原理(一)

    一.SQL Server组成部分 1.关系引擎:主要作用是优化和执行查询.包含三大组件: (1)命令解析器:检查语法和转换查询树. (2)查询执行器:优化查询. (3)查询优化器:负责执行查询. 2. ...

  5. java面试-CAS底层原理

    一.CAS是什么? 比较并交换,它是一条CPU并发原语. CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B.当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什 ...

  6. WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]

    原文:WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇] 在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常.在服务执行过 ...

  7. 深入源码分析SpringMVC底层原理(二)

    原文链接:深入源码分析SpringMVC底层原理(二) 文章目录 深入分析SpringMVC请求处理过程 1. DispatcherServlet处理请求 1.1 寻找Handler 1.2 没有找到 ...

  8. 【Spring Data JPA篇】JPA的底层原理(二)

    一.接口继承结构 二.底层原理

  9. iOS 技术篇:从使用到了解block底层原理 (二)

    block实质 序言 上篇文章中主要通过简单的demo展示了block的使用场景,本篇将基于上篇文章iOS 技术篇:从使用到了解block底层原理 (一)进一步了解block底层的实现原理. bloc ...

  10. JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能

    摘要: 理解浏览器渲染. 原文:JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是专门探索 J ...

随机推荐

  1. CRC校验模板

    #ifndef CRC_H #define CRC_H #include "main.h" #ifdef CRC_C #endif typedef struct { uchar R ...

  2. Pyodide读取CSV、EXCEL

    from pyodide.http import pyfetch, open_url pyfetch(url="/your/URL/goes/here", method=" ...

  3. Linux FTP服务器配置文件vsftpd.conf 配置

    配置文件/etc/vsftpd/vsftpd.conf local_enable=YES            write_enable=YESlocal_umask=022dirmessage_en ...

  4. GoogleAdMob

    写在最开始==================>一定要确定好中介和GoogleAdMob的版本对应关系 由于GoogleAdMob对接的官方文档是叫你去下载旧版的SDK,然后就很容易就弄混了版本 ...

  5. C++内存分配Arena,指的是提前分配的一大块连续内存空间

    参考: https://stackoverflow.com/questions/12825148/what-is-the-meaning-of-the-term-arena-in-relation-t ...

  6. 邮件合并 :处理ACCESS中批量查询语句的运行

    利用邮件合并,制作批量查询语句,一条一条的复制粘贴并运行. 有点笨但是想不出什么好办法,除非用模块的过程,但还是要手动输入参数.http://www.docin.com/p-695725657.htm ...

  7. alpine镜像安装sshd以进行远程debug

    FROM alpine:latest RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories ...

  8. Flutter中的路由 路由替换 返回到根路由

    一.Flutter 中返回到上一级页面 Navigator.of(context).pop(); 二.Flutter 中替换路由 比如我们从用户中心页面跳转到了 registerFirst 页面,然后 ...

  9. gin web 2

    routers/router.go package routers import ( "github.com/gin-gonic/gin" "gin-blog/pkg/s ...

  10. php 合并,拆分,追加,查找,删除数组教程

    1. 合并数组 array_merge()函数将数组合并到一起,返回一个联合的数组.所得到的数组以第一个输入数组参数开始,按后面数组参数出现的顺序依次迫加.其形式为: array array_merg ...