热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java对象内存分配_java对象的创建以及内存分配

一、对象的创建1.查看指令是否加载当虚拟机遇到一条new指令时,首先先去检查这个指令的参数能否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代

一、对象的创建

1.查看指令是否加载

当虚拟机遇到一条new指令时,首先先去检查这个指令的参数能否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、机械和初始化过。如果没有就先执行相应的类加载过程。

2.分配内存

在类加载完成后就可以完全确定对象所需内存了,这时内存分配可以分为两种,java堆内存规整和不规整。java堆是否完整取决于垃圾收集器是否带有压缩整理功能。

1.指针碰撞:如果java堆中的内存是规整的,用过的内存放一边,没用过的内存放一边,中间放一个指针作为分几点的指示器。分配内存时就把指针向空闲控件挪一段距离就好。

2.空闲列表:如果java堆中的内存不规整,虚拟机会维护一个列表,记录那些内存可用。在分配内存的时候会找一块足够大的内存空间划分给对象实例,然后更新列表。

线程安全

在对象创建的时候,分配内存时可能出现并发问题。正在给对象A分配内存,指针还没修改,对象B又同事使用原来指针分配内存。

解决方案有两种:

1.对分配空间的动作进行同步处理

2.把内存分配动作按照线程划分在不同的空间中进行。假如有两个线程都在创建对象,那就让每个线程在java堆中预先分配一块内存,称为本地线程分配缓冲(TLAB),哪个线程要分配内存,就在哪个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时才需要同步。

3.初始化

内存分配完以后,虚拟机需要将分配到的内存空间初始化为0(不包括对象头),如果使用TLAB,这一过程 也可以提前至TLAB分配时进行。这一步操作保证了对象实例阶段在java代码中可以不赋初始值就能直接使用,可以访问到这些字段的数据类型所对应的的零值。接下来虚拟机要对对象进行必要的设置,存入对象头中。

此后执行完new指令后执行方法,把对象按照程序员的医院初始化,然后形成新的对象。

二、对象的内存布局

对象中存储布局分为对象头、梳理数据、对齐填充。

1.对象头

对象头有两部分:

第一部分存储对象自身运行时数据如哈希码,GC分代年龄、锁状态标志等等。在32位和64位虚拟机中为32位或者64位。其实这些空间不够用,只是被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,会根据对象装固态复用自己的存储空间。例如在未被锁的状态下和锁状态下,存储各个信息的位数不一样。

第二部分是类型指针,指向雷院数据的指针,通过这个指针确定是哪个类的实例。如果对象是一个java数组,还必须要有一块记录数组长度的数据,因为不能通过数组类元数据中确定数组大小。

2.实例数据

是对象真正的村塾的有效信息,也是代码中定义的字段内容,无论是从父类继承还是子类定义,都要记录。Hotspot默认分配策略为long/double、int、short/char、byte/boolean

相同宽度的字段会被分配到一起。在满足这个条件以前,父类定义的变量会出现在子类之前。

3.对齐填充

占位符的作用,要求对象起始地址必须是8字节的整数倍,也就是对象大小必须是8字节整数倍。对象头部分一般都是满的,但是对象实例数据可能会有没对齐的,就需要来补全

三、对象的访问定位

建立完对象以后,我们会通过java虚拟机栈上的reference数据来操作堆上的具体对象。引用访问对象的方法有两种使用句柄和直接指针。

1.句柄访问

java堆中会划分出一块内存作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。(实例数据可以理解为对象的数据,类型数据可以理解为class相关数据)



推荐阅读
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
author-avatar
低调浪漫0613
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有