zoukankan      html  css  js  c++  java
  • JVM 优化之逃逸分析

    整理自 周志明《深入JVM》

    1, 是JVM优化技术,它不是直接优化手段,而是为其它优化手段提供依据。

    2,逃逸分析主要就是分析对象的动态作用域。

    3,逃逸有两种:方法逃逸和线程逃逸。
            方法逃逸(对象逃出当前方法):
                    当一个对象在方法里面被定义后,它可能被外部方法所引用,例如作为调用参数传递到其它方法中。

            线程逃逸((对象逃出当前线程):
                    这个对象甚至可能被其它线程访问到,例如赋值给类变量或可以在其它线程中访问的实例变量

    4,如果不存在逃逸,则可以对这个变量进行优化
            1,栈上分配。
                    在一般应用中,不会逃逸的局部对象占比很大,如果使用栈上分配,那大量对象会随着方法结束而自动销毁,垃圾回收系统压力就小很多。
            2,同步消除
                    线程同步本身比较耗时,如果确定一个变量不会逃逸出线程,无法被其它线程访问到,那这个变量的读写就不会存在竞争,对这个变量的同步措施
    可以清除。
            3,标量替换。
                    1, 标量就是不可分割的量,java中基本数据类型,reference类型都是标量。相对的一个数据可以继续分解,它就是聚合量(aggregate)。
                    2, 如果把一个对象拆散,将其成员变量恢复到基本类型来访问就叫做标量替换。
                    3, 如果逃逸分析证明一个对象不会被外部访问,并且这个对象可以被拆散的话,那么程序真正执行的时候将可能不创建这个对象,而改为直接在>栈上创建若干个成员变量。

    5,逃逸分析还不成熟。
            1,不能保证逃逸分析的性能收益必定高于它的消耗。
                    判断一个对象是否逃逸耗时长,如果分析完发现没有几个不逃逸的对象,那时间就白白浪费了。
            2,基于逃逸分析的优化手段不成熟,如上面提到的栈上分配,由于hotspot目前的实现方式导致栈上分配实现起来复杂。

    6,相关JVM参数
            -XX:+DoEscapeAnalysis 开启逃逸分析
            -XX:+PrintEscapeAnalysis 开启逃逸分析后,可通过此参数查看分析结果。
            -XX:+EliminateAllocations 开启标量替换
            -XX:+EliminateLocks 开启同步消除
            -XX:+PrintEliminateAllocations 开启标量替换后,查看标量替换情况。

  • 相关阅读:
    5860. 从双倍数组中还原原数组
    5847. 找到所有的农场组
    5846. 找到数组的中间位置
    442. 数组中重复的数据
    1987. 不同的好子序列数目
    1986. 完成任务的最少工作时间段
    1985. 找出数组中的第 K 大整数
    1984. 学生分数的最小差值
    学习内容整合
    spring-DI和spring-mybatis整合
  • 原文地址:https://www.cnblogs.com/chengdabelief/p/7472156.html
Copyright © 2011-2022 走看看