zoukankan      html  css  js  c++  java
  • JVM之逃逸分析-栈上分配-标量替换

       阅读《深入理解Java虚拟机》的过程中,会碰到一些不明就里的名词。虽然大概知道意思,但是如果一眼飘过去,估计过不了多久就会遗忘。这里单独提出来,去查阅资料,先形成自己的理解,再继续往下对比着看。

      原文:但即使只考虑现在,由于即时编译技术的进步,尤其是逃逸分析技术的日渐强大,栈上分配、标量替换优化手段已经导致一些微妙的变化悄然发生,所以说Java对象实例都分配在堆上也渐渐变得不是那么绝对了。

    ————————————————————————————————

      这里解释一下什么叫做逃逸分析、栈上分配以及标量替换。

      简单说,即时编译器会对方法中的对象作用域进行分析,如果这个对象只是在该方法中使用,可以认为这个对象是没有逃逸出该方法的,当遇到这种情况时,JVM会针对这个对象做一些栈自动分配的事情。那么也就不需要占用堆内存也不需要被垃圾回收器管理,当栈帧压出(方法执行完返回了)该对象的内存会自动释放。

      标量可以理解成一种不可分解的变量,如java内部的基本数据类型、引用类型等。 与之对应的聚合量是可以被拆解的,如对象。当通过逃逸分析一个对象只会作用于方法内部,虚拟机可以通过使用标量替换来进行优化。此时只需要在栈中使用标量来简化整个逻辑,甚至不需要创建这个对象的实例。

      这些优化的手段,不仅可以减少运行时的堆内存消耗,也能够有效减少GC的次数,对于整体性能的提升是很显著的。

      事实上,这个过程会很复杂,这里只是简单将概念讲清楚,避免阅读原文的过程被卡住。

  • 相关阅读:
    安卓 广播机制
    安卓 活动的启动模式
    安卓 生命周期
    安卓六大布局
    day4-list,列表
    Leetcode 947 移除最多的同行或同列石头
    Leetcode 628三个数的最大乘积
    Leetcode 1584连接所有点的最小费用
    Leetcode 721 账户合并
    Leetcode 103 二叉树的锯齿层序遍历
  • 原文地址:https://www.cnblogs.com/bruceChan0018/p/15041755.html
Copyright © 2011-2022 走看看