创建对象在堆区如何分配内存

一、堆(Heap):Heap堆区,用于存放对象实例和数组

1、概念

Heap堆是JVM 所管理的内存中最大的一块区域,被所有线程共享的一块内存区域。堆区中存放对象实例,“几乎”所有的对象实例以及数组都在这里分配内存。

2、新生代、老年代

Heap堆是垃圾收集器GC(Garbage Collected)管理的主要区域,因此堆区也被称作GC 堆(Garbage Collected Heap)。从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 JVM中的堆区往往进行分代划分,例如:新生代老年代目的是更好地回收内存,或者更快地分配内存。

 3、创建对象的内存分配(重要)

3.1、执行流程:

创建一个新对象,在堆中分配内存

  1. 新对象大多会在Eden区生成,先判断Eden区是否可以放下,如果可以,就分配对象内存存储
  2. 如果放不下,就执行YGC(又称Minor GC),是一种垃圾回收机制,执行完成后会清理一些不用的对象,内存相对会大一些,然后在确认是否在Eden区可以放下,能放下的话就分配对象内存将对象存在Eden区。
  3. 在执行YGC时,一些对象被回收处理,还有一些“旧对象”依旧存活,被移送到Survivor区(Survivor区分为From区和To区),存放这些旧对象,先判断Survivor区能否放得下,可以的话就放在To区(因为To区是空的,From区的对象也会移向To区),当对象存活阈值超过15,就晋升为老年代。如果Survivor区放不下就直接晋升为老年代。
  4. 执行YGC后如果Eden区依旧放不下,那就是一个很大的对象,就预备将它移向老年代。先判断老年代(old区)是否放得下,可以的话就分配内存对象存储。
  5. 如果old区放不下,就执行FGC(Full GC,又称Major GC)。相当于一个全局的垃圾回收,因为堆区老年代占3/2。执行完成后,又有一批未被引用的对象被回收处理,这时判断是否在老年代放得下,可以的话就分配内存空间。
  6. 还不行的话那堆中就彻底没内存喽,直接OOM(Out Of MEMORY)了。

3.2、执行流程图:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值