JVM基础结构与字节码执行引擎
JVM基础结构
JVM内部结构如下:栈、堆。

栈
JVM中的栈主要是指线程里面的栈,里面有方法栈、native方法栈、PC寄存器等等;每个方法栈是由栈帧组成的;每个栈帧是由局部变量表、操作数栈等组成。
每个栈帧其实就代表一个方法
堆
java中所有对象都在堆中分配;堆中对象又分为年轻代、老年代等等,不同代的对象使用不同垃圾回收算法。
-XMs:启动虚拟机预留的内存
-Xmx:最大的堆内存
一、堆的分代假设
根据研究表明,堆中对象大部分都是创建后,立马就可以被销毁的。如:

为了优化堆中的内存,将堆中对象分为不同代。在年轻代中,GC发生比较频繁;在老年代中,GC发生比较少。
二、堆的分代
- 年轻代:
Young Generation - 老年代:
Old Generation/Tenured - 永久代:
Permanent Generation
永久代在
Java虚拟机规范中是没有的,但是Host Spot虚拟机中有。
三、方法区
方法区被所有线程共享;方法区是用来存储编译后的代码,即存储每个类的运行时常量池、字段和方法。
方法区在虚拟机启动时创建;虽然方法区在逻辑上是堆的一部分,但在一些简单的实现中,方法区可以选择不进行垃圾回收和紧凑化。
方法区在java8的变化
java7之前:方法区的实现:永久代,是作为堆的一部分;java8之后:方法区的实现:metaspace,是堆外的内存;
1、为什么要这样改变?
因为java可以动态加载字节码信息,这样方法区就会慢慢的挤占堆中内存。为了避免与堆争抢内存,java8将方法区的实现移至堆外。
2、方法区、永久代、MetaSpace的区别?
方法区是java虚拟机规范所规定的一个概念。其中java7实现方法区的地方称为永久代;java8实现方法区的地方称为MetaSpace
字节码文件的结构
java程序在运行的时候,将源码编译成字节码,字节码在不同系统上的JVM翻译成对应的机器码。这是Java平台无关性的基础。

但是,编译后的字节码是如何读取到JVM中的?字节码执行引擎是如何识别、执行指令?

1、如何查看字节码文件
classpy工具IDEA的jclasslib Bytecode viewer插件
2、字节码文件结构
一个字节码文件包含以下部分:

