JVM 第二部分-3(对象,直接内存)

对象

  • 对象的实例化
    • 创建对象的方式
      • new 对象
        • 变形1:使用类的静态方法获得对象
        • 变形2:xxxBuilder、xxxFactory的静态方法
      • 反射
        • Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public
        • Constructor的newInstance(xxx):反射的方式,可以调用空参,带参的构造器,权限没有要求
      • 使用clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone()
      • 使用反序列化:从文件、网络中获取一个对象的二进制流
      • 第三方库:Objenesis
    • 创建对象的步骤:
      • 1.对象对应的类加载、链接、初始化
      • 2.为对象分配内存(这个阶段就可以确定对象的大小)
        • 如果内存规整——指针碰撞(就是用一个指针指向内存已占用和未占用区域的分界线)
        • 如果内存不规整——就是还在用的区域和没有用的区域混杂在一起——虚拟机要维护一个列表——空闲列表分配——记下没有使用的区域
        • 一般是带有整理功能的虚拟机才会内存规整
      • 3.处理并发问题
        • 采用CAS+失败重试保证更新的原子性
        • 每个线程预先分配一块TLAB
      • 4.初始化分配到的空间——所有属性设默认值(零值),保证对象实例字段在不赋值时可以直接使用
      • 5.设置对象的对象头(将对象的所属类,即类的元数据信息、对象的HashCode和对象的GC信息、锁信息等数据结构储存在对象的对象头中。这个过程的具体设置方式取决于jvm的实现)
      • 6.执行init方法进行初始化(属性的显式初始化,代码块中初始化,构造器中初始化)
      • 请添加图片描述
  • 对象的内存分配
    • 对象头(Header)
      • 运行时元数据
        • 哈希值
        • GC分代年龄
        • 锁状态标志
        • 线程持有的锁
        • 偏向线程ID
        • 偏向时间戳
      • 类型指针——指向类元数据InstanceKlass,确定该对象所属的类型
      • 如果是数组,还需要记录数组的长度
    • 实例数据(Instance Data)
      • 说明:它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段)
      • 规则:
        • 相同宽度的字段总是被分配在一起
        • 父类中定义的变量会出现在子类之前
        • 如果CompactFields参数为true(默认为true):子类的窄变量可能插入到父类变量的空隙
    • 对齐填充(Padding)(不是必须的,也没什么特别含义,就是用来占位的)
    • 请添加图片描述
    • 请添加图片描述
  • 对象的访问定位
    • 句柄访问
      • 好处是 对象移动之后(标量替换,垃圾回收都会移动类),栈里面的变量不用改,很稳定
      • 缺点是需要开辟额外空间,也不是一步到位地找到
      • 请添加图片描述
    • 直接引用(Hotspot采用)
      • 好处是一步到位,不用开辟额外空间
      • 请添加图片描述

请添加图片描述

直接内存

  • 它是在Java堆外的、直接向系统申请的内存区间
  • 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域
  • 所有用Java的内存分析工具,比如jvisualvm,JProfiler等,是看不出元空间,或者说是直接内存的大小的
    • 程序产生的dump文件也看不到。所以,如果程序发生OOM,dump文件又比较小,有可能是涉及到NIO,直接内存的问题
  • 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存
  • 访问直接内存的速度会优于Java堆,即读写性能高
    • 读写频繁的场合可以用直接内存
    • Java的NIO库允许Java程序使用直接内存,用于数据缓冲区
  • 也是有可能会OOM的,因为它受限于系统能给内存,并不是无限大。特别是当设置堆的内存特别大,导致剩下的内存不够的时候,就容易OOM
  • 缺点
    • 分配回收成本较高
    • 不受jvm内存回收管理
  • 直接内存大小可以通过MaxDirectMemorySize设置
  • 如果不指定,默认与堆的最大值-Xmx参数值一致
    • (对于直接内存有大小限制,我的理解是这个区域还是要向系统申请的,不是系统剩下多少就能用多少)
  • 请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文献速递:帕金森的疾病分享--多模态机器学习预测帕金森病

文献速递:帕金森的疾病分享–多模态机器学习预测帕金森病 Title 题目 Multi-modality machine learning predicting Parkinson’s disease 多模态机器学习预测帕金森病 01 文献速递介绍 对于渐进性神经退行性疾病,早期和准确的诊断是有效开发和使…

Thumbnailator简介和示例

背景 对于javaweb服务端开发人员,图片资源的管理总是绕不开的一环。很多网站上都会提供上传图片这个功能,而现代数码设备拍摄出来的都是高清图片,分辨率很高,占用的空间也很大。物理存储的问题还算容易解决,但是网络带…

maven的私服

什么是maven的私服就是把自己写的工具类共享给别人这样大家都能用到你写的工具类不用重复写提示效率 maven的上传与下载示意图 1.什么是发行版本?发行版本指定的是功能稳定可以共大家使用的版本 2.什么是快照版本?快照版本指定的是指正在开发的版本 3…

[⑥5G NR]: 无线接口协议,信道映射学习

5G系统整体包括核心网、接入网以及终端部分,接入网与终端间通过无线空口协议栈进行连接。无线接口可分为三个协议层:物理层(L1)、数据链路层(L2)和网络层(L3)。 L1:物理…

【数据结构】:单链表之头插法和尾插法(动图+图解)

