当前位置: 首页 > news >正文

面试题解,Java中的“对象”剖析

一、说一说JVM中对象的内存布局?new一个对象到底占多大内存?

话不多说,看下图,对象的内存布局图

一个对象的内存布局主要由三部分组成:对象头(Object Header)、实例数据(Instance Data)和对齐填充(Padding)。下面分别介绍这三部分:

对象头(Object Header)

  • Mark Word:存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志等。这部分信息是与对象自身相关的元数据。
  • 类型指针:指向对象类型数据的指针,即该对象属于哪个类的实例。这个地址用于访问类型数据区中的类信息,包括方法表和其他静态变量。

实例数据(Instance Data)

  • 这一部分存放着对象真正有效信息,也就是程序中定义的各种类型的字段内容。这些字段按照从父类到子类的顺序分配内存,同时相同宽度的字段会被分配在一起,以优化空间使用效率。此外,JVM还可能对字段进行重新排序以进一步优化性能,这一过程称为字段排列(Field Layout)。

对齐填充(Padding)

  • JVM要求对象的起始地址必须是8字节的整数倍,这是为了提高CPU缓存命中率和访问速度。

而数组类型的对象,还有4个字节的数组长度字段,所有new一个对象需要的内存大小为:

8byte(对象头) + 4byte(类型指针) + 实例数据 + 填充字段 + 4byte数组长度(若为数组类型)

二、阐述对象的内存分配策略

整体策略如下图所示:

我们来剖析一下:

首先判读是否在栈上分配

  • 在现代JVM中,编译器可能会执行逃逸分析来判断新创建的对象是否只在当前方法或线程内使用。如果一个对象不会“逃逸”出方法的作用域或者被其他线程引用,那么它可以安全地分配在栈上而不是堆上,这被称为标量替换(Scalar Replacement)。这种优化可以减少垃圾回收的压力,并提高性能。

大对象直接进入老年代

  • 如果对象的大小超过了某个阈值(可以通过-XX:PretenureSizeThreshold参数配置),JVM可能会决定直接将该对象分配到老年代,以避免因频繁复制而增加的GC开销。对于非常大的对象,这样的分配策略能够提升性能。

线程本地分配(Thread Local Allocation Buffer, TLAB)

  • 为了减少多线程环境下的锁竞争,每个线程都有自己的小块内存区域(在堆中),称为TLAB。当一个线程需要分配对象时,它首先尝试在自己的TLAB中分配。只有当TLAB空间不足时,才会触发全局同步操作以分配新的TLAB或者直接从共享堆中分配。

对象优先分配到Eden区

  • 如果对象不适合上述任何一种特殊处理,则按照标准的内存分配流程进行,即在年轻代的Eden区分配。如果Eden区没有足够的空间,就会触发一次Minor GC;若GC后仍无足够空间,可能需要晋升部分对象到老年代,甚至引发Full GC。

三、new一个对象都有哪些步骤?

我们来看对象的创建过程,如下图:

1.类加载检查

  • JVM首先检查该类是否已经被加载到内存中。如果尚未加载,则会触发类加载过程,包括加载、链接(验证、准备、解析)和初始化。

2.分配内存

  • 为新对象分配内存空间。这一步骤涉及到如何从堆内存中划分出足够的空间给新对象。内存分配的方式取决于JVM的实现和配置,例如快速失败分配(bump-the-pointer)、线程本地分配缓冲区(TLAB, Thread Local Allocation Buffer)等。
  • 分配过程中还需要考虑对象的对齐填充,确保对象占用的内存是8字节的整数倍,以及处理并发情况下的线程安全问题。

3.内存空间初始化(初始化零值)

  • 在分配完内存后,JVM会对对象的实例变量进行零初始化(zero-initialization),即所有数值型字段被设为0或0.0,引用类型字段被设为null,boolean类型字段被设为false。

4.设置(对象头)

  • 初始化对象头的信息,如哈希码、GC分代年龄、锁状态标志等,并设置指向类元数据的指针,以便知道对象属于哪个类。

5.对象初始化(执行构造函数)

  • 调用类的构造方法来初始化对象的状态。构造方法可以设置成员变量的具体值,并执行其他必要的初始化操作。这是用户代码控制的部分,程序员可以在构造方法中编写自定义逻辑。

相关文章:

面试题解,Java中的“对象”剖析

