学习笔记5——对象、直接内存、执行引擎,string

学习笔记系列开头惯例发布一些寻亲消息

链接:https://baobeihuijia.com/bbhj/contents/3/192486.html
在这里插入图片描述

创建对象的步骤

  • 对象对应的类是否被加载,链接(链接到真实的内存地址),初始化(类初始化)

  • 计算对象占用大小,在堆中划分内存

    • 内存规整:指针碰撞法(指针作为分界线向后移动)
    • 内存不规整:空闲列表分配(记录哪些内存是可用的)
    • 取决于java堆采用什么垃圾回收机制内存是否规整
  • 处理并发安全问题

    • 区域加锁
    • 线程预留TLAB
  • 初始化分配的空间:所有属性赋默认初始化值

  • 设置对象头

  • 对象初始化<显式初始化、代码块中初始化、构造器初始化>

对象在堆中的布局

  • 对象头

    • 运行时元数据

      • 在堆中的首地址(哈希值)
      • GC分代年龄
      • 锁状态
    • 类型指针:指向元空间的类型

  • 实例数据:各种类型的字段【先放父类的变量、相同宽度的分配在一起】

  • 对齐填充

在这里插入图片描述

在这里插入图片描述

对象访问定位

  • 句柄访问

    • 浪费空间
    • 访问效率较低
    • 优点:栈空间引用地址比较稳定,就算对象发生了变化,也只需要修改句柄指针,栈中的引用无需变化

    在这里插入图片描述

  • 直接指针

在这里插入图片描述

直接内存(元数据)

  • 读写文件,需要与磁盘交互,需要由用户态切换到内核态
    • 一般的需要经过两层

  • 除了第一种,对于一些读写比较频繁的场合,java虚拟机提供了NIO库,使得用户程序可以操作一块由操作系统划出的直接内存,不受JVM的限制和管理,元数据就是这样实现的
  • 在这里插入图片描述

在这里插入图片描述

执行引擎

  • 需要了解编译和汇编过程

    • 机器指令码:cpu直接识别执行,不同cpu对同一机器指令码的识别不同,可能对A是相加,对B就是赋值

    • 指令:指令就是将一些常用的机器指令码用符号的形式记录,比如一串二进制可以表示为add

    • 指令集:由于cpu之间对于机器指令识别的差异,所以对于不同种类cpu,都要有对应的(指令,二进制码)表,当然这是提前定义在cpu内部的

    • 汇编语言:助记符代替操作码,地址符号代替操作数的地址

    • 高级语言:高级语言一张嘴,机器指令跑断腿

  • 执行引擎的任务就是将字节码指令解释为平台上的本地机器指令,JVM执行引擎提供了三种方式

    • AOT编译器:是一种由源代码直接到机器码的方法,但是对于java 的动态特性并不友好,所以是一种牺牲质量换取性能的策略,如动态类加载无法实现
    • 解释器(字节码->机器码)
      • 将字节码翻译为机器码,可以很快启动
    • JIT编译器(java的即时编译技术just in time,相比于AOT,JIT是在程序运行过程中进行转换)(分为两类)
      • 寻找热点代码,对于这些频繁被调用的热点代码进行深度优化,然后将字节码编译为机器码后再启动,编译需要花费点时间,如果优化失败则还是采用翻译器
      • 热点代码探测:这里的热点代码指的是一段时间内被调用频率很高的代码,而不是从执行开始单纯的次数最多的代码(有衰减机制)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • JIT编译器:将字节码转化为本地机器码(启动慢过程很快)

    • c1编译模式:进行简单、可靠的优化耗时短,编译快,如有必要将加入性能监控的逻辑
    • c2编译模式:会启用一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化。
    • 在这里插入图片描述
  • 为什么java需要编译器和翻译器合并?

    在这里插入图片描述

String Table

  • 为什么要移动到堆中:想跟随堆中的其他对象一起进行垃圾回收,避免字符串常量越来越多导致内存溢出(原来常量池位于永久代,永久代只有full gc才会清理比较慢,移出来是为了让字符串常量池得到更加频繁的清理)
  • 拼接
    • 常量拼接直接字节码编译优化生成结果,存在常量池(“javaee”),常量池中没有重复的元素,可以通过不同的变量名来索引相同的地址
    • 只要带一个变量,则拼接原理为stringbuilder对象append,结果放入堆中 / 如果是final string拼接那么还是按照常量拼接来
      • 如果没有显式操作,还是使用+,那么就是每次+都会创建builder对象和string对象,以stringbuilder的方式拼接
      • 显式调用stringbuilder.append后,只会调用一个builder的append,而且不会和常量池发生关系
    • 拼接结果调用intern方法,如果该字符串不存在就会将当前字符串放入常量池,返回结果的指向必须为常量池中的字符串实例,该方法确保字符串在内存中只有一份拷贝(intern就是让当前对象的值在池中也存一份,如果已经有了那就算了,还是指着对象,没有的话就存一份指向池中)

