Java虚拟机——前端编译优化

  • Java的编译期是有上下文语境影响的,不同语境下可以指不同的过程:
  1. 可以是前端编译器,把*.java文件转变成*.class文件的过程。
  • JDK的Javac、Eclipse JDT中的增量式编译器
  1. 可以指Java虚拟机的即时编译器(JIT编译器)在运行期将字节码转变成本地机器码的过程
  • HostSpot虚拟机的C1、C2编译器、Graal编译器
  1. 还可以指使用静态的提前编译器(AOT编译器)直接把程序编译成与目标机器指令集相关的二进制代码过程
  • JDK的Jaotc、GNU Compiler for the Java 、 Excelsior JET

  • 本章的编译期和编译器都指第一类,前端编译器。

1 Javac编译器

  • Javac编译器不像HotSpot虚拟机那样使用C++语言(包含少量C语言)来实现,它本身就是一个由Java语言编写的程序。
  • 从Javac代码的总体结构来看,编译过程大致可以分为1个准备过程和3个处理过程。
  1. 准备过程:初始化插入式注解处理器
  2. 解析与填充符号表过程
  • 词法、语法分析,将源代码的字符流转变为标记集合,构造出抽象语法树。
  • 填充符号表,产生符号地址和符号信息。
  1. 插入式注解处理器 的注解处理过程
  • 在JDK 6中可以提前到编译期对代码中的特定注解进行处理,影响前段编译器的工作过程
  1. 分析与字节码生成过程
  • 标注检查,对语法的静态信息进行检查
  • 数据流及控制流分析,对程序动态运行过程进行检查
  • 解语法糖,将语法糖还原为原有形式
  • 字节码生成

2 Java语法糖

2.1 泛型

  • 泛型的本质是参数化类型或者参数化多态的应用,即可以将操作的数据类型指定为方法签名中的一种特殊参数。

  • 这种参数类型能够在类、接口和方法的创建中,分别构成了泛型类、泛型接口和泛型方法。

  • Java选择的泛型实现方式叫做"类型擦除式泛型",C#选择的是"具现化式泛型"

  • Java的泛型在编译后的字节码文件中,全部泛型都被替换为原来的裸类型(Raw Type),并且在相应的地方插入了强制转型代码。
    在这里插入图片描述

public class TypeErasureGenerics<E>{public void doSomething(Object item){if(item instanceof E){ //不合法,无法对泛型进行实例判断...}E newItem = new E(); //不合法,无法使用泛型创建对象E[] itemArray = new E[10]; //不合法,无法使用泛型创建数组}
}

2.2 类型擦除