(1)magic:0xCAFEBABE
class文件的magic code,用于标识该文件是class文件。
(2)minor_version、major_version
用于标识该class文件的版本,防止高版本的class文件被低版本的JVM读取并执行。
(3)constant_pool:常量池
用于存储该class文件经常被使用的信息,优化内存。比如说System.out.print()
(4)access_flag
表示这个类得访问权限,对应到java源码就是public、final之类的
字节码执行引擎
这里以一个线程为例。一般来说,一个方法栈最底层的栈帧都是Thread.run方法。当一个线程准备调用另一个方法时,会先将实参拷贝一份到新栈帧的局部变量表里,然后再执行代码。
1、局部变量表
每次调用新方法时,会默认将当前对象的地址this作为局部变量表的第一个参数;后面存放传过来的参数。这与javascript的做法很相似。
2、方法调用的相关指令
invokevirtual:一般实例方法,有多态;invokeinterface:接口方法,有多态invokestatuc:静态方法,无多态invokespecial:特殊方法,无多态invokedynamic:动态调用,JDK7新增,方法无需在编译时确定
3、方法调用的过程
(1)在开始时
- 方法栈新增一个栈帧;
- 实例方法的
this、参数放到局部变量表中; - 开始新栈帧中字节码的执行;
(2)在返回时
- 将返回值放在调用者方法栈帧中的操作数栈上;
(3)在异常出现时
- 寻找匹配的异常处理代码
(4)在finally时
- 为每个分支新增一个跳转
4、为什么Mockito、EasyMock无法对private、static方法进行mock?
因为他们mock方法是通过覆盖这些方法来实现的,而private、static没法被覆盖。PowerMock是通过修改字节码文件达到mock私有、静态方法的。
JVM基础结构与字节码执行引擎的更多相关文章
- 【JVM】虚拟机字节码执行引擎
概念模型上,典型的帧栈结构如下(栈是线程私有的,也就是每个线程都会有自己的栈). 典型的帧栈结构 局部变量表 存放方法参数和方法内部定义的局部变量.在编译阶段, ...
- JVM学习笔记:字节码执行引擎
JVM学习笔记:字节码执行引擎 移步大神贴:http://rednaxelafx.iteye.com/blog/492667
- JVM总结(五):JVM字节码执行引擎
JVM字节码执行引擎 运行时栈帧结构 局部变量表 操作数栈 动态连接 方法返回地址 附加信息 方法调用 解析 分派 –“重载”和“重写”的实现 静态分派 动态分派 单分派和多分派 JVM动态分派的实现 ...
- 深入理解JVM虚拟机5:虚拟机字节码执行引擎
虚拟机字节码执行引擎 转自https://juejin.im/post/5abc97ff518825556a727e66 所谓的「虚拟机字节码执行引擎」其实就是 JVM 根据 Class 文件中给 ...
- 一夜搞懂 | JVM 字节码执行引擎
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习字节码执行引擎? 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一 ...
- 深入理解java虚拟机(5)---字节码执行引擎
字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...
- 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...
- 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)
目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...
- java虚拟机字节码执行引擎
定义 java虚拟机字节码执行引擎是jvm最核心的组成部分之一,它做的事情很简单:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果.在不同的虚拟机实现里,执行引擎在执行java代码 ...
随机推荐
- 『配置』服务器搭建 Office Online Server2016 实现文档预览
博主有话说:这个过程我遇到了很多错误,所以出了一个错误整理文章,所以当你在配置过程中遇到了问题,可以先去这篇文章里找找!加油! 先打开我吧:https://www.cnblogs.com/pukua/ ...
- Python 获取MySql某个表所有字段名
在使用python导出数据库中数据的时候,往往除了插入的数据以外,还有表字段等信息需要导出,查阅了资料后发现了2种方法 第一种:在mysql自带的表里查询,这个表保存了每张表的字段信息,可以用pymy ...
- 复制url事故:出现特殊的字符%E2%80%8B
复制url事故:出现特殊的字符%E2%80%8B 问题:直接其他地方复制过来的中文字进行网页搜索.或者中文字识别排序等情况的,会出现搜索不到的情况. 解决方法:可能存在复制源里面的文字带了空白url编 ...
- 027.掌握Service-Ingress使用
一 Ingress简介 1.1 Ingress 通常Service的表现形式为IP:Port,即工作在TCP/IP层. 对于基于HTTP的服务来说,不同的URL地址经常对应到不同的后端服务(RS)或者 ...
- Linux启动nginx时报错nginx: [emerg] getpwnam("nginx") failed
编译时指定了用户而没有创建用户导致报错 解决: 查看你添加的用户是什么, [root@localhost nginx]# sbin/nginx -Vnginx version: nginx/1.10. ...
- el-select下拉加载(实现懒加载)
情况:项目出现了下拉数据量过大,出现页面卡死问题,反馈到我这:当时实现思路1.使用render函数去渲染下拉框 试了发现卡死情况依然存在,所以尝试方法2 2.使用原生js去添加下拉框的<opti ...
- WPF 启动缓慢问题
Actually there's 2 main reasons that the default project type for WPF applications is x86. Intellitr ...
- Java 垃圾收集技术
前言 在计算机科学中,垃圾收回(GC: garbage collection)是内存自动管理的一种方式,它并不是同 Java 语言一起诞生的,实际上,早在 1959 年为了简化 Lisp 语言的手动内 ...
- DOM-XSS攻击原理与防御
XSS的中文名称叫跨站脚本,是WEB漏洞中比较常见的一种,特点就是可以将恶意HTML/JavaScript代码注入到受害用户浏览的网页上,从而达到劫持用户会话的目的.XSS根据恶意脚本的传递方式可以分 ...
- [Alg] 文本匹配-单模匹配-KMP
1. 暴力求解 如下图所示.蓝色的小三角表示和sequence比较时的开始字符,绿色小三角表示失败后模式串比对的开始字符,红色框表示当前比较的字符对. 当和模式串发生不匹配时,蓝色小三角后移一位,绿色 ...
