JVM系列笔记目录
- 虚拟机的根底概念
- class文件构造
- class文件加载过程
- jvm内存模型
- JVM罕用指令
- GC与调优
指令集分类
基于寄存器的指令集
基于栈的指令集
Hotspot中的Local Variable Table相当于JVM的寄存器
运行时数据区
运行时数据辨别6个局部: PC、JVM Stack、Heap、MethodArea、Native Method Stack、Direct Memory。
- PC: 程序计数器,寄存下一条指令的地位。
JVM Stack:线程独有的栈,寄存一个个栈帧(Stack Frame,每个办法对应一个栈帧。
栈帧组成:
- Local Variable Table 办法本地的参数表
- Operand Stack 操作数栈
- Dynamic Linking 动静链接,简略了解为指向Runtime Constant Pool中的符号链接;如果没有解释,将符号援用解析为间接援用的过程;如果已解释,间接用。感兴趣能够浏览下 Oracle官网JVM标准。
- Return address,返回地址,a() -> b(),办法a调用了办法b, b办法的返回值放在什么中央
- Heap:所有线程共享的堆空间,具体在GC的章节探讨。
MethodArea:办法区,线程共享
- 寄存每一个class的构造
- 办法区是逻辑上的概念,1.8前后有不同实现
1.8版本前指的是永恒代,字符串常量位于PermSpace,FGC不会清理,大小启动的时候指定,不能变。
1.8后指的是元数据区(Meta Space),字符串常量位于堆,会触发FGC清理,不设定的话,就是最大的物理内存
- 办法区中蕴含RunTime Constant Pool,是class中的常量池中的数据运行时寄存的中央
- Native Method Stack:调用了C/C++本地办法的栈。
- Direct Memory:JVM能够间接拜访的内核空间的内存(OS治理的内存),应用NIO,提高效率,实现零拷贝。
运行时数据中PC、JVM Stack、Native Method Stack是线程独有的,而Heap、Method Area则是线程共享的。
JVM罕用指令
如何查看指令的含意?idea中通过插件jclasslib间接点击指令查看,或是查阅JVM标准。
- store 存入LVT
- load 从LVT取
- pop弹栈
- add 加法
- mul乘法
- sub减法
- invoke
InvokeStatic调用静态方法
InvokeVirtual调用能够多态的办法
InvokeInterface调用接口办法
InvokeSpecial调用能够间接定位,不须要多态的办法如private 办法、构造方法
InvokeDynamic调用lambda表达式或者反射或者其余动静语言scala kotlin,或者CGlib ASM,动静产生的类会用到的指令,JVM最难的指令
常识分享,转载请注明出处。学无先后,达者为先!