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

news2024/11/29 8:34:16
  • 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.coloradmin.cn/o/793007.html

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

相关文章

json-server创建静态服务器2

上次写的 nodejs创建静态服务器 这次再来个v2.0 利用json-server很方便就可以实现。 vscode打开文件夹&#xff0c;文件夹所在终端&#xff1a; json-server.cmd --watch db.json 这里视频教程是没有上述命令标红的&#xff0c;但是会报错&#xff0c;具体不详&#xff0c…

DSSAT模型教程

详情点击链接&#xff1a;R语言与作物模型&#xff08;DSSAT模型&#xff09;教程 前言 随着基于过程的作物生长模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;的发展&#xff0c;R语言在作物生长模型和数据分析、挖掘和可视化中发挥着越来越重要的…

基于 Jmeter 的轻量级云压测平台的原理与实现

目录 前言&#xff1a; 背景 云压测平台要解决什么问题 云压测平台为什么要自己实现 实现语言及内核 开发语言 Jmeter 的优缺点 Jmeter 压测启动的方式 从需求看实现 核心需求 抛弃的需求 1&#xff1a;在线生成测试脚本 抛弃的需求 2&#xff1a;在线监控服务器指…

HANA学习笔记

1、安装 准备安装介质&#xff0c;我这儿用的是HANA2.00.059.00&#xff0c;注意会用到三个lib包和saptune&#xff0c;提前准备好。 执行./hdblcm开启数据库安装&#xff0c;过程中会涉及到需要用户设置一些参数&#xff0c;按照自己需求设置即可。 安装完成会生成一个安装日…

被泼冷水后,谁能超越微服务?

历史总会重演。一切刚过去的&#xff0c;又会被重新提起。开源项目Codename One的联合创始人Shai&#xff0c;曾是Sun Microsystems开源LWUIT项目的共同作者&#xff0c;参与了无数开源项目。作为最早一批Java开发者&#xff0c;最近感慨道&#xff1a;单体&#xff0c;又回来了…

oracle查询符号隔开的字段中是否存在某项

CREATE OR REPLACE FUNCTION FIND_IN_SET_BY_COMMA(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 : ,) -- 用什么分隔符这里改成什么 RETURN NUMBER IS l_idx number:0; -- 用于计算piv_str2中分隔符的位置 str varchar2(500); -- 根据分隔符截取的子字符串…

二、SQL-6.DCL-2).权限控制

*是数据库和表的通配符&#xff0c;出现在数据库位置上表示所有数据库&#xff0c;出现在表名位置上&#xff0c;表示所有表 %是主机名的通配符&#xff0c;表示所有主机。 e.g.所有数据库&#xff08;*&#xff09;的所有表&#xff08;*&#xff09;的所有权限&#xff08;a…

2-vi和vim的使用

vi和vim的区别 vi 是linux系统中内置的文本编辑器vim具有程序编辑能力 vi和vim常用的三种模式 正常模式 使用vim打开一个文件&#xff0c;就默认进入正常模式可以使用方向键【上下左右】来移动光标可以使用【删除字符/删除整行】来处理文件内容也可以使用【复制/粘贴】快捷键…

文心一言 VS 讯飞星火 VS chatgpt (66)-- 算法导论6.5 5题

五、试分析在使用下列循环不变量时&#xff0c;HEAP-INCREASE-KEY 的正确性:在算法的第4~6行 while循环每次迭代开始的时候&#xff0c;子数组 A[1…A.heap-size]要满足最大堆的性质。如果有违背&#xff0c;只有一个可能:A[i]大于 A[PARENT(i)]。这里&#xff0c;你可以假定在…

AWS / VPC 云流量监控

由于安全性、数据现代化、增长、灵活性和成本等原因促使更多企业迁移到云&#xff0c;将数据存储在本地的组织正在使用云来存储其重要数据。亚马逊网络服务&#xff08;AWS&#xff09;仍然是最受追捧和需求的服务之一&#xff0c;而亚马逊虚拟私有云&#xff08;VPC&#xff0…

如何高效地查询IP归属地

