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

学习笔记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博客

在这里插入图片描述

相关文章:

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

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/192486.html 创建对象的步骤 对象对应的类是否被加载&#xff0c;链接&#xff08;链接到真实的内存地址&#xff09;&#xff0c;初始化&#xff08;类初始化&#xff09;…...

【node】如何在打包前进行请求等操作npm run build

举例&#xff0c;在运行 npm run build 之前将路由表传递给后端&#xff0c;可以采取以下步骤&#xff1a; 创建一个脚本文件&#xff0c;例如 generateRoutes.js&#xff0c;用于生成路由表文件。 在该脚本文件中&#xff0c;导入路由配置文件和后端要接收路由表的接口。 使…...

鸿蒙4.0真机调试踩坑

传言鸿蒙next版本将不再兼容Android&#xff0c;所以领导安排做下鸿蒙开发的调研工作。 鸿蒙开发指南其实已经非常的友好了。但是鸿蒙开发本身还是有些坑要踩&#xff0c;这篇文章主要讲了鸿蒙真机调试问题。 目前手上的真机为华为 nova6&#xff0c;处理器为麒麟990.鸿蒙系统…...

中文撰稿好用软件推荐TexPage(似于Overleaf)

由于本人用惯了overleaf所以找到了一个与他功相似的也同样是利用tex写文章。唯一的区别可能也就是overleaf只支持英文&#xff0c;而TexPage中英文都支持。关键是不花钱&#xff0c;好用好用好用&#xff0c;用起来&#xff01; 平台网址&#xff1a;https://www.texpage.com/…...

AD教程 (十七)3D模型的创建和导入

AD教程 &#xff08;十七&#xff09;3D模型的创建和导入 对于设计者来讲&#xff0c;现在3DPCB比较流行&#xff0c;3DPCB&#xff0c;除了美观之外&#xff0c;做3D的最终的一个目的&#xff0c;是为了去核对结构&#xff0c;就是我们去做了这么一个PCB之后&#xff0c;如果说…...

企业微信获取第三方应用凭证

上一篇介绍了如何配置通用开发参数及通过url回调验证&#xff0c; 本篇将通过服务商后台配置关联小程序应用配置和获取第三方凭证及如何配置企业可信IP。 当然上篇配置的回调设置也不会白费&#xff0c;在下方的指令和数据回调会用到。 第三方应用开发流程 官方企业微信第三方…...

增删改查mysql

查询 -- 查询表结果-- 查看 当前数据库下的表show tables;-- 查看指定的表desc tb_emp; -- td_emp 是表名-- 查看 数据库的见表语句show create table tb_emp; 修改 -- 修改表结构 -- 修改 为表 tb_emp 添加字段 qq varchar(11) alter table tb_emp add qq varchar(11) …...

【vue】下载导出excel

下载导出excel 首先使用的tdesign框架&#xff0c;要导出后端返回的数据流excel 遇见的问题 下载的文件&#xff0c;里边的内容是undefined 观察报错 一看就知道并不是后端的报错&#xff0c;后端不可能是undefined 在强烈的好奇心驱动下&#xff0c;看了下接口&#xff0…...

c#正则表达式

