JVM--字节码与执行引擎

1. 虚拟机执行引擎包括:

JIT即时编译器,解释器,GC等

执行引擎实则处理的是当前虚拟机栈,栈顶的栈帧,使用当前线程的程序的寄存器,找到对应的字节码指令,然后给执行引擎,通过与堆内存,方法区进行交互,和操作数栈进行工作 。

栈顶缓存技术:当前栈顶的栈帧中元素会被放在CPU寄存器中,以提高运行效率

1.2 栈帧结构

(1) 局部变量表
是栈帧的组成部分,存放着当前方法中的变量,在编译时期就可以确定大小类似于数据的结构但是下标是从1开始,0号存储的是this。
槽位复用对垃圾回收的影响:当一个局部变量表中的引用执行堆内存分配的空间在使用完成之后,如果没有被覆盖,可能不会被回收,因为站上的引用还是指向堆中的对象。注意槽位复用得是在方法中写代码块表示已经出了作用域,代码块的内存可复用一个。
(2)操作数栈
这里的栈是基于数组形式的栈,其深度大小在编译时期就可以确定,执行引擎也被叫做基于栈的执行引擎这里的栈指的就是操作数栈。
(3)动态链接
由于在编译时期的引用有的执向的是符号引用,在运行时候通过常量池将其转换为真正的引用。常量池:就是存放class文件的有关信息,如果没有常量池,将所有的信息都放在字节码中表示,可能太大。
(4)方法返回地址
(5)其他信息

1.3 方法调用

方法调用不等同于方法执行,方法调用的目的就是为了确定方法执行的版本即执行哪个方法
(1)解析
在编译时期就可以确定:在解析阶段将其的符号引用对应常量池转换为直接引用
如 private方法 ,static方法 构造方法等
(2)分派(确定执行哪个方法)
1. 静态分派:对应的就是方法的重载,依据静态类型确定调用哪个方法,静态分派发生在解析阶段 。
2. 动态分派:对应的就是方法的重写,动态分派的实现是,在方法区域都对应一个虚方法表,在运行时候解析出元素所指向的实际对象,然后去查找虚方方法表进行执行。

2. 基于字节码的解释执行引擎

解释执行就是类加载器所加载的class文件是经过javac编译器编译而成,javac输出的指令流是一种:基于栈的指令集架构,但是还有另一种就是基于寄存器的指令集架构。
类加载器将字节码加载进入内存然后执行引擎的解释器执行,执行引擎里面还有JIT即时编译器,其存在的意义就是如果有的重复的代码高频度执行,就有必要执行编译为机器码,以提高执行效率,如何确定那些代码是热点代码(高频度执行),这就需要热点代码探寻主要有两种方式
①采样法:周期性的检查栈的栈顶方法,如果经常出现在栈顶则就是热点代码
②计数器:为每一个方法维护计数器,主要用方法调用计数器,和回边计数器(主要作用是对循环代码块的检测)。
当调用一个方法的时候先判断该方法有没有被JIT编译(编译后的代码会被存放在方法区),如果被编译则执行编译的代码,如果没有则方法计数器加一,当方法计数器达到一定值的时候(阈值客户端是1500次,服务端是10000次)也可以通过虚拟机参数来设定,会被JIT编译。之后之后方法的调用入口会被换成新编译之后的值(栈上替换:方法的调用入口被改变)。调用计数器的值并不是绝对的被调用的次数,因为当方法一段时间不被调用之后会衰减,这个时间段被称为半衰期。也可以通过虚拟机参数将其设置为被调用的绝对次数。

2.1一些编译优化技术

(1)分层编译:将编译分为多个层次,分情况使用


图片.png

(2)栈上替换:将方法调用入口改变
(3)方法内联:避免真实的放法调用,将调用方法的过程去除。
(4)逃逸分析:分析对象的作用域,当一个对象在方法中被调用之后,如果在方法外部被引用,如作为返回值参数返回,这种称为方法逃逸。针对逃逸分析的两种优化。
①栈上分配:如果证明一个对象作用域不会超过该方法的作用域,可将对象直接分配在栈上,Hotspot中暂时没有实现。
②标量替换:标量:一个数据无法被分解为更小的对象,例如java中的原始数据类型,与标量对应的是聚合量,就是多个标量的复合。如果逃逸分析证明对象不会被外部引用,就可以将聚合量进行拆分,只留下在本方法中有用的量,也可以说不创建这个对象让对象的成员变量直接在栈上分配。

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

推荐阅读更多精彩内容