JVM总结(二)

摘要:
JVM摘要(2)Java内存区域、字节码执行引擎1。内存区中的程序计数器:本地变量表、操作堆栈、动态连接、堆栈帧中存储的方法返回地址。局部变量表还存储各种基本数据类型和对象引用(句柄)。确保在java代码中可以使用没有初始值的实例字段。类的元数据信息、对象的哈希代码和对象的GC生成时间存储在对象头中。JVM要求对象的起始地址必须是8字节的整数倍,并且只能修改句柄中的实例数据指针。
JVM总结(2)java内存区域、字节码执行引擎

1、内存区域

JVM总结(二)第1张

程序计数器:知道线程执行位置,保证线程切换后能恢复到正确的执行位置。

虚拟机栈:存栈帧。栈帧里存局部变量表、操作栈、动态连接、方法返回地址。局部变量表又存了各种基本数据类型和对象引用(句柄)。

本地方法栈:为Native方法服务

堆:存放对象实例和数组,可以处于物理上不连续的内存空间

方法区:存类信息、常量、静态变量。有运行时常量池,存放类的符号引用

堆主要用来存放对象,栈主要用来执行程序。

2、对象的创建

虚拟机遇到一条new指令时,会先去常量池检测能否找到new对应的类的符号引用,并检测这个类是否加载、初始化。

如果加载检查通过,则分配内存。分配内存有两种方式:⑴指针碰撞,针对连续内存区域;⑵空闲列表,针对不连续内存区域。

内存分配完之后,会对内存初始化零值,保证实例字段能在java代码不赋初值也能使用。

接下来对对象信息进行设置,把类的元数据信息、对象的哈希码、对象的GC分代年龄等信息存放在对象头之中。

最后执行用户的Init方法

 

3、对象的内存布局

分为三部分,对象头、实例数据、对齐填充

对象头:⑴对象自身运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁等。⑵类型指针,虚拟机通过这个来确定这个对象是哪个类的实例。⑶如果对象是一个Java数组,那么对象头中还必须有一块用于记录数组长度的数据。

实例数据:对象真正存储的有效信息,也是在程序代码中定义的各种类型的字段内容。

对齐填充:JVM要求对象的起始地址必须是8字节的整数倍,因此当对象实例数据没有对齐时,这部分来补全。

对象的访问定位

JVM总结(二)第2张

取决于虚拟机的实现而定,有“句柄”和“直接指针”两种方式

“句柄”的好处是,在对象被移动(垃圾回收时很普遍),只用修改句柄中的实例数据指针,而reference本身不用修改。

“直接指针”的好处是,速度更快,毕竟节省了一次指针定位的时间开销。由于对象的访问在Java中非常频繁,因此这部分开销节省下来也很可观。

JVM字节码执行引擎


字节码文件即类文件被加载后,就能送入执行引擎了:

输入:字节码文件

处理:字节码解析

输出:执行结果。

物理机的执行引擎是由硬件实现的,虚拟机的执行引擎由于自己实现的。

JVM总结(二)第3张

• 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。

• 每个栈帧都包括了一下几部分:局部变量表、操作数栈、动态连接、方法的返回地址 和一些额外的附加信息。

• 每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。

• 一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧相关联的方法称为当前方法,执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。

局部变量表:

一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。以变量槽slot为单位,一个slot可以放32位数据类型,对于longdouble占用2个slot。

 

操作数栈:

即用来存放操作数的栈结构,当一个方法刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令向操作数栈中写入和提取内容,也就是入栈和出栈的操作。

java虚拟机的解释执行引擎称为基于栈的执行引擎,其中所指的栈就是操作数栈。

动态连接:

运行期将相关的符号引用转换为直接引用

方法返回地址:

方法执行完成的结果值

方法调用:

解析方法的符号引用和确定方法的版本

JVM总结(二)第4张

方法的执行:

解释执行(通过解释器执行)

编译执行(通过JIT编译器产生本地代码执行)

基于栈的代码执行示例

下面我们用简单的案例来解释一下JVM代码执行的过程,代码实例如下:

JVM总结(二)第5张

使用javap指令查看字节码:

JVM总结(二)第6张
 

 

 

免责声明:文章转载自《JVM总结(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ActiveMQ点对点的发送和接收WinForm窗体间如何传值的几种方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java内存及数据区

Java运行时的数据区包括:(其中前两个是线程共享的) 1.方法区(Method Area) 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 2.堆(Heap) 存放对象实例,几乎所有对象实例都在这里分配内存 3.虚拟机栈(VM Stack) 描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个Stack Fram...

最强大的王爽汇编语言学习环境使用教程

最强大的王爽汇编语言学习环境使用教程 一、前言 这是采用VMwere Workstation 12 pro虚拟机软件,搭建的MS-DOS学习环境,在windowsXP/8/10及linux中均可以使用,在这个环境中,我集成了CCDOS中文系统,pdos中文系统,使用这些系统,可以进行中文输入与显示。还集成了,十分著名的汇编语言调试工具TR,它比debug更...

java-mysql(3) 读写image

在mysql里面用来存储图片有一个特殊的数据对象叫做 Blob(Binary Large Object). 数据库里面插入一张图片: 第一步:需要为图片创建一个文件对象 File img = new File(proppath); FileInputStream fileInputStream = null; try { fileInputS...

JVM知识整理和学习(转载并修改)

  JVM是虚拟机,也是一种规范,他遵循着冯·诺依曼体系结构的设计原理。   冯·诺依曼体系结构中,指出计算机处理的数据和指令都是二进制数,采用存储程序方式不加区分的存储在同一个存储器里,并且顺序执行,指令由操作码和地址码组成,操作码决定了操作类型和所操作的数的数字类型,地址码则指出地址码和操作数。   从dos到window8,从unix到ubuntu和...

JSP:服务器端和前端互传中文信息出现乱码

在前端和服务器端交互的过程中主要是通过HTTP协议进行交互的,而在Servlet接口中有提供一个HttpServlet类用于创建应用于HTTP协议的Servlet. 在Servlet容器中提供了ServletRequest和ServletResponse两个类,通过这两个类的对象来获得数据和发送数据。到这里我们就知道如果需要设置编码格式,那么我们就需要设置...

NSURLSession的基本使用

一、简单说明   在iOS9.0之后,以前使用的NSURLConnection过期,苹果推荐使用NSURLSession来替换NSURLConnection完成网路请求相关操作。   NSURLSession的使用非常简单,先根据会话对象创建一个请求Task,然后执行该Task即可。   NSURLSessionTask本身是一个抽象类,在使用的时候,通常...