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


    一、堆(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、执行流程图:

     

  • 相关阅读:
    torch.multiprocesssing
    Centos中配置开机自启动的方式汇总
    手机进水声音变小怎么办
    设计模式-桥接模式
    【ARFoundation学习笔记】点云与参考点
    奶牛摄影(春季每日一题 54)
    通俗易懂的==和equals()的使用
    OSI七层模型和TCP/IP协议
    急救医学-习题集-复习资料-题库
    Python学习(6)--获取windows本地网卡和地址信息(1)
  • 原文地址:https://blog.csdn.net/weixin_49187233/article/details/126925091