深入理解java虚拟机-第十章-早期(编译期)优化
第10章 早期(编译期)优化
javac编译过程:
1、解析与填充符号表过程
词法、语法分析 将源代码的字条流转变为标记(Token)集合。如“int a = b + 2”这名代码包含了6个标记,分别是int a = b + 2
填充符号表
2、注解处理器
3、语义分析与字节码生成
标注检查 包括诸如变量使用前是否已被声明、变量与赋值之 间的数据类型是否能够匹配,还有一个重要的动作称为常量折叠
数据及控制流分析 对程序上下文逻辑更进一步的验证,它可以检查出诸如程序局部变量在使用前是否有赋值、方法的每条路径是否都有返回值、是否所有的受查异常都被正确处理了第问题。
解语法糖 泛型、变长参数、自动装箱/拆箱等
java中的泛型只在程序源码中存在,在编译后的字节码中就已经替换为原来的原生类型了,并且在相应的地方插入强制类型转换代码。
字节码生成
Java方法中的泛型
Java的泛型在编译后就擦除了,所以如下代码会编译出错:

因为参数List<Integer>和List<String>编译之后都被搾除了,变成了一样的原生类型 List,导致这两种方法的牲签名变得一模一样。修改代码如下:

便可以编译,方法的重载成功。Class文件方法表(method_info)的数据结构时,方法重载要求方法具备不同的特征签名,返回值并不包含在方法的特征签名之中,所以返回值不参与重载选择,但在Class文件格式中,只要描述符不是完全一致的两个方法就可以共存。也就是说,两个方法如果有相同的名称和特征签名,那它们也是可以合法地共存于一个Class文件中的。执行结果如下:

说明Java还是能够正常执行重载的泛型的方法,Java编译进已经把泛型擦除了,为什么还能进行重载的方法呢?

如图 28 35行为调用Java的编译后代码,
28行为第一次调用JavaTest.test(ss),参数为List<Integer>的时候。
35行为第二次调用JavaTest.test(ssa),参数为List<String>的时候。
说明虽然编译会擦除泛型,但也会为泛型的调用方法进行相应的编译。
深入理解java虚拟机-第十章-早期(编译期)优化的更多相关文章
- 《深入理解Java虚拟机》-----第10章 程序编译与代码优化-早期(编译期)优化
概述 Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运 ...
- 深入理解JAVA虚拟机 晚期(运行期)优化(转载)
这一章节的内容实用性不强 所以不再手打笔记 转载了一篇 原文地址是http://blog.csdn.net/qq_27350929/article/details/54837595 在部分的商用虚拟机 ...
- 《深入理解JAVA虚拟机》-自己动手编译JDK
环境 Ubuntu12.4-http://mirrors.163.com/ubuntu-releases/12.04/ --需要安装纯英文版,避免中文引起不必要的麻烦 OpenJDK7-https:/ ...
- 深入理解Java虚拟机(十)——线程安全与锁优化
什么是线程安全 当多个线程同时访问一个对象的时候,不需要考虑什么额外的操作就能获取正确的值,就是线程安全的. 线程安全的程度 1.不可变 不可变的对象一定是线程安全的,因为值始终只有一个. final ...
- 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》
目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...
- 深入理解Java虚拟机(程序编译与代码优化)
文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...
- 《深入理解java虚拟机》学习笔记之编译优化技术
郑重声明:本片博客是学习<深入理解Java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释 ...
- 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解
郑重声明:本片博客是学习<深入理解java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块 ...
- 深入理解Java虚拟机之自己编译JDK
题外话 最近在阅读<深入理解Java虚拟机>,其中有一小节实战是自己编译JDK,实际操作下来后遇到问题不少,为此特地记录,也希望可以给大家带来一些参考! 前置准备 平台及工具:Window ...
随机推荐
- 【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略
基本上是<Head First Servlets and JSP>内容的整理.扩充.顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例. 完整代码参考 ...
- JavaScript传递的是引用的副本
看例子 var test1 = function (args) { args.name = "lcc2"; args = { name: "lcc3" }; } ...
- 自定义Checkbox和Radiobox
在线演示 本地下载
- Unix下 五种 I/O模型
Unix下共有五种I/O模型: 1. 阻塞式I/O 2. 非阻塞式I/O 3. I/O复用(select和poll) 4. 信号驱动式I/O(SIGIO) 5. 异步I/O(POSIX的aio ...
- HDU 1532 --&&-- POJ1273 dinic 算法
学长的代码#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> ...
- eclipse设置控制台字体大小
步骤如下
- scala学习手记33 - 使用trait进行装饰
在上一节看到了scala的在实例一级的选择性混入就不得不感叹scala在语法上的扩展性.就通过这样一个特性scala简化了很多在java中的编程概念和设计模式. 比如说在java中常用的组合,以及装饰 ...
- scala学习手记3 - var和val
scala中用var和val定义变量都是可以的. 用val定义的变量是不可变的,被初始化后值就固定下来,不可以再被修改(这类似于java中的final关键字):用var定义的变量是可变的,可以任意修改 ...
- Jni_Linux_01_转
1.Linux下JNI的使用(http://www.cnblogs.com/bastard/archive/2012/05/17/2506877.html) Linux下 JNI的使用 学习Andro ...
- SQL优化之列裁剪和投影消除
列裁剪 对于没用到的列,则没有必要读取它们的数据去浪费无谓的IO 比如我们有一张表table1,它含有四列数据(a,b,c,d).当我们执行查询select a from table1 where c ...