using System.Text.RegularExpressions; namespace demo1 {/// <summary>/// 正则表达式&#xff08;Regular Expression&#xff09;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a&#xff5e;z的字母&#xff09;和特殊字符&#xff08;称为“…...

C#密封类和密封成员

密封类和密封成员需要使用 sealed 修饰符&#xff0c;他可以防止当前类被继承或者防止派生类在继承的过程中重写某个方法。 与abstract抽象修饰符类似&#xff0c;sealed 修饰符不仅可用来修饰class&#xff0c;同样也可以修饰类成员。如果sealed关键词用在class上&#xff0c…...

三、Eureka注册中心

目录 一、作用及调用方式 二、搭建eureka注册中心 三、注册user-service和order-service 四、新增实例 五、服务拉取 六、总结 一、作用及调用方式 在服务提供者启动时&#xff0c;它会向eureka注册中心提供自己的信息&#xff0c;并每30秒进行一次刷新eureka注册中心保存…...

java线程池动态调节功能实现

java线程池动态调节功能实现 功能背景ThreadPoolExecutor配置自定义可变容LinkedBlockingQueuecontroller接口测试结果 功能背景 由于线程池的参数配置是一个比较难准确配置好, 如果需要进行配置修改, 就会对配置进行修改,再进行部署,影响效率, 或者应用场景的变化,导致固定的…...

KT148A语音芯片使用串口uart本控制的完整说明_包含硬件和指令举例

一、功能简介 KT148A肯定是支持串口的&#xff0c;有客户反馈使用一线还是不方便&#xff0c;比如一些大型的系统不适合有延时的操作&#xff0c;所以更加倾向于使用uart控制&#xff0c;这里我们也给出解决方案 延伸出来另外一个版本&#xff0c;KT158A 注意次版本芯片还是…...

kubectl 本地远程链接k8s多个集群,远程管控多集群,查看日志 部署服务(windows版)

文章目录 一、前言二、windows上安装kubectl和mobaxterm2.1 准备安装包2.2 安装kubectl2.3 链接k8s集群2.4 查看某一个pod的容器日志2.5 切换context 上下文配置&#xff0c;实现在多个k8s集群间动态切换 一、前言 现如今是一个万物皆上云 的时代&#xff0c;各种云层出不穷&am…...

wireshark打开tcpdump抓的包 vwr: Invalid data length runs past the end of the record

tcpdump -i any -n -s0 > t.pcap 使用此命令在Debian系统上抓包&#xff0c;下载到PC&#xff0c;用wireshark打开时报错&#xff1a; 后来发现写入文件时使用 -w 是没问题的&#xff0c;原因还不清楚。 tcpdump -i any -n -s0 -w t.pcap...

Python爬虫教程:从入门到实战

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python爬虫教程&#xff1a;从入门到实战&#xff0c;文章3800字&#xff0c;阅读大约15分钟&#xff0c;大家enjoy~~ 网络上的信息浩如烟海&#xff0c;而爬虫&#xff08;…...

C++实现高频设计模式

面试能说出这几种常用的设计模式即可 1.策略模式 1.1 业务场景 大数据系统把文件推送过来&#xff0c;根据不同类型采取不同的解析方式。多数的小伙伴就会写出以下的代码&#xff1a; if(type"A"){//按照A格式解析 }else if(type"B"){//按照B格式解析 …...

opencv(2): 视频采集和录制

视频采集 相关API VideoCapture()cap.read()&#xff1a; 返回两个值&#xff0c;第一个参数&#xff0c;如果读到frame&#xff0c;返回 True. 第二个参数为相应的图像帧。cap.release() VideoCapture cv2.VideoCapture(0) 0 表示自动检测&#xff0c;如果在笔记本上运行&…...

SpringBoot+EasyExcel设置excel样式

方式一&#xff1a;使用注解方式设置样式 模板可通过HeadFontStyle、HeadStyle、ContentFontStyle、ContentStyle、HeadRowHeight ContentRowHeight等注解设置excel单元格样式&#xff1b; //字体样式及字体大小 HeadFontStyle(fontName "宋体",fontHeightInPoints…...

自定义View之Measure(二)

measure 用来测量 View 的宽和高&#xff0c;它的流程分为 View 的 measure 流程和 ViewGroup 的measure流程&#xff0c;只不过ViewGroup的measure流程除了要完成自己的测量&#xff0c;还要遍历地调用子元素的measure&#xff08;&#xff09;方法。 上一回说到performMeasur…...

SQL注入学习--GTFHub(布尔盲注+时间盲注+MySQL结构)

目录 布尔盲注 手工注入 笔记 Boolean注入 # 使用脚本注入 sqlmap注入 使用Burpsuite进行半自动注入 时间盲注 手工注入 使用脚本注入 sqlmap注入 使用Burpsuite进行半自动注入 MySQL结构 手工注入 sqlmap注入 笔记 union 联合注入&#xff0c;手工注入的一般步骤 …...

Kubernetes学习-概念2

参考&#xff1a;关于 cgroup v2 | Kubernetes 关于 cgroup v2 在 Linux 上&#xff0c;控制组约束分配给进程的资源。 kubelet 和底层容器运行时都需要对接 cgroup 来强制执行为 Pod 和容器管理资源&#xff0c; 这包括为容器化工作负载配置 CPU/内存请求和限制。 Linux 中…...

StyleGAN:彻底改变生成对抗网络的艺术

一、介绍 多年来&#xff0c;人工智能领域取得了显着的进步&#xff0c;其中最令人兴奋的领域之一是生成模型的发展。这些模型旨在生成与人类创作没有区别的内容&#xff0c;例如图像和文本。其中&#xff0c;StyleGAN&#xff08;即风格生成对抗网络&#xff09;因其创建高度逼…...

黑马程序员微服务第四天课程 分布式搜索引擎1

分布式搜索引擎01 – elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; …...

向量以及矩阵

0.前言 好了那我们新的征程也即将开始&#xff0c;那么在此呢我也先啰嗦两句&#xff0c;本篇文章介绍数学基础的部分&#xff0c;因为个人精力有限我不可能没一字一句都讲得非常清楚明白&#xff0c;像矩阵乘法之类的一些基础知识我都是默认你会了&#xff08;还不会的同学推…...

9.程序的机器级代码表示,CISC和RISC

目录 一. x86汇遍语言基础&#xff08;Intel格式&#xff09; 二. AT&T格式汇编语言 三. 程序的机器级代码表示 &#xff08;1&#xff09;选择语句 &#xff08;2&#xff09;循环语句 &#xff08;3&#xff09;函数调用 1.函数调用命令 2.栈帧及其访问 3.栈帧的…...

《硅基物语.AI写作高手:从零开始用ChatGPT学会写作》《从零开始读懂相对论》

文章目录 《硅基物语.AI写作高手&#xff1a;从零开始用ChatGPT学会写作》内容简介核心精华使用ChatGPT可以高效搞定写作的好处如下 《从零开始读懂相对论》内容简介关键点书摘最后 《硅基物语.AI写作高手&#xff1a;从零开始用ChatGPT学会写作》 内容简介 本书从写作与ChatG…...

【2016年数据结构真题】

已知由n&#xff08;M>2&#xff09;个正整数构成的集合A{a<k<n},将其划分为两个不相交的子集A1 和A2&#xff0c;元素个数分别是n1和n2&#xff0c;A1和A2中的元素之和分别为S1和S2。设计一个尽可能高效的划分算法&#xff0c;满足|n1-n2|最小且|s1-s2|最大。要求…...

创作者等级终于升到4级了

写了两个月的文章&#xff0c;终于等到4级了。发文纪念一下&#xff1a;...

Games104现代游戏引擎笔记 面向数据编程与任务系统

Basics of Parallel Programming 并行编程的基础 核达到了上限&#xff0c;无法越做越快&#xff0c;只能通过更多的核来解决问题 Process 进程 有独立的存储单元&#xff0c;系统去管理&#xff0c;需要通过特殊机制去交换信息 Thread 线程 在进程之内&#xff0c;共享了内存…...