从Java中使用new 关键字创建对象开始,深度剖析对象结构与存储

文章目录

    • 1.对象结构
    • 2.扩展补充
    • 3.小结

1.对象结构

在介绍之前.先来看一个java高频面试题,new String(''hello") 创建了几个对象

1.这里分情况讨论,如果hello已经在常量池中存在,那么就是在堆中创建1个对象,并返回堆中对象的引用。
2.如果对象hello不在常量池中,那么就是2个对象,分别在堆和常量池(1.8之后字符串常量池在堆中,之前在方法区)创建一个对象并返回堆对象的引用。

(1)对象分为对象头、实例数据、字节填充

一个对象实例数据是放在堆中,对象的引用时放在栈中,对象所引用的class类对象是在方法区(JDK1.8之后为元空间)。

1)对象头包含MarkWord、类型指针、数组长度 这三块。
其中MarkWord在不同位操作系统中存储大小和方式不同,32位操作系统采用以下结构表示:
在这里插入图片描述
64位操作系统采用以下结构:
在这里插入图片描述

其中MarkWord和类型指针占用字节和操作系统一样,32位系统4个字节,64位系统8个字节。

这个对象头中数组长度占用4个字节,是创建数组对象特有的一块内存分配。

下面简要介绍下对象头的作用。
1对象头MarkWord记录了对象分代年龄,锁,线程id,hashcode信息等,为什么这么设计呢?【大家可以思考思考】

1.这里就涉及到Java并发多线程锁的实现和JVM中垃圾回收。
其中锁标识位、是否偏向锁、线程ID、等指针都用来多线程并发锁状态更新记录。
众所周知,Java内部有一个锁关键字synchronized,这个是一个可重入内置锁,JDK在1.6以后对其使用做了内置化升级,就是启用了锁升级机制来在保证线程安全下提升并发效率。多线程情况下,通常刚进来时,第一个线程获取锁对象时, 这个对象会从无锁状态变成持有偏向锁。随着后续线程竞争获取锁时,如果上个线程没执行完,则会立马回到savepoint暂停执行,锁直接升级轻量级锁,cpu轮询时间切片执行其他线程,如果上个线程执行很快,立马执行完,释放了锁,那么此时线程获取锁仍然是偏向锁。偏向锁性能相对较高,一旦升级为轻量级锁,当后续涌入大量线程发生竞争获取锁时候,会不断自旋获取锁,当自选周期达到500个时钟周期,或者极端情况下,轻量级锁已经无法管理整个线程运行情况时,此时会升级为重量级锁。此时线程就几乎变成串行同步执行了,没有获取锁的线程直接陷入阻塞【线程上下文切换非常损耗CPU性能】,这个状态下性能最低。
分代年龄用于JVM进行内存回收时,是否判断当前对象是否进入年老代。默认是15

2.讲完了MarkWord,那么对象头类型指针干吗用的呢?
用于反射构建对象,还有就是调用类的方法/属性。
3. 对象头数组长度这个东西,便于操作对象使用,快速寻址,因为Java是强类型语言,根据数组对象地址以及数组的下标,可以快速定位数组某个索引下标的数据。这也就是说所有数组大家都可以通过 obj.length 来获取长度。
2)实例数据这个就是对象实例占用的字节数,其中引用类型在64为系统占用8个字节,32位系统占用4个字节。
3)对齐填充,这个为啥子还要对齐填充呢,大家有没有思考过?
所谓对齐填充不是必须的,所有对象需要满足是4个字节【32位系统】或8个字节【64位系统】的整数倍。如果不够,则需要通过字节填充来满足这个规范。这个还是为了方便操作系统寻址计算

2.扩展补充

  1. 基础类型对应的包装类,提供了缓存机制,即为了减少对象的频繁创建和销毁,减少内存使用提高程序运行效率,数值类型采用1个字节来构建缓存对象,即缓存值范围在【-128-127】。其中Float和Double不具有缓存机制。
  2. 缓存机制实现是基于内部一个静态内部类 包装类Cache 这种形式类 比如Integer类型 采用IntegerCache作为缓存实现内部类,默认是-128到127,当然Java技术大佬还提供了可供开发者修改Integer缓存范围。
    在这里插入图片描述
    上面是IntegerCache源码静态代码块部分,可见,开发可以设置环境变量来自定义Integer缓存范围。 JVM参数设置方式如下: XX:AutoBoxCacheMax=<size>或 -Djava.lang.Integer.IntegerCache.high=<high>

