• 浅谈Java虚拟机内存中的对象创建,内存布局,访问定位


    参考于

      深入理解Java虚拟机

      这里介绍HotSpot虚拟机(自带的虚拟机)

    1.对象的创建

      对于程序员来说,创建对象的方法:

    User user1 = new User();
    User user2 = new User(04, "Tom", 20);

      对于虚拟机来说:

      1.首先遇到new指令,先去方法区(一块内存,有些人也叫永久代,不过书上说了这种叫法其实不是很准确)检查类有没有加载过了,如果没有,虚拟机去加载,如果加载了,在堆中进行创建。

      2.创建对象有两种方法:由虚拟机自己决定,虚拟机自己判断用哪种方法

        2.1.如果java堆中都是很规整的:Bump the Pointer 指针碰撞

        

        红色:原来已经分配了的。 黄色:新创建的。 白色:空的内存。 中间竖线:指针。

        根据第1步获得的对象大小,中间指针像空的内存挪动和对象大小相等的一段距离。

        2.2.如果堆不规整:Free List 空闲列表

        

        红色:原来已经分配了的。 白色:空的内存。 蓝色:一张列表

        列表中记录哪块是空的,哪块是空的,然后分配一块合适的用来创建对象,随后更新列表。

        2.3.堆是线程共享,虚拟机解决创建对象时线程不安全的方法

          第一种,CAS保证原子性操作 

          第二种,TLAB本地线程分配缓冲,每个线程都先独占一小块内存,不够了再加,不过再加这个动作需要同步

      3.内存分配完成后,内存空间初始化为0(不包括对象头),这也是为什么我们的字段都有一个默认值的原因

      4.如果执行的是带参数的构造方法,为参数初始化。

    2.对象的内存布局

      对象内存布局可分为3块区域:对象头,实例数据,对齐填充

      对象头分成两部分:第一部分存放运行时的数据,官方称为“Mark Word”,这部分的大小和虚拟机的位数有关,虚拟机32位,这部分是32bit,64位同理。

               第二部分是类型指针,指针确定这个对象是哪个类的实例。

                如果是数组,对象头还包含一块用于记录数组长度的空间

      实例数据:对象真正存储的有效信息

      对齐填充:类似于占位符,为了让对象为8字节的整数倍

    3.对象的访问定位

      两种方式:第一种句柄访问第二种直接指针访问。HotSpot采用第二种,第二种优点是访问速度更快。

      第一种:

      

      第二种:

  • 相关阅读:
    [轉]推荐一个C#代码混淆器 .NET Reactor
    [转贴]什么是ORM
    十个极其有用的在线网站设计工具
    .NET Windows客户端程序在代理环境下的相关设置
    记4月28成都软件技术沙龙活动
    2010年仲夏成都.NET俱乐部活动——深度.NET
    在MOSS 2010上配置PDF的搜索【简译】
    在Windows 7中遇到android 模拟器出错,emulator: ERROR: unknown virtual device name的正确解决办法
    Visual Studio LightSwitch初体验和定位看法
    在.NET上进行线性代数等科学计算
  • 原文地址:https://www.cnblogs.com/dddyyy/p/10061297.html
Copyright © 2020-2023  润新知