如果程序的后续执行过程中 , 虚拟机一直没有加载到会令这个方法的接受者的继承关系发现变化的类 , 那么内联优化的代码可以一直使用 。否则需要抛弃掉已经编译的代码 , 退回到解释状态执行 , 或者重新进行编译 。
逃逸分析逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法里面被定义后 , 它可能被外部方法所引用 , 这种行为被称为方法逃逸 。被外部线程访问到 , 被称为线程逃逸 。
如果对象不会逃逸到方法或线程外 , 可以做什么优化?
- 栈上分配:一般对象都是分配在Java堆中的 , 对于各个线程都是共享和可见的 , 只要持有这个对象的引用 , 就可以访问堆中存储的对象数据 。但是垃圾回收和整理都会耗时 , 如果一个对象不会逃逸出方法 , 可以让这个对象在栈上分配内存 , 对象所占用的内存空间就可以随着栈帧出栈而销毁 。如果能使用栈上分配 , 那大量的对象会随着方法的结束而自动销毁 , 垃圾回收的压力会小很多 。
- 同步消除:线程同步本身就是很耗时的过程 。如果逃逸分析能确定一个变量不会逃逸出线程 , 那这个变量的读写肯定就不会有竞争 , 同步措施就可以消除掉 。
- 标量替换:不创建这个对象 , 直接创建它的若干个被这个方法使用到的成员变量来替换 。
- 即时编译器运行占用的是用户程序的运行时间 , 具有很大的时间压力 。
- Java语言虽然没有virtual关键字 , 但是使用虚方法的频率远大于C++ , 所以即时编译器进行优化时难度要远远大于C++的静态优化编译器 。
- Java语言是可以动态扩展的语言 , 运行时加载新的类可能改变程序类型的继承关系 , 使得全局的优化难以进行 , 因为编译器无法看见程序的全貌 , 编译器不得不时刻注意并随着类型的变化 , 而在运行时撤销或重新进行一些优化 。
- Java语言对象的内存分配是在堆上 , 只有方法的局部变量才能在栈上分配 。C++的对象有多种内存分配方式 。
Java 内存模型什么是Java内存模型?Java虚拟机的规范 , 用来屏蔽掉各种硬件和操作系统的内存访问差异 , 以实现让Java程序在各个平台下都能达到一致的并发效果 。
经验总结扩展阅读
- 2023年9月15日适合入宅吗 2023年9月15日入宅黄道吉日
- 2023年农历八月初一宜祭祖吗 2023年9月15日祭祖黄道吉日
- JVM学习笔记——垃圾回收篇
- 2023年1月27日取蜂蜜行吗 2023年1月27日适合取蜂蜜吗
- 2023年农历正月初六安装房门吉日 2023年1月27日是安装房门的黄道吉日吗
- 2023年1月27日举办成人仪式行吗 2023年1月27日举办成人仪式吉日一览表
- 银手镯变黑是生病了吗?
- 九州缥缈录铁皇结局是什么?
- 向前是什么电视剧的男主角?
- 长脸型适合什么样的眼镜?