jvm--对象实例化及直接内存

news2024/10/2 22:19:31

文章目录

  • 1. 创建对象
  • 2. 对象内存布局
  • 3. 对象的访问定位
  • 4. 直接内存(Direct Memory)

1. 创建对象

在这里插入图片描述
创建对象的方式

  • new最常见的方式、Xxx 的静态方法(单例模式),XxxBuilder/XxxFactory 的静态方法
  • Class 的 newInstance 方法(已经过时):反射的方式,只能调用空参的构造器,权限必须是 public
  • Constructor 的 newInstance(XXX):反射的方式,可以调用空参带参的构造器,权限没有要求
  • 使用 clone():不调用任何的构造器,要求当前的类需要实现 Cloneable 接口,实现 clone()
  • 使用序列化:从文件中、从网络中获取一个对象的二进制流(克隆是浅拷贝,序列化是深拷贝
  • 第三方库 Objenesis

创建对象的步骤:
前面所述是从字节码角度看待对象的创建过程,现在从执行步骤的角度来分析:
在这里插入图片描述

  1. 判断对象对应的类是否加载、链接、初始化。
    虚拟机遇到一条 new 指令,首先去检查这个指令的参数能否在 Metaspace 的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载,解析和初始化(即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以 ClassLoader + 包名 + 类名为 key 进行查找对应的 .class 文件;

    • 如果没有找到文件,则抛出 ClassNotFoundException 异常
    • 如果找到,则进行类加载,并生成对应的 Class 对象
  2. 为对象分配内存
    首先计算对象占用空间的大小,接着在堆中划分一块内存给新对象。如果实例成员变量是引用变量,仅分配引用变量空间即可,即 4 个字节大小

    • 如果内存规整:虚拟机将采用的是指针碰撞法(Bump The Point)来为对象分配内存。

    • 如果内存不规整:虚拟机需要维护一个空闲列表(Free List)来为对象分配内存。
      选择哪种分配方式由 Java 堆是否规整所决定,而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

  3. 处理并发问题

    • 采用 CAS 失败重试区域加锁保证更新的原子性
    • 每个线程预先分配一块 TLAB:通过设置 -XX:+UseTLAB参数来设定
  4. 初始化分配到的内存
    所有属性设置默认值,保证对象实例字段在不赋值时可以直接使用

  5. 设置对象的对象头
    将对象的所属类(即类的元数据信息)、对象的 HashCode 和对象的 GC 信息、锁信息等数据存储在对象的对象头中。这个过程的具体设置方式取决于 JVM 实现。

  6. 执行 init 方法进行初始化
    在 Java 程序的视角看来,初始化才正式开始。初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量
    因此一般来说(由字节码中跟随 invokespecial 指令所决定),new 指令之后会接着就是执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完成创建出来。

对象实例化的过程

  1. 加载类元信息
  2. 为对象分配内存
  3. 处理并发问题
  4. 属性的默认初始化(零值初始化)
  5. 设置对象头信息
  6. 属性的显示初始化、代码块中初始化、构造器中初始化

2. 对象内存布局

在这里插入图片描述
对象头包含了两部分,分别是运行时元数据(Mark Word)和类型指针。如果是数组,还需要记录数组的长度

运行时元数据

  • 哈希值(HashCode)
  • GC 分代年龄
  • 锁状态标志
  • 线程持有的锁
  • 偏向线程 ID
  • 翩向时间戳

类型指针:
指向类元数据 Instanceclass,确定该对象所属的类型

实例数据(Instance Data):
它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段)
在这里插入图片描述
小结
在这里插入图片描述

3. 对象的访问定位

JVM 是如何通过栈帧中的对象引用访问到其内部的对象实例呢?
在这里插入图片描述
句柄访问:reference 中存储稳定句柄地址,对象被移动(垃圾收集时移动对象很普遍)时只会改变句柄中实例数据指针即可,reference 本身不需要被修改在这里插入图片描述
直接指针(HotSpot 采用):直接指针是局部变量表中的引用,直接指向堆中的实例,在对象实例中有类型指针,指向的是方法区(元数据)中的对象类型数据
7

4. 直接内存(Direct Memory)

直接内存是在 Java 堆外的、直接向系统申请的内存区间。来源于 NIO,通过存在堆中的 DirectByteBuffer 操作 Native 内存。通常,访问直接内存的速度会优于 Java 堆,即读写性能高。
非直接缓存区:使用 IO 读写文件,需要与磁盘交互,需要由用户态切换到内核态。在内核态时,需要两份内存存储重复数据,效率低。在这里插入图片描述
直接缓存区:使用 NIO 时,操作系统划出的直接缓存区可以被 java 代码直接访问,只有一份。NIO 适合对大文件的读写操作。在这里插入图片描述
由于直接内存在 Java 堆外,因此它的大小不会直接受限于-Xmx 指定的最大堆大小,但是系统内存是有限的,Java 堆和直接内存的总和依然受限于操作系统能给出的最大内存。

  • 分配回收成本较高
  • 不受 JVM 内存回收管理

直接内存大小可以通过MaxDirectMemorySize设置。如果不指定,默认与堆的最大值-Xmx 参数值一致

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

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

相关文章

记录一次springboot使用定时任务中@Async没有生效的场景

环境说明 jdk21springboot 3.0.11 springcloud 2022.0.0 spring-cloud-alibaba 2022.0.0.0 在开发一个定时触发的任务的时候,由于开发执行任务的函数比较耗费时间,所以采用异步解决问题。 发现并没有按照预期的触发 经询问后,发现当前类的…

allegro提示错误(SPMHDB-225) The maximum number of text sizes has been reached.的解决

被这个问题困扰了好几天!网上根本找不到解决办法,无论是百度还是谷歌,bing都没有。 解决方法:菜单tools---->database check 全选上,点Check。 然后问题就解决了。

Docker 入门教程(简明易懂、零基础篇)

11.1 Docker 是什么? docker是一个开源的应用容器引擎。 21.2 容器是什么? 容器是一种轻量级的虚拟化技术 ,它是一个由应用运行环境、容器基础镜像组成的集合。 以 Web 服务 Nginx 为例,如下图所示:Nginx 容器是由 …

代码随想录Day14 LeetCodeT110平衡二叉树 T257二叉树的所有路径 T404 左叶子之和

以下思路来自于: 代码随想录 (programmercarl.com) LeetCode T110 平衡二叉树 题目链接:110. 平衡二叉树 - 力扣(LeetCode) 题目思路 前面我们说过了,求二叉树的深度我们应该使用前序遍历,求二叉树的高度我们应该使用后序遍历,因为后序遍历可以将子树的…

pdf文档内容提取pdfplumber、PyPDF2

测试pdfplumber识别效果好些;另外pdf这两个如果超过20多页就没法识别了,结果为空 1、pdfplumber 安装:pip install pdfplumber -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com代码: import pdfpl…

分布式锁如何实现

分布式是现在的比较主流的技术,常常和微服务一起出现。那么对于多个实例之间,如何证分布式系统中多个进程或线程同步访问共享资源呢?我们其实一想到的就是锁,我们在java里边有 synchronized, 在python里有lock,但是这个…

8路高速光栅尺磁栅尺编码器4倍频计数转Modbus TCP网络模块 YL99-RJ45

特点: ● 光栅尺磁栅尺解码转换成标准Modbus TCP协议 ● 高速光栅尺磁栅尺4倍频计数,频率可达5MHz ● 模块可以输出5V的电源给光栅尺或传感器供电 ● 支持8个光栅尺同时计数,可识别正反转 ● 可以设置作为16路独立DI高速计数器 ● 可网…

公园视频监控系统如何改造?人工智能又能提供哪些帮助?

近日合肥市骆岗公园宣布正式开园,作为目前世界最大的城市公园,占地12.7万平方公里,如此壮观宏伟的建设,也吸引到了不少市民进行参观打卡。不管大型小型,城市里的公园都是随处可见的,那么,公园安…

Android:自定义原生TimePickerDialog样式

效果图&#xff1a; 目标效果图&#xff1a; 原生效果&#xff1a; 实现&#xff1a; 首先是Dialog样式&#xff1a; <style name"TimePickerDialogStyle" parent"style/Theme.AppCompat.DayNight.Dialog.Alert"><item name"android:time…

数据结构 | (四) Queue

队列 &#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾&#xff08; Tail/Rear &#xff09; 出队列&#xff1a;进行删除操…

抖店商家体验分怎么提高|成都瀚网科技

在竞争激烈的电商行业&#xff0c;提供优质的商户体验对于吸引买家、增加销量至关重要。在抖店平台&#xff0c;商户体验评分是衡量商户服务质量的重要指标之一。本文将为您介绍提高抖店商家体验分的方法和技巧&#xff0c;帮助您提高服务质量&#xff0c;赢得更多买家的青睐。…

百度小程序制作源码 百度引流做关键词排名之技巧

百度作为国内最大的搜索引擎&#xff0c;对于关键词排名和流量获取的策略格外重要&#xff0c;下面给大家分享一个百度小程序制作源码和做百度引流、关键词排名的一些技巧。 移动设备的普及和微信小程序的火热&#xff0c;百度也推出了自己的小程序。百度小程序与微信小程序类…

云安全之下一代防火墙介绍

防火墙的概念 下一代防火墙&#xff08;Next Generation Firewall&#xff0c;NGFW&#xff09;是一种可以全面应对应用层威胁的高性能防火墙。通过深入洞察网络流量中的用户、应用和内容&#xff0c;并借助全新的高性能单路径异构并行处理引擎&#xff0c;NGFW能够为用户提供…

redis实战-实现用户签到UV统计

BitMap功能演示 我们针对签到功能完全可以通过mysql来完成&#xff0c;比如说以下这张表 用户一次签到&#xff0c;就是一条记录&#xff0c;假如有1000万用户&#xff0c;平均每人每年签到次数为10次&#xff0c;则这张表一年的数据量为 1亿条 每签到一次需要使用&#xff08…

遥感云大数据在灾害、水体与湿地领域典型案 例实践及 GPT 模型应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

el-tree中插入图标并且带提示信息

<template><div class"left"><!-- default-expanded-keys 默认展开 --><!-- expand-on-click-node 只有点击箭头才会展开树 --><el-tree :data"list" :props"defaultProps" node-click"handleNodeClick" :…

【已解决】多种方式最新解决Invalid Host header(无效的主机头)服务器域名访问出现的错误

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;CSDN博客专家、内容合伙人&#xff0c;2023新星计划导师&#xff0c;前端领域优质创作者&#xff0c;共同学习共同进步&#xff0c;一起加油呀&…

离线安装mysql客户端

下载路径 oracle网站总是在不断更新&#xff0c;所以下载位置随时可能变动但万变不离其宗&#xff0c;学习也要学会一通百通。 首先直接搜索&#xff0c;就能找找到mysql官网 打开网站&#xff0c;并点击 DOWNLOADS 往下滚动&#xff0c;找到社区版下载按钮。…

/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21‘ not found (required by

在某项目中遇到下面的错误&#xff0c; ./model2trt_v2: /lib64/libstdc.so.6: version GLIBCXX_3.4.21 not found (required by ./model2trt_v2) ./model2trt_v2: /lib64/libstdc.so.6: version GLIBCXX_3.4.21 not found (required by ../../../lib/linux_lib/libcuda_utils…

NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器

自然语言处理是机器学习和人工智能的一个迷人领域。这篇博客文章启动了一个具体的 NLP 项目&#xff0c;涉及使用维基百科文章进行聚类、分类和知识提取。灵感和一般方法源自《Applied Text Analysis with Python》一书。 一、说明 该文是系列文章&#xff0c;揭示如何对爬取文…