深入理解JVM虚拟机的原理
了解JVM虚拟机是Java程序员必经之路,想要成为一名Java高级程序员,或者是Java架构师,都是对JVM虚拟机有着一定的理解,有自己的见解。
Mr Cao
时间顺流而下,生活逆水行舟。
展开
-
JVM虚拟机---(15)字节码执行引擎
字节码执行引擎 一、运行时栈帧结构栈帧(stack Frame)是用于支持虚拟机进行方法调用和方法执行的结构,是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧中存储了方法的局部变量表,操作数栈,动态连接和方法返回地址以及额外的一些附加信息。每个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。 在编译程序代码中,局部变量表的大小已...原创 2019-08-03 16:19:09 · 168 阅读 · 0 评论 -
JVM虚拟机---(14)类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。一、类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、...原创 2019-08-02 17:34:21 · 170 阅读 · 0 评论 -
JVM虚拟机---(13)字节码指令
一、字节码指令简介Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的0至多个代表此操作所需参数(称为操作数,Operands)而构成,由于虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个字节码。操作码的长度为1个字节,因此最大只有256条。基于栈的指令集架构。二、字节码与数据类型在虚拟机...原创 2019-08-01 15:04:41 · 266 阅读 · 0 评论 -
JVM虚拟机---(12)Class文件结构之属性表集合
属性表集合 对于字段表出现的ConstantValue和方法表出现的Code,LineNumberTable属性表集合是不是不太理解,在没有看到属性表之前,我看那两个也是有点懵逼,现在就专门说属性表。 属性表(attribute_info)在字段表和方法表都有出现过,在Class文件、字段表、方法表都可以携带自己的属性表集合,以用于描述某些场景专有的信息。...原创 2019-07-30 15:15:16 · 215 阅读 · 0 评论 -
JVM虚拟机---(11)Class文件结构之方法表集合
方法表集合Class文件对方法的描述与对字段的描述几乎一致,方法表的结构和字段表的结构一样,依次包括了访问标志(access_flags)、名称索引(name_index)、描述符索引(description_index)、属性表集合(attribute)几项。1.方法表结构(method_info)组成访问标志(access_flags)、名称索引(name_index...原创 2019-07-24 14:19:19 · 510 阅读 · 0 评论 -
JVM虚拟机---(10)Class文件结构之字段表集合
字段表集合字段表集合是指由若干个字段表组成的集合。字段表(field_info)用于描述接口或者类中声明的变量,字段(field)包括类级变量以及实例级变量,但不包括在方法内部声明的局部变量。1.包含的信息字段的作用域(public、private、protected修饰符)。 是实例变量还是类变量(static修饰符)。 可变性(final)。 并发可见性(volatile...原创 2019-07-24 14:16:00 · 336 阅读 · 1 评论 -
JVM虚拟机---(9)Class文件结构之类索引、父类索引与接口索引集合
类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合(interfaces)是一组u2类型的数据的集合,Class文件中由这三项数据来确定这个类的继承关系。类索引类索引用于确定这个类的全限定名。父类索引父类索引用于确定这个类的父类的全限定名。由于Java语言不允许多重继承,所以父类索引只有一个,除了java.lang.Obj...原创 2019-07-24 14:13:12 · 144 阅读 · 0 评论 -
JVM虚拟机---(8)Class文件结构之访问标志
在常量池结束后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口。是否定义为public类型,是否定义为abstract类型。如果是类的话,是否被声明为final等。具体的标志位以及标志的含义如下图access_flags中一共有16个标志位可以使用,当前只定义了8个,没有使用的标记一律为0....原创 2019-07-24 14:08:34 · 172 阅读 · 0 评论 -
JVM虚拟机---(7)Class文件结构之常量池
Class文件结构之常量池在主次版本号之后的是常量池的入口,常量池可以理解为Class文件中的资源仓库,它是Class文件结构中与其它项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时还是Class中第一个出现的表类型数据项目。1.常量池存放的内容字面量(Literal):文本字符串、声明为final的常量值。符号引用(Symbolic Refere...原创 2019-07-24 14:02:09 · 234 阅读 · 1 评论 -
JVM虚拟机---(6)Class文件结构之魔数与版本号
Java语言中的各种变量、关键字和运算符号的语义最终都是由多条字节码命令组合而成的,因此字节码命令所能提供语义描述能力肯定会比Java语言本身更加强大。因此,有一些Java语言本身无法有效支持的语言特性不代表字节码本身无法有效支持,这也为其他语言实现一些有别于Java的语言特性提供了基础。Class:在运行java代码时,会将java文件编译成class文件,然后将class文件装载到j...原创 2019-07-24 13:55:16 · 211 阅读 · 0 评论 -
JVM虚拟机---(5)虚拟机工具
虚拟机工具一、Jps(命令行)Jps(Java Process Status)虚拟机进程,类似任务管理器jps命令格式:jps [ options ] [ hostid ]第一行的10256是本地虚拟机的唯一ID第二行及之后的是显示线程ID和类全名jps工具主要选项 选 项 作 用 ...原创 2019-07-19 16:06:50 · 190 阅读 · 0 评论 -
JVM虚拟机---(4)内存分配
内存分配JDK1.7之前,JVM将内存分为三个区域:新生代,老年代,永久代。一、新生代(Young Generation) 新生代的目标是尽可能快速收集那些生命周期短的对象,一般情况下,所有新生成的对象首先都是放在新生代的。使用流程:当Eden区满时,会触发young gc,将存活的对象复制到From区,当Eden区再次触发young gc,会扫描Eden区和Fro...原创 2019-07-16 09:19:03 · 183 阅读 · 0 评论 -
JVM虚拟机---(3)垃圾回收机制
垃圾回收机制JVM的五大数据区域:程序计数器,虚拟机栈,本地方法栈,方法区,Heap堆。其中程序计算器、虚拟机栈、本地方法栈这3个区域都是由线程生产周期,线程结束后自然就会被回收,所以这几个区域的内存分配和回收都是具备稳定性,不需要考虑回收的问题。但方法区和Heap堆就不行,它们的内存的分配和回收是动态的,这2个区域便是垃圾收集器关注点。一、如何判断对象为垃圾对象垃圾收集器在对He...原创 2019-07-12 16:20:34 · 176 阅读 · 0 评论 -
JVM虚拟机---(2)HotSpot虚拟机对象
一、对象的创建1.new类名2.根据new的参数在常量池中定位一个类的符号引用3.如果没有找到这个符号引用,说明类还没有被加载,则进行类的加载,解析和初始化4.虚拟机为对象分配内存(位于堆中)5.将分配的内存初始化为零值(不包括对象头)6.调用对象的<init>方法二、对象的结构1.Header(对象头)1.自身运行时数据(Mark Word): ...原创 2019-07-12 11:23:13 · 122 阅读 · 0 评论 -
JVM虚拟机---(1)JVM运行时数据区域
一、程序计数器指向当前线程正在执行的字节码指令的地址,行号。1.程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。2.程序计数器处于线程独占区。3.如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是native方法,这个计数器的值为undefined。4.此区域是唯一一个在Java虚拟机规范中没有规定...原创 2019-07-12 11:14:54 · 130 阅读 · 0 评论