高效识别IP归属地是网络安全领域中的一项重要工作。准确地识别IP的归属地不仅可以帮助网络管理员追踪和定位潜在的网络攻击者&#xff0c;还可以用于网络流量分析、地理定位服务等方面。 以下将介绍几种高效识别IP归属地的方法。 使用IP归属地数据库 IP归属地数据库是一种存储…

禾赛激光雷达sdk调试

1.产品型号&#xff1a; "PandarXT-32" 2.Sdk地址&#xff0c;选择相应的版本 https://github.com/HesaiTechnology/ 根据官网教程安装配置即可&#xff1b; 3.激光雷达硬件通过网线连接到主机&#xff0c;然后更改网口的IP地址&#xff1b; 根据产品手册教程 激…

uniapp 中 的progress加载进度条 的使用,在 页面显示数据加载的进度条,使用户的使用体验效果更好

学习目标&#xff1a; 学习目标如下&#xff1a; 例如&#xff1a; uniapp 中 的progress加载进度条 的使用&#xff0c;在 页面显示数据加载的进度条&#xff0c;使用户的使用体验效果更好 学习内容&#xff1a; 学习内容如下所示&#xff1a; 相关属性的说明 进度条的显…

白话机器学习笔记(三)评估已建立的模型

模型评估 在进行回归和分类时&#xff0c;为了进行预测&#xff0c;我们定义了函数 f θ ( x ) f_\theta(x) fθ​(x)&#xff0c;然后根据训练数据求出了函数的参数 θ \theta θ。 如何预测函数 f θ ( x ) f_\theta(x) fθ​(x)的精度&#xff1f;看它能否很好的拟合训练数…

Dockerfile 创建镜像,构建LNMP+wordpress架构

目录 一、Dockerfile 构建镜像 1.Dockerfile 构建 nginx镜像 1.1创建 nginx Dockerfile 目录 1.2编写 Dockerfile 文件 1.3构建nginx镜像 2.Dockerfile 构建 mysql 镜像 2.1创建 mysql Dockerfile 目录 2.2修改mysql配置文件 2.3编写 Dockerfile 文件 2.4构建mysql镜…

Redis源码篇 - Ziplist数据结构

Ziplist是一种内存优化的list存储结构&#xff0c;通过使用连续的内存空间存储&#xff0c;来减少内存碎片化&#xff0c;同时和链表的不同还有&#xff0c;它不存储前后指针&#xff0c;而是通过变长的字节存储前节点元素长度&#xff0c;通过计算长度来实现节点的查找。它是一…

因材施教,有道发布“子曰”教育大模型,落地虚拟人口语教练等六大应用

因材施教的教育宗旨下&#xff0c;大模型浪潮中&#xff0c;网易有道凭借其对教育场景的深入理解和对商业化的理性思考&#xff0c;为行业树立了垂直大模型的典范。 7月26日&#xff0c;教育科技公司网易有道举办了“powered by 子曰”教育大模型应用成果发布会。会上重磅推出了…

好莱坞怕了, Gen-2全面开启免费使用

仿佛一声惊雷炸响&#xff0c;7月24日Runway 宣布&#xff0c;Gen-1 和 Gen-2 已经彻底开放&#xff0c;任何人都可以注册一个账号免费尝试。生成的视频长度为 4 秒&#xff0c;每秒消耗 5 个积分&#xff0c;利用免费额度可以生成二十六个视频。如果免费积分耗尽&#xff0c;付…

【前端学java】JAVA中类的基础概念

theme: cyanosis java中的类语法和前端的类语法几乎是一致的。 基础代码示例 JAVA的面向对象编程和JS的类语法十分接近&#xff0c;我们看一段代码 public class Object_oriented {public static void main(String[] args) {// 打工人 前的PeoPle是类型People dagongren ne…

微信自动回复怎么设置?

宝子们 你们有遇到或正面临以下情况吗&#xff1f; NO.1 “消息爆炸” 小能&#xff0c;是一位在微信公众号分享美食和旅行的博主 由于内容质量高、互动性强&#xff0c;他的粉丝数量迅速增长 然而&#xff0c;随之而来的是大量的留言和私信 小明根本无法应付 他曾经试…