深入理解JVM - 编译期/运行期优化

本文深入探讨了Java的JVM优化,包括编译期的语法糖如泛型和自动装箱的类型擦出,以及运行期的JIT编译器和优化技术,如解释器与编译器的并存、方法内联和逃逸分析等。
摘要由CSDN通过智能技术生成

----------------------------编译期优化--------------------------------------

1、概述(编译期)

Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(Javac编译器)把Java文件转变为class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器)把字节码转变为机器码的过程;还可能是指使用静态提前编译器(AOT编译器,Ahead of Time Compiler)直接把Java文件编译成本地机器码的过程。下面列举这三类编译过程中一些比较有代表性的编译器。

a)前端编译器:Sun的Javac、Eclipse JDT中的增量式编译器(ECJ);【编译期、Javac编译器用Java语言实现】

b)JIT编译器:HotSpot VM的C1、C2编译器;【运行期】

c)AOT编译器:GNU Compiler for the Java 、Excelsior JET;

优化:Javac这类编译器对代码的运行效率几乎没有任何优化措施。虚拟机设计团队把对性能的优化集中到了后端的即时编译器中,这样可以让那些不是由Javac产生的Class文件(例如Groovy、JRuby等语言的Class文件)也同样享受到编译器优化带来的好处。但是Javac做了许多针对Java语言编码过程的优化措施来改善程序猿的编码风格和提高编码效率,相当多新生的Java语法特性都是靠编译器的“语法糖”来实现的,而不是依赖虚拟机的底层改进来支持。

可以说,Java中即时编译器在运行期的优化过程对于程序运行来说更重要,而前端编译器在编译期的优化过程对于程序编码来说关系更密切。

2、语法糖的味道

语法糖:也成为糖衣语法,是指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序猿的使用。通常来说,使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

Java中最常用的语法糖主要是泛型(泛型并不一定都是语法糖实现,如c#的泛型就是直接由CLR支持的)、变长参数、自动装箱/拆箱等,虚拟机运行时不支持这些语法,它们在编译阶段还原回简单的基础语法结构,这个过程称为解语法糖。

2.1、泛型与类型擦出

泛型技术在c#和Java之中的使用方式看似相同,但实现上却有着根本性的分歧,C#里面的泛型无论在程序源码中、编译后的IL中,或是运行期的CLR中,都是切实存在的&#x

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值