JVM基础结构与字节码执行引擎

JVM基础结构

JVM内部结构如下:栈、堆。

file

JVM中的栈主要是指线程里面的栈,里面有方法栈、native方法栈、PC寄存器等等;每个方法栈是由栈帧组成的;每个栈帧是由局部变量表、操作数栈等组成。

每个栈帧其实就代表一个方法

java中所有对象都在堆中分配;堆中对象又分为年轻代、老年代等等,不同代的对象使用不同垃圾回收算法。

-XMs:启动虚拟机预留的内存
-Xmx:最大的堆内存

一、堆的分代假设

根据研究表明,堆中对象大部分都是创建后,立马就可以被销毁的。如:


Plumbr_Handbook_Java_Garbage_Collection

为了优化堆中的内存,将堆中对象分为不同代。在年轻代中,GC发生比较频繁;在老年代中,GC发生比较少。

二、堆的分代

  • 年轻代:Young Generation
  • 老年代:Old Generation/Tenured
  • 永久代:Permanent Generation

永久代在Java虚拟机规范中是没有的,但是Host Spot虚拟机中有。

file

三、方法区

方法区被所有线程共享;方法区是用来存储编译后的代码,即存储每个类的运行时常量池、字段和方法。
方法区在虚拟机启动时创建;虽然方法区在逻辑上是堆的一部分,但在一些简单的实现中,方法区可以选择不进行垃圾回收和紧凑化。

方法区在java8的变化

  • java7之前:方法区的实现:永久代,是作为堆的一部分;
  • java8之后:方法区的实现:metaspace,是堆外的内存;

1、为什么要这样改变?
因为java可以动态加载字节码信息,这样方法区就会慢慢的挤占堆中内存。为了避免与堆争抢内存,java8将方法区的实现移至堆外。
2、方法区、永久代、MetaSpace的区别?
方法区是java虚拟机规范所规定的一个概念。其中java7实现方法区的地方称为永久代;java8实现方法区的地方称为MetaSpace


字节码文件的结构

java程序在运行的时候,将源码编译成字节码,字节码在不同系统上的JVM翻译成对应的机器码。这是Java平台无关性的基础

file

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

file

1、如何查看字节码文件

  • classpy工具
  • IDEAjclasslib Bytecode viewer插件

2、字节码文件结构
一个字节码文件包含以下部分:

file

(1)magic:0xCAFEBABE
class文件的magic code,用于标识该文件是class文件。

(2)minor_versionmajor_version
用于标识该class文件的版本,防止高版本的class文件被低版本的JVM读取并执行。

(3)constant_pool:常量池
用于存储该class文件经常被使用的信息,优化内存。比如说System.out.print()

(4)access_flag
表示这个类得访问权限,对应到java源码就是publicfinal之类的


字节码执行引擎

这里以一个线程为例。一般来说,一个方法栈最底层的栈帧都是Thread.run方法。当一个线程准备调用另一个方法时,会先将实参拷贝一份到新栈帧的局部变量表里,然后再执行代码。
1、局部变量表
每次调用新方法时,会默认将当前对象的地址this作为局部变量表的第一个参数;后面存放传过来的参数。这与javascript的做法很相似。

2、方法调用的相关指令

  • invokevirtual:一般实例方法,有多态;
  • invokeinterface:接口方法,有多态
  • invokestatuc:静态方法,无多态
  • invokespecial:特殊方法,无多态
  • invokedynamic:动态调用,JDK7新增,方法无需在编译时确定

3、方法调用的过程
(1)在开始时

  • 方法栈新增一个栈帧;
  • 实例方法的this、参数放到局部变量表中;
  • 开始新栈帧中字节码的执行;

(2)在返回时

  • 将返回值放在调用者方法栈帧中的操作数栈上;

(3)在异常出现时

  • 寻找匹配的异常处理代码

(4)在finally

  • 为每个分支新增一个跳转

4、为什么MockitoEasyMock无法对privatestatic方法进行mock
因为他们mock方法是通过覆盖这些方法来实现的,而privatestatic没法被覆盖。PowerMock是通过修改字节码文件达到mock私有、静态方法的。

原博客地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容