一、堆(Heap):Heap堆区,用于存放对象实例和数组
1、概念
Heap堆是JVM 所管理的内存中最大的一块区域,被所有线程共享的一块内存区域。堆区中存放对象实例,“几乎”所有的对象实例以及数组都在这里分配内存。
2、新生代、老年代
Heap堆是垃圾收集器GC(Garbage Collected)管理的主要区域,因此堆区也被称作GC 堆(Garbage Collected Heap)。从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 JVM中的堆区往往进行分代划分,例如:新生代 和 老年代。目的是更好地回收内存,或者更快地分配内存。
3、创建对象的内存分配(重要)
3.1、执行流程:
创建一个新对象,在堆中分配内存
- 新对象大多会在Eden区生成,先判断Eden区是否可以放下,如果可以,就分配对象内存存储
- 如果放不下,就执行YGC(又称Minor GC),是一种垃圾回收机制,执行完成后会清理一些不用的对象,内存相对会大一些,然后在确认是否在Eden区可以放下,能放下的话就分配对象内存将对象存在Eden区。
- 在执行YGC时,一些对象被回收处理,还有一些“旧对象”依旧存活,被移送到Survivor区(Survivor区分为From区和To区),存放这些旧对象,先判断Survivor区能否放得下,可以的话就放在To区(因为To区是空的,From区的对象也会移向To区),当对象存活阈值超过15,就晋升为老年代。如果Survivor区放不下就直接晋升为老年代。
- 执行YGC后如果Eden区依旧放不下,那就是一个很大的对象,就预备将它移向老年代。先判断老年代(old区)是否放得下,可以的话就分配内存对象存储。
- 如果old区放不下,就执行FGC(Full GC,又称Major GC)。相当于一个全局的垃圾回收,因为堆区老年代占3/2。执行完成后,又有一批未被引用的对象被回收处理,这时判断是否在老年代放得下,可以的话就分配内存空间。
- 还不行的话那堆中就彻底没内存喽,直接OOM(Out Of MEMORY)了。
3.2、执行流程图: