java虚拟机_04程序编译与代码优化

Java语言的”编译器”其实是一段”不确定”的操作过程, 因为它可能是指一个前端编译器(其实叫”编译器前端”更准确些)把.java文件转变为.class文件的过程, 也可能是指虚拟机的后端运行期编译器(JIT编译器)把class文件转变为机器码的过程.

1、编译过程大概可以分为3个过程:

1、解析与填充符号表的过程;
2、插入式注解处理器的注解处理过程;
3、分析与字节码生成的过程;

2、常量折叠:
举个栗子:

int a = 1 + 2;

上面代码在经过编译器的常量折叠操作以后, 他们将会被折叠为字面量”3”, 由于编译期间进行了常量折叠, 所以在代码里面定义的 “int a = 1 + 2”比起直接定义”int a = 3”,并不会增加程序运行期哪怕仅仅一个CPU指令的运算量;

3、语法糖:

1、在计算机中添加的某种语法, 这种语法对语言的功能并没有影响, 但是更方便程序员使用. 通常来说使用语法糖能够增加程序的可读性, 从而减少程序代码出错的机会.
2、Java中最常用的语法糖主要是泛型, 变长参数, 自动装箱/拆箱等. 虚拟机运行时不支持这些语法, 他们在编译阶段还原回简单的基础语法结构, 这个结构称为解语法糖.

4、泛型擦除:
Java中的泛型只在程序源码中存在, 在编译后的字节码文件中, 就已经替换为原来的原生类型了, 并且在相应的地方插入了强制转型代码.

原始代码:
public static void main(String[] args){
    Map<String,String> map = new HashMap<String, String>();
    map.put("a","A");
    map.put("b","B");
    System.out.println(map.get("a"));
    System.out.println(map.get("b"));
}

上述代码编译成class文件, 再反编译打开以后得到下面代码:

public static void main(String[] args){
    Map map = new HashMap();
    map.put("a","A");
    map.put("b","B");
    System.out.println((String)map.get("a"));
    System.out.println((String
    )map.get("b"));
}

5、热点探测:

1、基于采样的热点探测;
采用这种方法的虚拟机会周期性的检查各个线程的栈顶, 如果发现某个(或某些)方法经常出现在栈顶, 那这个方法就是”热点方法”.

2、基于计数器的热点探测;

6、即时编译优化手段:

1、公共子表达式消除;
2、数组范围检查消除;
3、方法内联;
4、讨厌分析;

  1. 公共子表达式:
原始代码
int d = (c * b) * 12 + a + (a + b * c); 
进入到虚拟机即时编译器后:
int d = E * 13 + a * 2;

7.逃逸分析:

逃逸分析的基本行为就是分析对象动态作用域: 当一个对象在方法中被定义后, 他可能被外部方法所引用, 例如作为调用参数传递到其他方法中, 称为方法逃逸. 甚至还有可能被外部线程访问到, 譬如赋值给类变量或可以在其他线程中访问的实例变量. 称为线程逃逸;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值