java编译优化

在java中,当编译器将源代码转化为字节码时,会对源代码进行相应的优化操作,具体可以总结为以下几点

tips:泛型与类擦除

java中的泛型是只存在于源代码中的,在已经编译后的字节码文件里,已经替换为了原来的原生类型,并在相应的地方擦除了强制转换代码,在运行中ArrayList与ArrayList是同一个类,尽管在源代码中是不同的泛型

1对常量的操作

(1)如果一个表达式E已经被计算过,而且从先前到现在E中的值没有变化,E会成为公共表达式并且不会再次计算,直接调用之前的结果。
(2)String +常量表达

String a = "a"+"b";
String b = "a"+1;

会被自动优化成

String a ="ab";
Strng b ="a1";

(3)常量替换

final int N =1;
int n=N;

会变成

int N =1;
int n =1;

(4)某些常量计算也会直接算出

int n = 1+1;

会变成

int n =2;

(5)确定的结果也会折叠

boolean f = true||(a&&b||c);

会变成

boolean f =true;

2.数组边界检查消除
如果在一段关于数组的操作中,明显可以确定操作不会越界的话,编译器会把多余的数组越界的检查操作给除掉。

3 逃逸分析
如果一个方法被定下以后,它可能被外部方法给引用,则被称为方法逃逸,被外部线程访问访问到则被称为线程逃逸
,如果可以确定一个方法不会发生方法逃逸或者线程逃逸,编译器会试着通过栈上分配、同步消除、标量替换等手段优化,尽量使得其中使用的局部对象在栈上方法结束后就被销毁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 虽然在不同目标平台上的JVM实现不一样,但是有3种Java Compiler是极具代表性的: 前端编译器: 如我们...
    wusp阅读 1,069评论 0 0
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,576评论 1 14
  • 一、运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区、虚拟机栈、本地方法栈、堆、程序计数器,...
    luhanlin阅读 611评论 0 0
  • 九种基本数据类型的大小,以及他们的封装类。(1)九种基本数据类型和封装类 (2)自动装箱和自动拆箱 什么是自动装箱...
    关玮琳linSir阅读 2,076评论 0 47
  • 第二部分 自动内存管理机制 第二章 java内存异常与内存溢出异常 运行数据区域 程序计数器:当前线程所执行的字节...
    小明oh阅读 1,295评论 0 2

友情链接更多精彩内容