在这里插入图片描述

  • 池中的string pool是一个固定大小的hashtable,不会存储相同内容的字符串的
  • 显式的+两个双引号,或者tostring之后就会存储到常量池中,如果是对象或者存在一个变量的的话,采用的是stringbuilder进行的,所以不会存到常量池
  • StringBuffer的toString方法会调用new String, 在堆中新建对象

String的intern()方法在不同JDK版本的区别-CSDN博客
在这里插入图片描述

java 面试题: new String() 会创建几个对象?_new string(“a”) + new string(“b”) 会创建几个对象?-CSDN博客

在这里插入图片描述

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

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

相关文章

Linux常见命令手册

目录 文件命令 文件和目录命令 文件的权限命令 文件搜索命令 进程命令 查看进程命令 关闭进程命令 用户和群组命令 网络命令 firewall-cmd 网络应用命令 高级网络命令 网络测试命令 网络安全命令 网络配置命令 软件管理命令 系统信息命令 vi编辑器 关机命令…

【android】install android NDK

目录 1 下载NDK 2 解压 3 android-ndk的配置 1 下载NDK 下载网址&#xff1a;NDK 下载 | Android NDK | Android Developers 如果没有所需要的版本&#xff0c;则点击页面下面 不受支持的 NDK 下载需要的版本。 2 解压 将压缩文件&#xff08;例如 android-ndk-r25c-…

webpack 中,filename 和 chunkFilename 的区别

filename filename 是一个很常见的配置&#xff0c;就是对应于 entry 里面的输入文件&#xff0c;经过webpack打包后输出文件的文件名。比如说经过下面的配置&#xff0c;生成出来的文件名为 index.min.js。 chunkFilename chunkFilename 指未被列在 entry 中&#xff0c;却…

使用 Splashtop 的开放 API 简化 IT 工作流程

我们的工作方式在不断变化&#xff0c;IT 技术人员必须迅速适应时代的变化。越来越多的公司正在转向混合和远程策略&#xff0c;这为那些在服务台或IT技术人员工作的人增加了额外的工作层。对于系统管理员来说&#xff0c;管理一切都可能变得更加复杂。 找到合适的软件来管理多…

Stable Diffusion - StableDiffusion WebUI 软件升级与扩展兼容

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134463035 目前&#xff0c;StableDiffusion WebUI 的版本是 1.6.0&#xff0c;同步更新 controlnet、tagcomplete、roop、easy-prompt-selector等…

JDY蓝牙注意事项

波特率设置&#xff1a;9600&#xff0c;不接受115200&#xff0c;或者38400. 不同于WiFi测试&#xff0c;jdy蓝牙不接受AT"指令&#xff0c;可以使用“ATVERSION"指令测试 安信可公司的那个蓝牙指令在这里没有用&#xff0c;不知道是不是生产的公司不一样

9 Redis的发布和订阅

127.0.0.1:6379> publish topic1 jack (integer) 0 #表示此时没有被订阅&#xff0c;消息丢了发布订阅&#xff1a;发送即忘的原则&#xff0c;发了就不管了&#xff0c;没有人订阅&#xff0c;就丢了。 127.0.0.1:6379> subscribe topic1 Reading message ... #表示开…

【LeetCode】每日一题 2023_11_20 最大子数组和(dp)

文章目录 刷题前唠嗑题目&#xff1a;最大子数组和题目描述代码与解题思路 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 今天是一道 LeetCode 的经典题目&#xff0c;如果是 LeetCode 老手&#xff0c;估计都刷过&#xff0c;话是这么说&#xff0c;但咱…

Python 自动化(十八)admin后台管理

admin后台管理 什么是admin后台管理 django提供了比较完善的后台数据库的接口&#xff0c;可供开发过程中调用和测试使用 django会搜集所有已注册的模型类&#xff0c;为这些模型类提供数据管理界面&#xff0c;供开发使用 admin配置步骤 创建后台管理账号 该账号为管理后…

