深入理解Java虚拟机7-chap10-11-斗者4星
一、编译期优化
1.JIT编译器在运行期的优化过程对程序运行很重要,而编译期优化过程对于程序编码关系更密切
2.Javac编译器编译过程
- 解析与填充符号表过程:词法语法分析、填充符号表
- 插入式注解处理器的注解处理过程:通过注解处理器提供的标准API在编译期对注解进行处理
- 分析与字节码生成过程:标注检查、数据及控制流分析、解语法糖、字节码生成
3.语法糖
- 泛型与类型擦除
Class文件中,只要是描述不完全一致的方法即可共存,但是方法重载要求具备不同的特征签名(不包括返回值)
List<String>与List<Integer>在类型擦除后是同一个类型,擦除只是对方法的Code属性中的字节码擦除,实际上元数据还是保留了泛型信息,如此可以使用反射获取参数化类型
- 自动装箱、拆箱与遍历循环
二、运行期优化
- 解释器与编译器的交互

- 分层编译
1)第0 层
2)第1层
3)第2层
1.触发条件(热点代码)
- 被多次调用的方法:JIT标准编译方式,以整个方法作为编译对象
- 被多次执行的循环体:虽然是循环体,但是仍然编译整个方法,由于创建栈帧执行,故称为栈上替换OSR编译(On Stack Replacement)
2.热点代码探测
- 基于采样点:定期检查栈顶,若常出现,则为热点方法
- 基于技术器:为每个方法或者代码块创建计数器,统计次数是否超过阈值
3.HotSpot虚拟机:
- 方法调用计数器:AIMD

- 回边计数器:

3.编译过程
- Client Compiler:三步

- Server Compiler:会进行更多的优化动作,如无用代码消除、循环展开、公共子表达式清除等
4.编译优化技术
- 公共子表达式消除
- 数组范围检查消除
- 方法内联(重要)
目的:1)避免建立栈帧消耗 2)为其他优化建立基础
Java虚方法:引入CHA(Class Hierarchy Analysis)分析类方法的实现,如果唯一,则可以内联,但是需要逃生门,如果加载了导致继承关系变化,则抛弃已编译代码,进行解释执行或者重新编译
- 逃逸分析:方法中的对象作为参数传递给其他方法称为方法逃逸,如果能证明一个对象不会逃逸到方法或者线程之外,则可对这个变量进行一些高级优化,如下:
1)栈上分配
2)同步消除:可以去掉同步
3)标量替换
深入理解Java虚拟机7-chap10-11-斗者4星的更多相关文章
- 深入理解Java虚拟机--下
深入理解Java虚拟机--下 参考:https://www.zybuluo.com/jewes/note/57352 第10章 早期(编译期)优化 10.1 概述 Java语言的"编译期&q ...
- 深入理解Java虚拟机--中
深入理解Java虚拟机--中 第6章 类文件结构 6.2 无关性的基石 无关性的基石:有许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码(ByteCode),从而 ...
- 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...
- 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)
目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...
- 《深入理解java虚拟机》笔记
二.java内存区域与内存溢出异常 0.在内存管理领域,java与c/c++不同的是,在java虚拟机自动内存管理机制下,java不需要手动去为对象写配对的free内存的代码,不容易出现内存泄漏和内存 ...
- 深入理解Java虚拟机内存模型
前言 本文中部分内容引用至<深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)>第12章,如果有兴趣可自行深入阅读,文末放有书籍PDF版本连接. 一.物理机中的并发 物理机遇到的并 ...
- 《深入理解Java虚拟机》第 3 版里面到底多了哪些知识点?本文竟然得到了本书作者的认可!
这是why的第 47 篇原创文章 荒腔走板 大家好,我是 why.老规矩,先是简短的荒腔走板聊聊生活. 上面的图是前几天拍的,那天晚上下班后,刚刚走进小区就看到了这一轮弯月和旁边那一颗特别特别亮的星星 ...
- 《深入理解java虚拟机》读书笔记-第二章Java内存区域和内存溢出异常
java1.7和java8的jvm存在差异,本文先按照<深入理解java虚拟机>的讲解内容总结,并将java8的改变作为附录放在文末 一丶运行时数据区域 图:java虚拟机运行时数据区 ...
- 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...
- 《深入理解 java虚拟机》学习笔记
java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.
随机推荐
- Log.isLoggable之一正确的使用姿势
DEBUG方法比较当我们在做APP开发时,需要设置调试开关打印Log,下面我列举出3种方法: 方法一:直接赋值public static final boolean DEBUG = true;//fa ...
- %E6%9D%8E%E9%9B%B7是什么编码
在这个网站上可以进行解码http://tool.chinaz.com/Tools/URLEncode.aspx
- String hashcode的兴趣试玩
今天突然看到Hashcode和equals,==比较时,一时兴起,想了解一下hashcode生成规则,为什么hashcode相同,无法说明对象相等,但用equals说明相同,却可以推出对象的hashc ...
- flask微电影系统开发中上下文处理器
在做日志模块开发的过程中,我们遇到了一个问题,就是日期的问题,我们这个时间就要用到上下文处理器来解决问题,他的作用就是可以在我们固定模块中进行传递,我们的模块如下 @admin.context_pro ...
- 第二篇flask响应方式
响应三件套 1.Flask中的HTTPResponse @app.route('/home') # app中的route装饰器 def home(): # 视图 return '登陆成功' #HTTP ...
- Android ble蓝牙问题
(1)蓝牙回调安卓4.4的蓝牙回调是在异步线程中(不在主线程),若要在蓝牙回调中执行更新界面的操作,记得切换到主线程去操作 (2)三星手机兼容性问题connectGatt()方法在某些三星手机上只能在 ...
- 杭电1506 java
求最大子矩阵面积(dp) import java.util.*; public class Main1{ public static void main(String[] args) { Scanne ...
- ProjectEuler && Rosecode && Mathmash做题记录
退役选手打发时间的PE计划 挂在这里主要是dalao们看到有什么想交流的东西可以私聊哦(站内信或邮箱吧) 2017/8/11 PE595 :第一题QAQ 2017/8/12 PE598 2017/ ...
- CSS3_天猫商品墙
天猫商品墙 网格状布局: 1. ul li 布局 2. float: left; 使得元素在一行.注意: 父元素解决高度塌陷 3. ul 设置固定宽,使得元素挤下去 4. 给父元素加一个 pa ...
- [LeetCode] Number of Matching Subsequences 匹配的子序列的个数
Given string S and a dictionary of words words, find the number of words[i] that is a subsequence of ...