  • 要让以前写在ArrayList的代码在泛型新版本里必须还能继续用这同一个容器,就必须让ArrayList、ArrayList这些全部自动成为ArrayList的子类型
  • 所以类型泛型化实例 的 共同父类型 就被称为裸类型。
import java.util.ArrayList;public class GenericsDemo {public static void main(String[] args) {ArrayList<Integer> iList = new ArrayList<Integer>();ArrayList<String> sList = new ArrayList<String>();ArrayList list; //裸类型list = iList;list = sList;}
}
  • Java是如何实现裸类型的呢?虚拟机并没有真实构造出ArrayList这样的类型。 而是直接粗暴地将ArrayList在编译时还原回ArrayList,在我们需要对元素访问、修改时 自动插入一些强制类型转换和检查指令。

2.3 类型擦除的坏处

  1. 运行期间无法取到泛型类型信息
  2. 不支持原生类型的泛型,因为Java不支持int、long与Object之间的强制转换。但是用了包装类Integer、Long之后就会多了包装类装箱和拆箱的开销。
  3. 重载方法上带来的麻烦
  • 这两个参数之后都被擦除了,变成了同一种裸类型的List,所以这两个方法的特征签名变得一样,无法重载。
public static void method(List<String> list){System.out.println("invoke method String");
}
public static void method(List<Integer> list){System.out.println("invoke method Integer");
}

2.4 自动装箱、拆箱、遍历循环

  • 通过反编译Class文件可以得到它们的本质实现
public static void aiBox(){//new Integer[]{Integer.valueOf(1) , ....} 自动装箱List<Integer> list = Arrays.asList(1,2,3,4);int sum = 0 ;for(int i : list){ //遍历循环sum += i; //自动拆箱}System.out.println(sum);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法基础:搜索与图论】3.6 二分图(染色法判定二分图匈牙利算法)

文章目录 二分图介绍染色法判定二分图例题&#xff1a;860. 染色法判定二分图 匈牙利匹配二分图最大匹配匈牙利匹配算法思想例题&#xff1a;861. 二分图的最大匹配 二分图介绍 https://oi-wiki.org/graph/bi-graph/ 二分图是图论中的一个概念&#xff0c;它的所有节点可以被…

FPGA驱动SPI屏幕(附完整工程)

一. 简介 相信大家都玩过屏幕&#xff0c;在FPGA上使用最多的就是VGA/HDMI接口的显示器了&#xff0c;这两种显示器的优点就不用说了&#xff0c;缺点就是体积比较大&#xff0c;而且价格比较贵&#xff0c;对于追求便携/价格低的我来说&#xff0c;SPI接口的屏幕才是我的首要…

更新合集 | 七月功能上新记

点击链接了解详情 七月来临&#xff0c;正式开启 2023 下半年的新征途&#xff01;这个盛夏&#xff0c;腾讯云 CODING 上线了微信扫码注册、微信通知、Go 制品管理等重点能力&#xff0c;为企业及团队研发管理带来更多便利&#xff01;以下是 CODING 新功能速递&#xff0c;快…

登录页的具体实现 (小兔鲜儿)【Vue3】

登录页 整体认识和路由配置 整体认识 登录页面的主要功能就是表单校验和登录登出业务 准备模板 <script setup></script><template><div><header class"login-header"><div class"container m-top-20"><h1 cl…

详解go的hex.Encode原理

简言 今天看nsq的messageID生成的时候&#xff0c;发现它使用了hex.Encode函数来产生编码&#xff0c;那就顺道研究一下这个编码方式。 原理 hex是16进制的意思&#xff0c;encode是进行编码的意思&#xff0c;内部实现也很简单&#xff0c;就是 每4位计算出十六进制的值&a…

基于Python机器学习、深度学习在气象、海洋、水文等技能提升教程

详情点击链接&#xff1a;基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用 前言 Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。…

数据可视化(1)

使用python带的matplotlib库进行简单的绘图。使用之前先进行安装&#xff0c;pip install matplotlib。如果安装了Anaconda,则无需安装matplotlib。 1.简单折线图 #绘制简单图表 import matplotlib.pyplot as plt plt.plot([1,2,3,4,5]) plt.show() import matplotlib.pyp…

2023年的深度学习入门指南(19) - LLaMA 2源码解析

2023年的深度学习入门指南(19) - LLaMA 2源码解析 上一节我们学习了LLaMA 2的补全和聊天两种API的使用方法。本节我们来看看LLaMA 2的源码。 补全函数text_completion源码解析 上一节我们讲了LLaMA 2的编程方法。我们来复习一下&#xff1a; generator Llama.build(ckpt_di…

logback-spring.xml日志配置文件详解

目录 前言logback-spring.xml 配置 前言 打印日志是一个系统的基本功能&#xff0c;系统出现异常可以通过查找日志弄清楚是什么原因&#xff0c;从而更加快速地定位问题&#xff0c;修复系统。 logback-spring.xml 配置 文件位置 具体配置 <?xml version"1.0"…

MGRE实验

实验步骤 第⼀步&#xff1a;IP地址规划 PC地址 设备地址 第⼆步&#xff1a;配置IP地址 R1配置 [R1]interface g0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 [R1]interface s4/0/0 [R1-Serial4/0/0]ip address 15.1.1.1 24 R2配置 [R2]interface g0/0/…

TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以?

TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以? 1. 什么是TCP协议? TCP&#xff1a;Transmission Control Protocol翻译过来就是传输控制协议,TCP协议是一个面向连接的、可靠的、基于字节流的传输层协议RFC 793对TCP连接的定义 > Connections: >…

Windows 在VMware16.x安装Win11系统详细教程

文章目录 一、准备二、创建虚拟机1. 创建新的虚拟机2. 选择虚拟机硬件兼容性3. 安装客户机操作系统4. 选择客户机操作系统5. 命名虚拟机6. 固件类型7. 处理器配置8. 此虚拟机内存9. 网络类型10. 选择I/O控制器类型11. 选择磁盘类型12. 选择磁盘13. 指定磁盘容量14. 指定磁盘文件…

Centos7.6安装RocketMQ4.9.2并配置开机自启

1、下载RocketMQ 编译后的压缩包 wget https://dlcdn.apache.org/rocketmq/4.9.2/rocketmq-all-4.9.2-bin-release.zip2、解压 unzip rocketmq-all-4.9.2-bin-release.zip3、进入解压文件夹 cd rocketmq-all-4.9.2/4、编辑配置文件/usr/local/rocketmq/rocketmq-all-4.9.4-…

Docker-Compose 轻松搭建 Grafana+InfluxDb 实用 Jmeter 监控面板

目录 前言&#xff1a; 1、背景 2、GranfanaInfluxDB 配置 2.1 服务搭建 2.2 配置 Grafana 数据源 2.3 配置 Grafana 面板 3、Jmeter 配置 3.1 配置 InfluxDB 监听器 3.2 实际效果 前言&#xff1a; Grafana 和 InfluxDB 是两个非常流行的监控工具&#xff0c;它们可…

Java网络编程(一)基本网络概念

一、网络 网络(network) 是几乎可以实时相互发送和接收数据的计算机和其他设备的集合。网络通常用线缆连接&#xff0c;数据位转换为电磁波&#xff0c;通过线缆移动。不过&#xff0c;无线网络会通过无线电波传输数据&#xff0c;许多长距离的传输现在会用通过玻璃纤维发送可见…

生信专题十余种案例

集成多组学数据的机器学习在生物医学中的应用 原文链接 案例部分图示&#xff1a; 案例图示一&#xff1a;基于自编码器的单细胞转录组-蛋白组学整合分析 案例图示二&#xff1a;基于蛋白组学-代谢组学的肿瘤生物标志物发现 案例图示三&#xff1a;基于GWAS-表型组学的肺癌风…

记一次与挖矿木马的较量

一、 概述 本文主要是记录了一次针对 挖矿程序 的应急响应处理&#xff0c;从三个部分来解读此次事件&#xff1a; 1、事件描述部分&#xff0c;确认是否有挖矿程序。 2、现场分析部分&#xff0c;讲了是如何一步一步杀掉挖矿程序。 3、程序分析部分&#xff0c;针对挖矿脚本的…

客户案例 | 思腾合力服务器助力西安电子科技大学人工智能实验室建设

客户介绍 西安电子科技大学是以信息与电子学科为主&#xff0c;工、理、管、文多学科协调发展的全国重点大学&#xff0c;直属教育部&#xff0c;是国家“优势学科创新平台”项目和“211工程”项目重点建设高校之一、国家双创示范基地之一、首批35所示范性软件学院、首批9所示范…

基于Java+SpringBoot+vue前后端分离网上购物商城系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…