JVM-020-运行时数据区-堆(Heap)-逃逸分析-代码优化
介绍
使用逃逸分析,编译器可以对代码做如下优化:
- 栈上分配:将堆分配转化为栈分配。如果一个对象在子程序中被分配,要使指向该对象的指针永远不会发生逃逸,对象可能是栈上分配的候选,而不是堆上分配
- 同步省略:如果一个对象被发现只有一个线程被访问到,那么对于这个对象的操作可以不考虑同步。
- 分离对象或标量替换:有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器中。
JVM-020-运行时数据区-堆(Heap)-逃逸分析-代码优化
使用逃逸分析,编译器可以对代码做如下优化:
JVM-019-运行时数据区-堆(Heap)-逃逸分析(Escape Analysis)
堆是分配对象的唯一选择么?
在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:
此外,基于OpenJDK深度定制的TaoBao VM,其中创新的GCIH(GC invisible heap)技术实现off-heap,将生命周期较长的Java对象从heap中移至heap外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升GC的回收效率的目的。
JVM-018-运行时数据区-堆(Heap)-对象分配的过程
为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收后是否会在内存空间中产生内存碎片。
JVM-017-运行时数据区-堆(Heap)-年轻代和老年代
年轻代(YoungGen)
和老年代(OldGen)
Eden(伊甸园)空间
与Survivor0(幸存者0)空间
、Survivor1(幸存者1)空间
(有时也叫做 from区
、to区
)JVM-016-运行时数据区-堆(Heap)-设置堆内存大小和OOM
Java 堆区用于存储Java对象实例,那么堆的大小在JVM启动时就已经设定好了,可以通过选项”-Xms
“和”-Xmx
“来进行设置。
-Xms
用于表示堆区的起始内存,等价于-XX:InitialHeapSize
-Xmx
则用于表示堆区的最大内存,等价于-XX:MaxHeapSize