一、编译期优化

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星的更多相关文章

  1. 深入理解Java虚拟机--下

    深入理解Java虚拟机--下 参考:https://www.zybuluo.com/jewes/note/57352 第10章 早期(编译期)优化 10.1 概述 Java语言的"编译期&q ...

  2. 深入理解Java虚拟机--中

    深入理解Java虚拟机--中 第6章 类文件结构 6.2 无关性的基石 无关性的基石:有许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码(ByteCode),从而 ...

  3. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载

    <深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...

  4. 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

    目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...

  5. 《深入理解java虚拟机》笔记

    二.java内存区域与内存溢出异常 0.在内存管理领域,java与c/c++不同的是,在java虚拟机自动内存管理机制下,java不需要手动去为对象写配对的free内存的代码,不容易出现内存泄漏和内存 ...

  6. 深入理解Java虚拟机内存模型

    前言 本文中部分内容引用至<深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)>第12章,如果有兴趣可自行深入阅读,文末放有书籍PDF版本连接. 一.物理机中的并发 物理机遇到的并 ...

  7. 《深入理解Java虚拟机》第 3 版里面到底多了哪些知识点?本文竟然得到了本书作者的认可!

    这是why的第 47 篇原创文章 荒腔走板 大家好,我是 why.老规矩,先是简短的荒腔走板聊聊生活. 上面的图是前几天拍的,那天晚上下班后,刚刚走进小区就看到了这一轮弯月和旁边那一颗特别特别亮的星星 ...

  8. 《深入理解java虚拟机》读书笔记-第二章Java内存区域和内存溢出异常

    java1.7和java8的jvm存在差异,本文先按照<深入理解java虚拟机>的讲解内容总结,并将java8的改变作为附录放在文末 一丶运行时数据区域 ​ 图:java虚拟机运行时数据区 ...

  9. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  10. 《深入理解 java虚拟机》学习笔记

    java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.

随机推荐

  1. 14.并发与异步 - 2.任务Task -《果壳中的c#》

    线程是创建并发的底层工具,因此具有一定的局限性. 没有简单的方法可以从联合(Join)线程得到"返回值".因此必须创建一些共享域.当抛出一个异常时,捕捉和处理异常也是麻烦的. 线程 ...

  2. webpack proxyTable 跨域

    dev-server能在开发环境中生成一个本地服务器来实现代理 在vue-cli下 找的 dev下的 proxyTable: { '/':{ //前缀 target: 'http://www.exam ...

  3. idea报错:Invalid bound statement (not found)

    在配置MyBatis接口映射的Mapper.xml时,提示Invalid bound statement (not found)异常,就算是接口和xml名字相同,路径相同也无法找到,在网上找到了几种解 ...

  4. 初窥Java之六

    一.二维数组 1.动态创建 数组中元素类型[] 数组名 = new 数组中元素类型[]; 例如:int[][] arr = new int[二维数组的长度][一维数组的长度]: Int[][] arr ...

  5. python flask_Sqlalchemy管理数据库

    懒癌复发直接粘贴代码,算是做一个简单备份吧. #coding:utf8 from flask import Flask from flask_sqlalchemy import SQLAlchemy ...

  6. 重新学习Java的开始~

    安装jdk的步骤及解释已经在这篇文章中详细阐述了,如下: http://www.cnblogs.com/godtrue/p/4338323.html 1.如何安装库源文件--摘自coreJava 库源 ...

  7. linux(ubuntu) 安装composer(PHP用来管理依赖关系的工具 ) 和安装中国全量镜像

    https://www.phpcomposer.com/  composer中文网 1:进入安装目录   cd /usr/local/bin 2:下载并安装     sudo curl -s http ...

  8. JavaScript(一)

    JavaScript介绍 JavaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互. JavaScript是浏览器解释执行的,前端脚 ...

  9. SVN 提示clean up 进入死循环

    SVN在使用update命令时,提示使用“clean up ”命令,在使用clean up命令时报错“Previous operation has not finished; run 'cleanup ...

  10. python中栈的单链表实现

    参考博客:https://www.cnblogs.com/stacklike/p/8284550.html 基于列表的简单实现 # 先进后出 # 以列表实现的简单栈 class SimpleStack ...