美文网首页
JVM的逃逸分析

JVM的逃逸分析

作者: 西敏寺钟声 | 来源:发表于2020-08-03 11:37 被阅读0次

对象一定分配在堆中吗?

JVM通过逃逸分析,那些逃不出方法的对象会在栈上分配。

什么是逃逸分析?

EscapeAnalysis,逃逸分析,指的是虚拟机在运行期通过计算分析将原本在堆上分配的对象改成在栈中分配,这样的好处是栈上分配的对象随着线程的结束而自动销毁,不依赖于GC,可以降低垃圾收集器运行的频率。

如何判定为逃逸?

JVM判断新创建的对象是否逃逸的依据有两个:

  1. 对象被赋值给堆中对象的字段和类的静态变量
  2. 对象被传进了不确定的代码中去运行

如果满足了以上情况的任意一种,那这个对象JVM就会判定为逃逸,对以上两种情况举例,样例来源于:https://zhuanlan.zhihu.com/p/59215831

public class EscapeTest {

    public static Object globalVariableObject;

    public Object instanceObject;

    public void globalVariableEscape(){
        globalVariableObject = new Object(); // 静态变量,外部线程可见,发生逃逸
    }

    public void instanceObjectEscape(){
        instanceObject = new Object(); // 赋值给堆中实例字段,外部线程可见,发生逃逸
    }
    
    public Object returnObjectEscape(){
        return new Object();  // 返回实例,外部线程可见,发生逃逸
    }

    public void noEscape(){
        Object noEscape = new Object();  // 仅创建线程可见,对象无逃逸
    }

}

Java的逃逸分析只能发生在即时编译(JIT)期,为什么不能在静态编译(javac)中?

参考R大回答:https://www.zhihu.com/question/27963717

总结来说是可以发生在静态编译期的,但是Java的分离编译和动态加载使得前期的静态编译的逃逸分析比较困难或收益较少,所以目前Java的逃逸分析只发在JIT的即时编译中,因为收集到足够的运行数据JVM可以更好的判断对象是否发生了逃逸。

JVM开启逃逸分析以后的优势?

Java8+默认是开启的,-XX:+DoEscapeAnalysis

  1. 栈上分配,虚拟机参数:-XX:+PrintGC -Xms5M -Xmn5M -XX:+DoEscapeAnalysis

    • 这种优化可以降低垃圾收集器运行的频率,这样每当方法出栈,对象内存随之释放。

      public static void main(String[] args) {
          for(int i = 0; i < 5000000; i++) {
              createObject();
          }
      }
      
      public static void createObject() {
          new Object();
      }
      
  2. 同步消除

    • 如果发现某个对象只能从一个线程可访问,那么在这个对象上的操作可以不需要同步。
  3. 标量替换

    • 如果某个对象的访问方式不要求该对象是一个连续的内存结构,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器中。简单来说就是把对象分解成一个个基本类型,并且内存分配不再是分配在堆上,而是分配在栈上。这样的好处有,一、减少内存使用,因为不用生成对象头。 二、程序内存回收效率高,并且GC频率也会减少。

相关文章

  • Jvm优化技术

    Jvm优化技术有:逃逸分析、方法内联 一:Jvm优化技术之逃逸分析 1:概念 JVM的优化技术,可以有效减少Jav...

  • 小师妹学JVM之:逃逸分析和TLAB

    简介 逃逸分析我们在JDK14中JVM的性能优化一文中已经讲过了,逃逸分析的结果就是JVM会在栈上分配对象,从而提...

  • jvm逃逸分析

    首先先看一个问题,对象是否都被分配到了堆内存中? 众所周知java中对象都默认被分配到堆中,在栈中,只保存了对象的...

  • 再清楚不过了,JVM逃逸分析,你一定得知道

    提到JVM,相信大家一定知道JVM是什么?但是,提到逃逸分析,相信大多数人都可能一脸懵逼,逃逸分析到底是什么呢?接...

  • JVM的逃逸分析

      我们都知道Java中的对象默认都是分配到堆上,在调用栈中,只保存了对象的指针。当对象不再使用后,需要依靠GC来...

  • JVM的逃逸分析

    对象一定分配在堆中吗? JVM通过逃逸分析,那些逃不出方法的对象会在栈上分配。 什么是逃逸分析? EscapeAn...

  • Java JVM 逃逸分析

    前言 最近在学习多线程这块内容的时候,了解到了JVM的逃逸分析,现在就简单地记录下。逃逸分析(Escape Ana...

  • 在金三银四的跳槽季中 你可能缺这一份JVM性能调优总结

    JVM调优配置 -server JVM运行的模式之一, server模式才能进行逃逸分析, JVM运行的模式还有m...

  • 详解 JVM 逃逸分析

    原文发布于自己的博客平台【http://www.jetchen.cn/EscapeAnalysis/[http:/...

  • JVM 之逃逸分析

    逃逸分析 逃逸分析并不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其它优化手段如栈上分配、标量...

网友评论

      本文标题:JVM的逃逸分析

      本文链接:https://www.haomeiwen.com/subject/ljpvrktx.html