2、JVM 原理 学习二

2022-10-04  本文已影响0人  XX杰

1、再次熟悉一遍 JVM 虚拟机

WX20221004-111406.png

a、其中jvm 包括 类装载子系统(classLoader)、运行时数据区和字节码执行引擎
b、运行时数据区 区分为 线程私有和线程共享。他其实是划分的内存块

1、虚拟机栈 是运行java 方法的.  (栈的数据结构是 先进后出 )
    注意:栈存放的是 运行一个 **方法**  所需要的 数据,指令和返回地址等数据。
         我们程序运行的时候都会有一个最外面的 main() 方法,每一个方法的数据信息我们称呼为 * 栈帧 * ,所以main方法会先入栈中。
         main方法中我们调用其他方法,就会有其他方法的 * 栈帧 * 加入进来。方法的执行就是栈帧入栈到出栈的过程 
2、本地方法栈是运行 native(C/C++)的
3、堆中存放的是实例,方法区存放的是变量、常量和类信息

一个栈帧的数据构成


WX20221004-115315.png

c、运行时数据区说白了就是存放数据的地方。JVM 虚拟机需要通过字节码执行引擎 把数据进行存取,然后通过本地接口库和对应的系统进行对接
d、程序计数器的作用

1、字节码执行引擎 是通过程序计数器 来获取 将要执行哪一行 代码的。所以他记录了程序下一行代码执行的位置
2、因为java 是多线程的,所以CPU的时间片不会一直执行一个线程,所以当CPU执行其他线程,在执行本线程的时候,会从程序计数器中获取到将要执行的位置(说白了作用跟上面一样)

2、字节码插桩 (asm)

还有一种 是通过 AOP 的方式,对 java 代码进行插入
a、通过对class 文件进行 读----修改----写 来完成
这个方式 是需要 了解 字节码,对 class 文件进行修改的

1、先找到 需要修改的 .class 文件,通过FileInputStream 流的方式读取 他
2、通过 ClassReader 类 和 ClassWriter 类 来 对 文件 流进行读写
3、对 class 文件进行  插桩  (也就是修改),之后一般都是在次 写入到 原来的 class 文件里
4、字节码的插桩 需要 一个 额外的 .class 访问类(我们起一个名字叫 classVistor) 通过 classreader.accept() 添加,
  classVistor 是 用于 类访问和分析的。 我们还需要一个 对该类中的方法进行访问和 分析的类 (起名字叫做 MethodVistor 该类需要 extends AdviceAdapter) 
Method Vistor 中有回掉 方法,声明在方法执行前执行和在方法执行后执行
上一篇下一篇

猜你喜欢

热点阅读