头插法和尾插法 一、头插法💤思考一:头插法的核心是什么❓❗❗ 重点一:以带头结点方式实现头插法❗❗ 重点二:以不带头结点方式实现头插法 二、尾插法💤思考二:尾插法的核心是什么❓❗❗ 重点三&#xff1a…

PostgreSQL中int类型达到上限的一些处理方案

使用int类型作为表的主键在pg中是很常见的情况,但是pg中int类型的范围在-2147483648到2147483647,最大只有21亿,这个在一些大表中很容易就会达到上限。一旦达到上限,那么表中便没办法在插入数据了,这个将会是很严重的问…

k8s分布式图床(k8s,metricsapi,vue3+ts)

image-manage 图像管理应用 图像管理应用提供了一个方便管理图片的平台,支持单机和Kubernetes集群部署。请确保您至少拥有一个MySQL数据库和一个Redis数据库,以及一个至少为Kubernetes 1.29版本的集群(如果选择集群部署)。 文档…

Linux开发工具vim

目录 1. vim的基本概念2. vim的基本操作3. vim正常模式命令集1. 插入模式2. 从插入模式切换为命令模式3. 移动光标4. 删除文字5.复制6. 替换7. 撤销上一次操作8. 更改9. 跳至指定的行 4. vim末行模式命令集1. 列出行号2. 跳到文件中的某一行5. 查找字符6. 保存文件7. 离开vim 1…

Java多线程导出Excel示例

在之前的Java多线程导入Excel示例中演示了如何通过多线程的方式导入Excel,下面我们再来看下怎么通过多线程的方式导出Excel 还是直接上代码 首先是Controller import com.sakura.base.service.ExcelService; import org.springframework.beans.factory.annotation.…

【数据分享】2000~2023年MOD15A2H 061 光合有效辐射分数FPAR数据集

​各位同学们好,今天和大伙儿分享的是2000~2023年MOD15A2H 061 光合有效辐射分数FPAR数据集。如果大家有下载处理数据等方面的问题,可以评论或私信。 Myneni, R., Y. Knyazikhin, T. Park. MODIS/Terra Leaf Area Index/FPAR 8-Day L4 Global 500m SIN G…

网络工程师笔记6

ICMP协议 Internet控制报文协议ICMP(InternetControlMessage Protocol)是网络层的一个重要协议。ICMP协议用来在网络设备间传递各种差错和控制信息,它对于收集各种网络信息、诊断和排除各种网络故障具有至关重要的作用。使用基于ICMP的应用时,需要对ICMP…

live555源码学习(1)

1 基础组件 live项目主要包含了四个基础库、程序入口类(mediaServer)和测试程序(testProgs)。四个基础库是UsageEnvironment、BasicUsageEnvironment、groupsock和liveMedia UsageEnvironment 抽象了两个类UsageEnvironment和T…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的钢材表面缺陷检测系统(Python+PySide6界面+训练代码)

摘要:开发钢材表面缺陷检测系统对于保障制造质量和提高生产效率具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个钢材表面缺陷检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5&#…

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读 摘要简介方法3.1 Normal Representation3.2 Feature Refinement3.3 Training and Inference 4 实验结果5 总结 文章信息: 原文链接:https://arxiv.org/abs/2402.18293 源码…

应用层DDoS防护:理解、必要性与实现策略

一、应用层简介 应用层,也称作第七层,是OSI(开放系统互联)模型中的最高层。在这一层,数据以特定的应用程序协议格式进行传输,如HTTP、FTP、SMTP等。应用层的主要职责是为用户提供网络服务,如文…

Android Gradle开发与应用 (四) : Gradle构建与生命周期

1. 前言 前几篇文章,我们对Gradle中的基本知识,包括Gradle项目结构、Gradle Wrapper、GradleUserHome、Groovy基础语法、Groovy语法概念、Groovy闭包等知识点,这篇文章我们接着来介绍Gradle构建过程中的知识点。 2. Project : Gradle中构建…

python61-Python的循环之for-in循环遍历列表和元组

在使用 for-in 循环遍历列表和元组时,列表或元组有几个元素,for-in 循环的循环体就执行几次,针对每个元素执行一次,循环计数器会依次被赋值为元素的值,如下代码使用 for-in 循环遍历元组。 # !/usr/bin/env python# -…

C# Socket通信从入门到精通(21)——TCP发送文件与接收文件 C#代码实现

1、前言 我们在开发上位机软件的过程中经常需要发送文件,本文就是介绍如何利用tcp客户端发送文件、tcp服务器端接收文件,而且本文介绍的方法可以自动发送一个文件夹下的所有子目录以及所有文件,经验来自于实际项目,具备非常有价值的参考意义! 2、发送文件以及C#代码 被发…

基于React俄罗斯方块h5小游戏源码响应式支持PC+手机

俄罗斯方块是一款广受欢迎的经典游戏,许多编程语言都热衷于实现它。在JavaScript中,也有许多版本。 我的目标是使用React框架来实现这个游戏。 地 址 : runruncode.com/vue/19701.html 游戏的架构采用了React和Redux,为了提高性…

php源码 单色bmp图片取模工具 按任意方式取模 生成字节数组 自由编辑点阵

http://2.wjsou.com/BMP/index.html 想试试chatGPT4生成,还是要手工改 php 写一个网页界面上可以选择一张bmp图片,界面上就显示这张bmp图片, 点生成取模按钮,在图片下方会显示这张bmp图片的取模数据。 取模规则是按界面设置的&a…