3.注意事项:
只有当两个包装类对象是通过调用静态工厂方法Integer.valueOf() 来实现对象创建时,才会相等。以
Integer为例子,这方法调用时,会先走缓存进行比较。
在这里插入图片描述
下面做个简单例子说明:

Integer a= 120;
Integer b =120;
Integer c = new Integer(100);
Integer d = new Integer(100);
Integer e =100;
int f =100;
System.out.println(a==b); //结果为true 
System.out.println(c==d); //结果为false 两个不同对象,地址不同
System.out.println(c==e); //结果为false 对象比较地址,地址不同
System.out.println(c==f); //结果为true 包装类自动拆箱,比较值。 

第一个结果为true,初看是两个对象,但是120赋值给Integer对象做了包装,隐式调用了Integer.valueOf(120) 在赋值给a和b;由于采用了缓存机制,因此a和b是同一份对象地址也相同如果Integer a=128,Integer b =128,比较的话就是false。

3.小结

本文通过new 关键字创建对象开始,简要对Java中对象的结构、存储以及对象结构每个部分的功能做了简要介绍,如讲述有误,希望大家评论区交流指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/7566.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ThreadLocal 的原理和使用场景

1.ThreadLocal是什么 ThreadLocal 是 Java 提供的一个用于线程存储本地变量的类。它为每个线程提供独立的变量副本&#xff0c;确保变量在多线程环境下的线程安全。每个线程访问 ThreadLocal 时&#xff0c;都会有自己专属的变量副本&#xff0c;互不干扰&#xff0c;避免了并…

qt QColorDialog详解

1、概述 QColorDialog是Qt框架中的一个对话框类&#xff0c;专门用于让用户选择颜色。它提供了一个标准的颜色选择界面&#xff0c;其中包括基本的颜色选择器&#xff08;如调色板和颜色轮&#xff09;、自定义颜色输入区域以及预定义颜色列表。QColorDialog支持RGB、HSV和十六…

关于Redis

Redis 基础 什么是 Redis&#xff1f; Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xf…

linux nvidia/cuda安装

1.查看显卡型号 lspci |grep -i vga2.nvidia安装 2.1在线安装 终端输入&#xff08;当显卡插上之后&#xff0c;系统会有推荐的安装版本&#xff09; ubuntu-drivers devices可得到如下内容 vendor : NVIDIA Corporation model : TU104GL [Tesla T4] driver : nvid…

uniapp 实现瀑布流

效果演示 组件下载 瀑布流布局-waterfall - DCloud 插件市场

了解聚簇索引和非聚簇索引

在关系型数据库中,索引是提高查询效率的重要手段。索引类似于书籍中的目录,能够帮助数据库快速定位到所需的数据。而在数据库中,最常用的两种索引类型是聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)。本文将详细介绍这两种索引类型,帮助读者更好地理解…

CODESYS可视化桌面屏保-动态气泡制作详细案例

#一个用于可视化(HMI)界面的动态屏保的详细制作案例程序# 前言: 在工控自动化设备上,为了防止由于人为误触发或操作引起的故障,通常在触摸屏(HMI)增加屏幕保护界面,然而随着PLC偏IT化的发展,在控制界面上的美观程度也逐渐向上位机或网页前端方面发展,本篇模仿Windows…

【数据结构 队列】超详细理解例题

数据结构 队列 前言队列的定义队列的概念队列的基本操作 队列用C语言实现Queue.hQueue.ctext.c 队列 VS 栈队列的应用 你好&#xff0c;这里是新人 Sunfor 这篇是我最近对于数据结构 队列的学习心得和错题整理 有任何错误欢迎指正&#xff0c;欢迎交流&#xff01; 会持续更新…

VSCode + linux 远程免密登录

目录 一. VS Code端1. 安装插件Remote - SSH2. 配置config文件3. 公钥生成 二、远程服务器端1. 将生成的公钥发送到远程服务器 三、连接1. 准备就绪后&#xff0c;VSCode连接 一. VS Code端 1. 安装插件Remote - SSH 2. 配置config文件 Host H5WebHostName xx.xx.xx.xxUser ro…

简单分享一下淘宝商品数据自动化抓取的技术实现与挑战

