一篇就够,详细了解Java对象的整体创建过程

 相信大家对于对象的创建早就使用了无数次了,那么大家是否了解JVM下对象的创建流程是怎么的呢?来吧,现在笔者带大家进一步去了解这个流程。

先来一张大体的流程图,总体上来把握一下:

        从上图,我们可以知道new完对象后,必须先进行类的加载检查,那么什么是类的加载检查呢?从JVM的角度来说,JVM拿到了new对象的指令之后,会去常量池进行查找相关的符号引用,如果没有找到,就会进行类的加载过程(加载、验证、准备、解析、初始化);而相应的,如果找到了该符号引用,就可以直接使用并给其分配所需的内存。

      分配内存,看似挺简单的一些操作(从Java堆里面划分出一块内存),事实上JVM对其是有相应的机制的。JVM对于内存分配有两种方式,分别是“指针碰撞”和“空闲列表”。接下来,稍微解释一下这两种方式的含义:

  • “指针碰撞”:说白了就是把整个堆划分为两块区域,一块是已经被分配了,另一块是是空闲的,而在这两块区域的中间就插着一个指针。当有需要分配内存时,就会按照所需的内存大小像空闲区域移动。

  • “空闲列表”:指的是当Java的堆并不是整齐区分为两块区域,而是已使用的区域块和未使用的区域块杂乱交错,这时候JVM会维护一张空闲列表,会把那些空闲块的地址放在该列表进行管理,当有需要内存时,就会划分出一块连续的区域出去。

      接下来,就是初始化操作了,这一步骤只是给所分配到的内存空间初始化为默认值,比如int类型的常量先初始化为0。至于初始化为设置值的操作,则是在最后一步进行的,执行<init>方法之后,就会赋上对应的值。

      看了上图,估计读者会提一嘴什么是对象头呢?

       顾名思义,对象头就是存储着这个对象的的相关信息,比如它是哪个类的实例,对象的年龄信息等等。注意,在对象头这个区域,JVM默认使用了指针压缩的机制。

      所谓的指针压缩,也就是将相应指针的大小进行一些缩小,将64位的指针压缩为32位的指针,较少内存的消耗,降低GC的压力。当然,指针压缩也是可以关闭的,但是建议不要关闭。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值