java 性能优化实践——jvm编译技术常识

	/**
     * java 性能优化实践
     *      AOT编译和JIT编译
     *          #AOT编译
     *              外部程序(编译器)通过读取人类可读的源代码,并直接输出可执行的机器代码
     *                  只能在一次编译期间进行可能的优化,如果需要调整优化只能再次编译
     *          #JIT编译
     *              通用技术,将源程序转换为中间程序格式,然后再运行时转为高度优化的机器代码
     *              剖析制导优化
     *      理解即时编译
     *          @沙箱对改变进行快速反馈
     *
     *          @内联
     *              选定某个被调用方法将其内容复制到被调用处,即调用点中
     *              #举例
     *              int result = add(a,b);
     *              public int add(int a,int b)
     *              {
     *                  return a + b;
     *              }
     *              内联替换为
     *              int result = a + b;
     *              ___________________
     *              扩展用
     *                  逃逸分析,死代码消除,循环展开,锁消除
     *              #内联的限制
     *                  要内联方法的字节码大小
     *                  要内联方法的当前调用链深度
     *                  该方法的编译版本在代码缓存中已占用的空间量
     *              也可以通过调整jvm大小来满足内联的条件
     *          @循环展开
     *              一旦循环中的任何方法调用被内联,编译器就能更好的了解每次循环迭代的大小和成本
     *              基于这些信息我们便考虑展开循环,减少执行时必须跳回到循环点的次数
     *                  向后跳转会对处理器造成影响,CPU会因为这个指令丢弃流水线中接下来的指令
     *              jvm针对循环展开的具体优化
     *                  可以优化使用int,short,char类型计数器的计数循环
     *                  可以展开循环体,并移除安全点循环
     *                  展开循环可以减少向后分支的数量,也可以减少相关分支的预测成本
     *                  移除安全点轮训可以进一步减少每次循环迭代要完成的工作
     *
     *           @逃逸分析
     *              Hotspot可以执行基于作用域的分析,已确定某个方法内完成的工作在该方法的边界之外是否可见以及是否有副作用
     *              这种分析可以用来确定在方法内分配的对象在该方法的作用域之外是否可见
     *                  三种逃逸情况
     *                      对象不会逃逸出方法或线程,也没有被传递给调用,标量替换
     *                      对象不会逃逸出方法或线程,但是作为参数被传递给了调用或被引用了,调用期间不会逃逸
     *                      对象会逃逸出方法或线程
     *
     *              @消除堆分配
     *                  在紧密的循环中创建新的对象会给内存分配子系统带啦压力
     *                  生成大量寿命短的对象需要频繁的执行Minor GC来清理他们
     *                  如果分配率过高以至于堆的新生代被填满,那么寿命短的对象就会晋升为老年代——错误晋升
     *                  @标量替换
     *                      对象中的字段会变成标量值,类似于他们都是局部变量而非对象字段
     *                      然后他们被一个叫作寄存器分配器的Hotspot组件安排到CPU寄存器中
     *                      如果没有足够的寄存器空间,那么标量值就可以放到当前的栈帧上——栈溢出
     *
     *                  逃逸分析的目标是推断出是否可以避免堆分配,如果可以就自动将对象分配到栈上,减少垃圾收集压力
     *
     *                  @锁与逃逸分析
     *                      synchronized锁
     *                      移除不会逃逸对象上的锁——锁消除
     *                      合并使用同一把锁的连续锁定区域——锁合并
     *                      检测重复获取同一把锁但是没有解锁的地方——锁嵌套
     *
     *                  @逃逸分析限制
     *                      数组长度限制 64
     *                      部分逃逸分析不支持
     *              @单态分派
     *                  当我们在对象上调用一个方法时,如果第一次调用时检查了该对象的运行时类型,那么它可能在以后的每次调用中都是相同的类型
     *                      如果这个假设成立,那么可以优化该点的方法调用,特别是可以去掉虚表(vtable)中查找方法这中间操作
     *                      双态调用 和 复态调用
     *              @内部函数
     *                  指的是一个方法的高度优化的原生实现,它们是jvm预先知道的,而非有jit子系统动态生成
     *                  实例
     *                      arraycopy 使用CPU上的向量支持实现更快捷的复制
     *                      currentTimeMillis 操作系统快捷实现
     *                      Math.*  CPU指令上的直接支持
     *                      加密 AES 硬件加速提升显著功能
     *
     *             @栈上替换
     *                  将栈上循环后退的执行次数进行计数后到达某个阈值之后对该循环进行编译,然后切换到编译后的版本继续执行
     *                  执行完毕后必须所有状态必须继续的位置可见
     *
     *            @再谈安全点
     *                  除了GC STW事件之外 需要线程处于安全点
     *                      取消对一个方法的优化
     *                      创建堆转储
     *                      撤销偏向锁
     *                      重新定义一个类——注入
     *                  在编译后的代码中,JIT编译器负责生成安全点检查代码
     *                      有时一个线程需要一定时间才能走到安全点——长时间遇安全点
     *                      只要程序语义保持不变,JIT编译器就可以自由生成预测性和乱序的指令
     *                          当虚拟机到达安全点,编译代码的状态与程序在该点的状态相匹配,调试器依赖于此行为
     *                  安全点多了,轮训检查成本就高了,
     *                  安全点少了,线程就要等待长时间到达,还要等待其他线程的到来
     *
     *                  #可以检查程序在安全所花费的时间
     */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P("Struggler") ?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值