【面试】jvm中堆是分配对象存储的唯一选择吗

目录

        • 一、说明
        • 二、逃逸分析
          • 2.1 说明
          • 2.2 参数设置

一、说明
  • 1.在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。
  • 2.在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。i这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。
  • 3.此外,基于openJDK深度定制的TaoBaoVM,其中创新的GCIH (GCinvisible heap)技术实现off-heap,将生命周期较长的Java对象从heap中移至heap外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升GC的回收效率的目的。
二、逃逸分析
2.1 说明
  • 1.如何将堆上的对象分配到栈,需要使用逃逸分析手段。
  • 2.这是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。
  • 3.通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。
  • 4.逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸。当一个对象在方法中被定义后,它被外部方法所引用,则认为发生逃逸。例如作为调用参数传递到其他地方中。
2.2 参数设置
  • 1.在JDK 6u23版本之后,HotSpot中默认就已经开启了逃逸分析。
  • 2.如果使用的是较早的版本,开发人员则可以:
    通过选项“-XX: +DoEscapeAnalysis”显式开启逃逸分析
    通过选项“-XX: +PrintEscapeAnalysis”查看逃逸分析的筛选结果。

你可能感兴趣的:(jvm,jvm,面试)