在电子商务领域&#xff0c;数据是驱动决策的关键。淘宝作为国内最大的电商平台之一&#xff0c;其商品数据对电商从业者来说具有极高的价值。然而&#xff0c;从淘宝平台自动化抓取商品数据并非易事&#xff0c;涉及多重技术和法律挑战。本文将从技术层面分析实现淘宝商品数据…

初识网络编程

目录 前言相关名词解释应用层协议——HTTP传输层协议socketTCP帧头格式三次握手、四次挥手 UDPTCP的socket实现 参考博文 前言 刚碰到网络编程&#xff0c;会出现一堆协议、概念、这层次那技术的&#xff0c;头都大了&#xff0c;还是得总结总结…… 相关名词解释 ✨✨网络…

JRTPLIB中的RTPSession与OnSSRCCollision:深入解析SSRC冲突处理机制

JRTPLIB中的RTPSession与OnSSRCCollision:深入解析SSRC冲突处理机制 一、RTP与SSRC基础1.1 RTP简介1.2 SSRC的作用二、JRTPLIB与RTPSession2.1 JRTPLIB概述2.2 RTPSession类三、SSRC冲突与OnSSRCCollision3.1 SSRC冲突的原因3.2 OnSSRCCollision回调函数3.3 OnSSRCCollision的…

【数据集】【YOLO】【目标检测】口罩佩戴识别数据集 1971 张,YOLO佩戴口罩检测算法实战训练教程!

数据集介绍 【数据集】口罩佩戴检测数据集 1971 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。 数据集中包含1种分类&#xff1a;{0: face_mask}&#xff0c;佩戴口罩。 数据集来自国内外图片网站和视频截图。 检测场景为城市街道、医院、商场、机场、车站、办…

实测讯飞智作,一张照片定制属于自己的数字人

Datawhale亲测 AI应用&#xff1a;讯飞智作 只用一张照片&#xff0c;就可以定制属于自己的数字人。 这是大模型给数字人领域带来的最新震撼。 就在两周前的 AI 开发者 Talk 合肥站活动上&#xff0c;我们 Datawhale 的一名小伙伴玉鑫化身成数字人亮相大屏幕&#xff0c;为参加…

乡村景区一体化系统(门票,餐饮,便利店,果园,娱乐,停车收费

一、一体化优势 1. 提升游客体验&#xff1a;游客可以通过一个系统方便地完成各种消费和预订&#xff0c;无需在不同的地方分别处理&#xff0c;节省时间和精力&#xff0c;使游玩过程更加顺畅和愉快。 2. 提高管理效率&#xff1a;景区管理者能够在一个平台上集中管理多个业…

安卓编程最方便的读写资料类SharedPreferences,多个APP共享

本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解这五种方式的特点 第一种&#xff1a; 使用SharedPreferences存储数据 …

[Docker#1] 专栏前言 | 亿级高并发架构演进之路

目录 目标 一.前期演进 1. 单机架构 2. 应用数据分离架构 3. 应用集群架构 4. 读写分离/主从分离架构 5. 冷热分离架构 二. 架构 分布式数据库架构 微服务架构 容器编排架构 三. An Internet Application Architecture 理解 上层传输 框架 数据处理 主要思想 …

初识AI大模型,ollama使用,llama factory大模型微调,lama.cpp模型转换guff

最近了解了下生成式AI对话&#xff0c;下面是自己的一些尝试记录。 ollama 安装及使用 1、安装 我是在windows环境下安装的&#xff0c;很简单&#xff0c;访问&#xff1a;https://ollama.com/ &#xff0c;下载windows安装包&#xff0c;打开安装就行了。 cmd输入ollama -v检…

Mybatis、Mybatis-Plus 调用同一个组件的查询时遇到的坑

Mybatis、Mybatis-Plus 调用同一个组件的查询时遇到的坑 Mybais-plus配置了驼峰自动命名&#xff0c;所以不需要在SQL里转化查询。

ssm070基于SSM框架的校园代购服务订单管理系统的设计与实现+vue(论文+源码)_kaic

毕业设计 题 目&#xff1a; 校园代购服务订单管理系统 作 者&#xff1a; 学 号&#xff1a; 所属学院&#xff1a; 专业年级&#xff1a; 学校导师&#xff1a; 职 称&#xff1a; 班级导师&#xff1a; 职 称&#xff1a; 完成时间…