其他分享
首页 > 其他分享> > 堆是分配对象存储的唯一选择吗?

堆是分配对象存储的唯一选择吗?

作者:互联网

堆是分配对象存储的唯一选择吗?

在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:
随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。

在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis) 后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。

此外,前面提到的基于OpenJDK深度定制的TaoBaoVM,其中创新的GCIH (GC
invisible heap) 技术实现off -heap,将生命周期较长的Java对象从heap中移至heap外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升GC的回收效率的目的。

逃逸分析概述

重点关注 new 的对象实体是否在方法外部被引用,而不是关注对象的引用变量是否传递到外部方法中使用

在JDK7以后,HotSpot虚拟机默认开启逃逸分析

逃逸分析:代码优化

基于逃逸分析,编译器可以对代码做如下优化:
一、栈上分配。将堆分配转化为栈分配。如果一个对象在子程序中被分配,要使指向该对象的指针永远不会逃逸,对象可能是栈分配的候选,而不是堆分配。

二、同步省略。如果一个对象被发现只能从一个线程被访问到,那么对于这个对象的操作可以不考虑同步。

三、分离对象或标量替换。有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器(虚拟机栈)中。

注:HotSpot虚拟机暂时并不支持栈上分配,但是对于未发生逃逸的对象做了标量替换策略

逃逸分析小结:

标签:分析,存储,Java,对象,唯一,逃逸,标量,分配
来源: https://blog.csdn.net/qq_47102228/article/details/121562349