JVM
文章平均质量分 88
寻常记
这个作者很懒,什么都没留下…
展开
-
对象内存布局
结构 内存布局 对象头(Object Header) 实例数据(Instance Data) 对齐填充 对象头 对象头包含两部分,分别是运行时元数据和类型指针。 运行时元数据(Mark Word) 哈希值 GC分代年龄 锁状态标识 线程持有的锁 偏向线程ID 偏向时间戳 类型指针(Klass Word) 指向类元数据InstanceKlass,确定该对象所属的类型。指向的其实是方法区中存放的类元信息。 ...原创 2021-09-11 09:33:07 · 72 阅读 · 0 评论 -
JVM执行引擎
执行引擎概述 执行引擎属于JVM的下层,里面包括解释器,及时编译器,垃圾回收器 JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。 想要让一个 Java 程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。 执行引擎的工作流程 执行引擎在执行过程中需要执行哪个字节码指令完全依赖于原创 2021-09-10 10:30:01 · 95 阅读 · 0 评论 -
方法区概览
方法区,内部包含了运行时常量池 字节码文件,内部包含了常量池 为什么需要常量池 Java源文件中的类或接口,在编译后产生一个字节码文件。如果一个类中有多个方法都使用了相同的常量或方法引用,那么可以将这个常量存到常量池中。字节码的code区只需包含指向常量池的引用即可。因为常量池中只保存一份相同值的常量,因此节约了空间。 运行时常量池 运行时常量池(Runtime Constant Pool)是方法区的一部分,常量池表(Constant Pool Table)是Class文件的一部分,用于存放编译器生成..原创 2021-09-09 09:04:45 · 106 阅读 · 0 评论 -
方法调用:解析与分派
方法调用:解析与分派 Class文件的编译过程中不包含传统程序语言编译的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(也就是之前说的直接引用)。 这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂,某些调用需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。 在 JVM 中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关。 解析 调用目标在程序代码写好、编译器进行编译那一刻就已经确定下来。这类方原创 2021-09-08 09:48:58 · 211 阅读 · 0 评论 -
虚拟机栈的结构
虚拟机栈 概述 由于不同平台CPU的架构不同,所以为了满足跨平台的要求,Java指令没有设计为基于寄存器的,而是根据栈来设计的。 栈是运行时的单位,堆是存储的单位 栈解决了程序的运行问题,即程序如何执行 堆解决数据的存储问题,即数据怎么放,放哪里 Java虚拟机栈 Java 虚拟机栈(Java Virtual Machine Stack),早期也叫 Java 栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的 Java 方法调用,线程私有。 栈原创 2021-09-07 09:25:43 · 6981 阅读 · 0 评论 -
类加载子系统
类加载子系统概览 类加载子系统的作用 类加载子系统负责从文件系统或者网络中加载Class文件。ClassLoader只负责class文件的加载,至于是否执行,则由Execution Engine决定。 加载的类信息会存放在方法区的一块内存空间上。除了类信息,方法区还会存放运行时常量池信息,包括字面量和符号引用。 class file 存在于本地硬盘上,可以理解为设计师画在纸上的模板,而最终这个模板在执行的时候是要加载到 JVM 当中来根据这个文件实例化出 n 个一模一 样的实例。 class fil原创 2021-09-05 11:49:09 · 108 阅读 · 0 评论