简单回顾矩阵的相乘(点乘)230101

[[1 0 1][1 1 0]] [[3 0 0 3][2 2 1 3][1 3 1 1]] [[4. 3. 1. 4.][5. 2. 1. 6.]]乘以 c11 a11*b11 a12*b21 a13*b31 1*3 0*2 1*1 4 c12 a11*b12 a12*b22 a13*b32 1*0 0*2 1*3 3 c13a11*b13 a12*b23a13*b33 c14a11*b14 a12*b24a13*b34 c21a21*b11 a22*b21 a23*b…

《QT从基础到进阶·三十五》QT插件实现侧边工具栏tabBar

tabBar是用QT插件实现的一个dll&#xff0c;对于插件的使用可以参考文章&#xff1a; 《QT从基础到进阶三十三》QT插件开发QtPlugin 源码放在文章末尾 该功能类似侧边工具栏&#xff0c;可以在该标签栏上添加自己开发的界面&#xff0c;实现代码如下&#xff1a; 1、所有功能…

Tomcat无法映射到activiti-app导致activiti无法启动页面

原因之一&#xff1a;JDK版本与Tomcat版本不匹配&#xff0c;jdk8 yyds 我使用的是JDK11&#xff0c;Tomcat是9.0的&#xff0c;都是最新的&#xff0c;但还是不行&#xff0c;最后JDK改为8&#xff0c;tomcat的cmd后台没有报错&#xff0c;activiti-pp也可以正常访问了,很神奇…

Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)

目录 一 输入设备编程介绍 1.1 什么是输入设备呢&#xff1f; 1.2 什么是输入设备的应用编程&#xff1f; 1.3 input子系统 1.4 数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件&#xff1a; 1.5.2 相对位移事件 1.5.3 绝对位移事件 二 读取 struct input_e…

ATFX汇市:欧元区10月CPI年率终值不变,EURUSD逼近1.1000心理关口

ATFX汇市&#xff1a;据欧盟统计局11月17日发布的数据&#xff0c;欧元区10月名义CPI年率终值2.9%&#xff0c;与10月末公布的初值持平。欧央行对通胀率的长期调控目标为2%左右&#xff0c;10月份名义CPI年率已经非常接近目标范围&#xff0c;欧央行继续加息的紧迫性降低。10月…

【AI视野·今日Robot 机器人论文速览 第六十二期】Wed, 25 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 25 Oct 2023 Totally 25 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers EquivAct: SIM(3)-Equivariant Visuomotor Policies beyond Rigid Object Manipulation Authors Jingyun Yang, Congyue Deng,…

Java的IO流-转换流

乱码问题 package com.itheima.d2;import java.io.*; import java.nio.charset.StandardCharsets;public class Test4 {public static void main(String[] args) {try (//1、创建一个文件字符输入流与源文件接通//Reader fr new FileReader("IO\\src\\itheima04.txt"…

Git企业开发级讲解(四)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、理解分⽀二、创建分支三、切换分⽀四、合并分⽀五、删除分⽀六、合并冲突七、分⽀管理策略…

三、机器学习基础知识:Python常用机器学习库(图像处理相关库)

文章目录 1、OpenCV1.1 窗口操作函数1.2 图像处理1.3 图像捕获与人脸检测 2、PIL2.1 主要函数2.2 表情图像合成2.3 手写数字转换2.4 滤波查找图像边缘 1、OpenCV OpenCV Python是一个用于解决计算机视觉问题的Python库&#xff0c;是用基于C实现的OpenCV构成的Python包。OpenC…

UE基础篇十:材质

导语: 视频文档在文末 虚幻引擎默认是延迟渲染(延迟渲染是通过先算出需要着色的像素,然后再迭代灯光,从而减少大量无效的灯光计算,来达到优化的目的) 一、基础知识 1.1 贴图分辨率尺寸 2的幂次方,长宽随意组合 非2的幂次方,不能设置MipMaps(引擎会生成多张分辨率更…

搜维尔科技:业内普遍选择Varjo头显作为医疗VR/AR/XR解决方案

Varjo 的人眼分辨率混合现实和虚拟现实头显将医疗专业人员的注意力和情感投入提升到更高水平。借助逼真的 XR/VR&#xff0c;医疗和保健人员可以为最具挑战性的现实场景做好准备&#xff01; 在虚拟、增强和混合现实中进行最高水平的训练和表现 以逼真的 3D 方式可视化医疗数据…