一、说一说JVM中对象的内存布局?new一个对象到底占多大内存? 话不多说,看下图,对象的内存布局图 一个对象的内存布局主要由三部分组成:对象头(Object Header)、实例数据(Instance D…...

对计网大题的一些指正(中间介绍一下CDM的原理和应用)

目录 前言: (1)五层原理体系结构每层功能: 下面是文档的答案: 我在之前的博客里面有介绍过五层原理体系结构, 按理来说,第五层应该是应用层才对,而会话层的功能应该被放到应用层…...

122. 买卖股票的最佳时机 II

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150问题分析: 和买卖股票的最佳时机I这题相比,区别就是可以买多只股票虽然同时只能持有一支,但是我们还是可以…...

qt中如何判断字符串是否为数字,整数,浮点数?

在 Qt 中,可以使用多种方法来判断字符串是否为数字、整数或浮点数。Qt 提供了一些方便的字符串和数值处理函数,可以帮助你实现这些判断。以下是几种常见的方法: 1. 使用 QRegularExpression Qt 提供了 QRegularExpression 类,可…...

《GICv3_Software_Overview_Official_Release_B》学习笔记

1.不同版本的 GIC 架构及其主要功能如下图所示: 2.GICv2m(Generic Interrupt Controller Virtualization Model)是针对ARM架构的GIC(通用中断控制器)的一种扩展, GICv2m扩展为虚拟化环境中的中断管理提供了…...

告别Kibana:Elasticsearch 桌面客户端的新变革

告别Kibana:Elasticsearch 桌面客户端的新变革 在大数据处理与分析领域,Elasticsearch 及其相关技术的应用日益广泛。长期以来,Kibana 在数据可视化与查询管理方面占据重要地位,但随着技术的不断发展,用户对于更高效、…...

【蓝桥杯研究生组】第14届Java试题答案整理

试题链接&#xff1a;链接 A题 满足条件的答案有&#xff1a;35813116 public class TianShu {public static void main(String[] args) {int ans 0;// 2000.1.1 - 2000000.1.1// 年份是月份的倍数&#xff0c;也是日的倍数for (int year2000; year<2000000; year) {for …...

链式调用方式重写父类set方法导致fastjson解析的对象属性未赋值

反序列化后发现属性为null 昨天使用fastjson的JSON.parseArray(json, class)反序列化的时候&#xff0c;发现返回的list列表中的对象某个属性为null&#xff0c;但是json字符串里面这个属性是有值的&#xff0c;经过排查发现是因为子类重写了父类的set方法&#xff0c;且返回值…...

[AUTOSAR 基础入门] - AUTOSAR配置工具

返回总目录 前文我们提到了要借助 EasySAR 平台来助力大家更好地融合 AUTOSAR 的理论与实践&#xff0c;让大家能够切实将所学知识转化为实际操作能力。建议大家感兴趣的去注册一下看看。跳转链接&#xff1a;EasySAR EasySAR是昂辉科技基于 AUTOSAR 方法论设计的一款面向汽车…...

鸿蒙开发:实现键值数据库存储

前言 鸿蒙当中数据持久化存储&#xff0c;为我们提供了多种的实现方式&#xff0c;比如用户首选项方式&#xff0c;关系型数据库方式&#xff0c;键值型数据库方式&#xff0c;文件存储方式等等&#xff0c;对于数据量比较的小的&#xff0c;我们直接选择轻量级的用户首选项方式…...

ip属地的信息准确吗?ip归属地不准确怎么办

在数字化时代&#xff0c;IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上&#xff0c;IP属地信息都扮演着重要的角色。然而&#xff0c;随着技术的不断进步和网络的复杂性增加&#xff0c;IP属地信息的准确性问题也日益凸显。那么&#xff0c;IP属地信…...

CSS——1.优缺点

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><link rel"stylesheet" type"text/css" href"1-02.css"/></head><body><!--css&#xff1a;层叠样式表…...

Android设备使用AOA协议进行主机与配件模式通信

1.使用TYPC-C数据线连接两台华为手机&#xff1a; TYPE-C线&#xff0c;先连接下图右边的ACCESSORY 再连接左边的HOST 此时左边的HOST(白色) 会给右边的ACCESSORY(黑色) 充电 接着打开左连接的HostChart会自动调起授权&#xff0c;然后会启动右边的AccessoryChart USB HOS…...

MySQL中深度分页问题的优化

MySQL中深度分页问题的优化 在MySQL中&#xff0c;使用LIMIT子句进行分页查询时&#xff0c;可能会遇到一个常见的性能问题&#xff1a;当LIMIT子句中的偏移量X很大时&#xff0c;查询速度会显著下降。例如&#xff0c;LIMIT 0,10可能只需要20毫秒&#xff0c;而LIMIT 1000000,…...

5. C语言 常量与宏定义

本章目录: 前言一、什么是常量&#xff1f;1. 整型常量2. 浮点型常量3. 字符常量4. 字符串常量 二、如何定义常量&#xff1f;1. 使用 #define 宏定义2. 使用 const 关键字 三、#define 和 const 的区别四、使用建议1. 使用场景区分2. 避免宏定义的潜在问题 五、特殊用法与小技…...

【mybatis-plus问题集锦系列】mybatis使用xml配置文件实现数据的基础增删改查

简单的数据查询&#xff0c;我们可以在mapper接口里面去实现&#xff0c;但是如果是复杂的查询&#xff0c;我们就可以使用xml配置文件去做&#xff0c; 官网链接xml配置文件 实现效果 实现代码 根据mapper接口的包结构&#xff0c;在resources包里面新建同名同结构的xml文件…...

spring防止重复点击,两种注解实现(AOP)

第一种&#xff1a;EasyLock 简介 为了简化可复用注解&#xff0c;自己实现的注解&#xff0c;代码简单随拿随用 使用方式 1.创建一个注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface EasyLock {long waitTime() default …...

Spring Boot 3 实现 MySQL 主从数据库之间的数据同步

✅ Spring Boot 3 实现 MySQL 主从数据库之间的数据同步 在实际项目中,为了提高 系统的读性能 和 数据的可用性,通常会使用 主从数据库架构。Spring Boot 提供了对 多数据源 的良好支持,可以轻松配置 主从数据库 的数据同步,实现 读写分离。 🎯 方案介绍 我们将通过 Sp…...

WPS-JS宏快速上手

WPS JS宏注意事项 代码后面可以不写分号“ ; ”&#xff1b; 缩进对程序的运行影响不大&#xff0c;但为了易读&#xff08;防止自己以后看不懂&#xff09;&#xff0c;还是乖乖写好&#xff1b; 代码是逐行运行的&#xff0c;意味着下面一行代码错了&#xff0c;前面的代码…...

力扣hot100——堆

215. 数组中的第K个最大元素 快速排序 class Solution { public:int findKthLargest(vector<int>& a, int k) {auto qsort [&](this auto&& qsort, int l, int r) -> void {if (l r) return;int i l - 1, j r 1;int x a[(l r) / 2];/*如果把…...

【小制作】米家模拟手指点击

代码功能解释 这段代码是一个基于Arduino平台的控制程序&#xff0c;主要功能包括&#xff1a; 初始化&#xff1a;设置引脚模式、初始化编码器、舵机和EEPROM。按键检测&#xff1a;处理按钮的单击、双击和长按事件&#xff0c;并根据事件执行相应操作。编码器更新&#xff…...

ubuntu1604 apt镜像源切换

1、如何查看当前源 cat /etc/apt/sources.list less /etc/apt/sources.list 2、apt源修改为阿里镜像&#xff0c;这里ubuntu是1604&#xff1a; deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/…...

leetcode刷题笔记

题目思路1.两数之和哈希表2.两数相加链表操作3. 无重复字符的最长子串滑动窗口&#xff0c;特别注意数组越界情况&#xff01;4. 寻找两个正序数组的中位数5.最长回文子串从中间向两边扩展&#xff0c;注意整个字符串都是回文串的边界情况10.正则表达式匹配动态规划&#xff0c…...

修复 ITunes 在 Windows 或 Mac 上不断崩溃的问题 [100% 有效]

对于 iDevice 用户来说&#xff0c;只能通过 iTunes 在 iDevice 和计算机之间传输文件的困境一直是一个紧迫的问题。所有 iPhone 用户可能都知道&#xff0c;iTunes 并不是一款高效的应用程序&#xff0c;有时性能会很差&#xff0c;例如在 iDevices 和计算机之间传输文件时不断…...

Mac M2基于MySQL 8.4.3搭建(伪)主从集群

前置准备工作 安装MySQL 8.4.3 参考博主之前的文档&#xff0c;在本地Mac安装好MySQL&#xff1a;Mac M2 Pro安装MySQL 8.4.3安装目录&#xff1a;/usr/local/mysql&#xff0c;安装好的MySQL都处于运行状态&#xff0c;需要先停止MySQL服务最快的方式&#xff1a;系统设置 …...

Visual Point Cloud Forecasting enables Scalable Autonomous Driving——点云论文阅读(12)

此内容是论文总结,重点看思路!! 文章概述 这篇文章介绍了一个名为 ViDAR 的视觉点云预测框架,它通过预测历史视觉输入生成未来点云,作为自动驾驶的预训练任务。ViDAR 集成了语义、三维几何和时间动态信息,有效提升了感知、预测和规划等自动驾驶核心任务的性能。实验表明…...

handpose x plus 数据解析 >> DataBall

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” ---------------------------- 样品数据&#xff1a; 通过加入知识…...

LINUX线程操作

文章目录 线程的定义LINUX中的线程模型一对一模型多对一模型多对多模型 线程实现原理线程的状态新建状态&#xff08;New&#xff09;就绪状态&#xff08;Runnable&#xff09;运行状态&#xff08;Running&#xff09;阻塞状态&#xff08;Blocked&#xff09;死亡状态&#…...

每日一学——日志管理工具(ELK Stack)

5.1 ELK Stack 5.1.1 Elasticsearch索引机制 嘿&#xff0c;小伙伴们&#xff01;今天我们要聊聊ELK Stack——一套由Elasticsearch、Logstash和Kibana组成的强大日志管理工具集。通过这套工具&#xff0c;我们可以轻松地收集、存储、搜索和可视化日志数据。首先&#xff0c;…...

设计模式 结构型 适配器模式(Adapter Pattern)与 常见技术框架应用 解析

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而使原本因接口不兼容而无法一起工作的类能够协同工作。这种设计模式在软件开发中非常有用&#xff0c;尤其是在需要集成…...

【Leetcode】732. 我的日程安排表 III

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 当 k k k 个日程存在一些非空交集时&#xff08;即, k k k 个日程包含了一些相同时间&#xff09;&#xff0c;就会产生 k k k 次预订。 给你一些日程安排 [startTime, endTime…...

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio&#xff0c;打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件&#xff0c;将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包&#xff0c;应用的名称…...

RocketMQ消费者如何消费消息以及ack

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写&#xff0c;有些不清楚的可以看下上一篇博客&#xff1a; https://blog.csdn.net/u013127325/article/details/144934073 2.broker是如何…...

华为消费级QLC SSD来了

近日&#xff0c;有关消息显示&#xff0c;华为的消费级SSD产品线&#xff0c;eKitStor Xtreme 200E系列&#xff0c;在韩国一家在线零售商处首次公开销售&#xff0c;引起了业界的广泛关注。 尽管华为已经涉足服务器级别的SSD制造多年&#xff0c;但直到今年6月才正式推出面向…...

Conda 安装 Jupyter Notebook

文章目录 1. 安装 Conda下载与安装步骤&#xff1a; 2. 创建虚拟环境3. 安装 Jupyter Notebook4. 启动 Jupyter Notebook5. 安装扩展功能&#xff08;可选&#xff09;6. 更新与维护7. 总结 Jupyter Notebook 是一款非常流行的交互式开发工具&#xff0c;尤其适合数据科学、机器…...

高等数学学习笔记 ☞ 极限的运算法则与存在准则

1. 极限的运算法则 &#xff08;1&#xff09;有限个无穷小的和是无穷小。 &#xff08;2&#xff09;有限个无穷小的乘积是无穷小。 备注&#xff1a; ①&#xff1a;无限个无穷小的和不一定是无穷小&#xff0c;反例如下&#xf…...

【开源】创建自动签到系统—QD框架

1. 介绍 QD是一个 基于 HAR 编辑器和 Tornado 服务端的 HTTP 定时任务自动执行 Web 框架。 主要通过抓包获取到HAR来制作任务模板&#xff0c;从而实现异步响应和发起HTTP请求 2. 需要环境 2.1 硬件需求 CPU&#xff1a;至少1核 内存&#xff1a;推荐 ≥ 1G 硬盘&#xff1a;推…...

k8s集群,CRI-Docker部署条件及方法

CRI-Docker部署条件及方法 文章目录 CRI-Docker部署条件及方法CRI-Docker使用条件安装 cri-docker 的步骤&#xff1a; CRI-Docker使用条件 在 Kubernetes 1.20 及以上版本&#xff0c;kubeadm 默认使用 containerd 作为容器运行时&#xff08;Container Runtime Interface, C…...

STLG_01_09_程序设计C语言 - 指针

C语言中的指针是一个非常重要的概念&#xff0c;它允许程序直接访问和操作内存地址。理解指针对于掌握C语言编程至关重要。 1. 指针的基本概念 指针&#xff1a;指针是一个变量&#xff0c;它存储的是另一个变量的内存地址。指针变量&#xff1a;指针变量专门用来存储内存地址…...

Seaborn的分类柱状图sns.barplot()

Seaborn的分类柱状图sns.barplot 一、sns.barplot()参数详解二、代码实现一、sns.barplot()参数详解 sns.barplot 是 Seaborn 库中用于绘制分类柱状图(bar chart)的函数。Seaborn 是一个基于 Matplotlib 的数据可视化库,它提供了更高级别的接口来绘制统计图形,并且有更…...

SpringBoot入门之创建一个Hello World项目

文章目录 一、创建一个SpringBoot项目二、配置pom.xml文件三、下载Maven依赖四、创建一个Controller类&#xff1a;com.devops.controller.HelloController五、创建一个引导类&#xff1a;com.devops.HelloApplication六、启动项目七、访问8080八、完整项目结构九、参考视频 一…...

MAC系统QT Creator的快捷键

安装好QT Creator后使用了一段时间&#xff0c;真是越用越难受&#xff0c;只想说&#x1f5d1;️。。。 找一圈qt creator的快捷键 0. 快捷键界面 这里的搜索真的是…无语&#xff0c;不考虑是人查找吗&#xff1f;&#xff1f; 1. 代码前后浏览 2. 移动代码 3. 半自动导入…...

qml Rectangle详解

1、概述 Rectangle是Qt Quick中的一个基础图形元素&#xff0c;用于在QML界面上绘制一个可带边框和可填充的矩形区域。它继承自Item类&#xff0c;因此具有Item的所有属性和功能&#xff0c;如位置、尺寸、变换等。通过Rectangle&#xff0c;可以创建各种矩形形状&#xff0c;…...

C语言中关于数据类型带来的陷阱

前言 笔者在阅读《深入理解计算机系统》时&#xff0c;理解了为何C语言被称为不安全语言&#xff0c;C语言除了指针非常灵活可能会导致大量漏洞之外&#xff0c;C语言的无符号数据也可能带来致命性危害。 扩展一个数据的表示 将一个无符号数转换为更大的数据类型&#xff0c…...

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中&#xff0c;画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流&#xff08;程&#xff09;图 Data Flow Diagram&#xff0c;DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具&#xff0c;可以将…...

【AimRT】AimRT Hello World

目录 一、工程结构二、源码说明/CMakeLists.txt/cmake/GetAimRT.cmake/src/CMakeLists.txt/src/module/helloworld_module/CMakeLists.txt/src/app/helloworld_app/CMakeLists.txt/src/install/cfg/helloworld_cfg.yaml/src/module/helloworld_module/helloworld_module.h/src/…...

在Typora中实现自动编号

文章目录 在Typora中实现自动编号1. 引言2. 准备工作3. 自动编号的实现3.1 文章大纲自动编号3.2 主题目录&#xff08;TOC&#xff09;自动编号3.3 文章内容自动编号3.4 完整代码 4. 应用自定义CSS5. 结论 在Typora中实现自动编号 1. 引言 Typora是一款非常流行的Markdown编辑…...

Vue2/Vue3使用DataV

Vue2 注意vue2与3安装DataV命令命令是不同的Vue3 DataV - Vue3 官网地址 注意vue2与3安装DataV命令命令是不同的 vue3vite 与 Vue3webpack 对应安装也不同vue3vite npm install kjgl77/datav-vue3全局引入 // main.ts中全局引入 import { createApp } from vue import Da…...

Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决

在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决 在 Redis 高可用架构中&#xff0c;哨兵模式&#xff08;Sentinel&#xff09;是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵&#xff0c;我们可以实现 Redis 集群的监控、故障检测和…...

数据库设计

数据库设计全攻略:从理论到实践 在当今数字化驱动的世界里,数据已然成为企业和组织最为宝贵的资产之一。而数据库,作为数据的“栖息地”,其设计的优劣直接关系到整个信息系统的性能、可维护性以及能否高效满足业务需求。一个精心构思的数据库设计方案,就如同为一座高楼打…...