JVM的深入理解

1、JVM(Java虚拟机):我们java编译时候,下通过把avac把.java文件转换成.class文件(字节码文件),之后我们通过jvm把字节码文件转换成对应的cpu能识别的机器指令(翻译官角色),我们发布一个Java程序,我们只需要发布.class文件即可,不同平台上的jvm是有差异的,对java提供的内容是一致的,但是对不同的操作系统来说是可能不一致的

一、JVM中的内存区域划分

1、jvm其实也是一个进程(任务管理器中看到的java进程),进程运行过程中要从操作系统这里申请一些资源(内存就是其中典型的资源),JVM从系统中申请了一大块内存,这一大块内存给Java程序使用的时候,又根据实际的使用用途划分出不同的空间

(1)堆:代码中new出来的对象,都是在堆里,对象中持有的非静态成员变量,也就是在堆里

(2)栈:本地方法栈(jvm内部的调用关系和局部变量)/虚拟机栈(java代码的调用关系和局部变量)包含了方法的调用关系和局部变量(一般不会关注本地方法栈,默认只得是虚拟机栈)此处中的堆和栈和数据结构中的堆和栈是不一样的

(3)程序计数器:这个区域比较小的空间,专门用来存储下一条要执行的java指令地址

(4)元数据区(以前叫方法区):往往只的是一些辅助性质的,描述性质的属性(例如:文件大小,文件的位置等,这些信息成为元数据)最主要的是保存类的信息,方法的信息,一个程序有哪些类,每个类里有哪些方法,每个方法里面要包含哪些指令,我们写的Java代码if,while,for各种逻辑运算都会被转换成字节码,最后将这些字节码存储到元数据区中,接下来就会按照上述元数据区里记录的字节码依次执行了,带有static变量的就是在类对象中,就存储在元数据区中

(5)堆只有一份,元数据区只有一份,栈和程序计数器可能由N份(每个线程都有自己的栈和程序计数器)

2、JVM的类加载机制

1、类加载指的是Java进程运行的时候,需要把.class文件从硬盘读到内存,并进行一系列的校验和解析的过程(从.class文件到类对象,从硬盘到内存)类加载分5步

(1)加载:把硬盘上的.class文件找到打开文件,读取到文件内容(认为读到的是二进制数据)

(2)验证:确保读到的文件内容是合法的.class文件(字节码文件)格式

(3)准备:给类对象申请内存空间(空间内什么都没有,是默认值全是零)

(4)解析:主要是针对类中的字符串常量进行处理,字符引用转换成直接引用:比如要存储字符串s=“hello”

因为文件中不存在地址这样的概念,地址是内存的地址但是我们这里是硬盘,所以我们需要用偏移量(这就叫符号引用)来找到文件中的hello,之后我们转换到内存上是此时就有地址(直接引用)了就不需要再用偏移量了

(5)初始化:针对类对象完成后续的初始化(还需要执行讲台代码的逻辑,还可能出发父类的加载)

3、双亲委派模型(描述了如何查找.class文件的策略)

1、JVM中进行类加载操作,是有一个专门的模块,称为“类加载器”,类加载器的作用,给他一个全限定类名,java.lang.String给定全限定类名之后找到对应的.class文件,下面是三类加载器,实际上类加载器只是一个父亲,也可以叫单亲

如果最后ApplicationClassLoader没有找到,因为ApplicationClassLoader没有孩子最后就会抛出ClassNotFoundException异常

(1)这样的操作也避免了我们自己写了类与标准类名重复,导致标准库类的功能失效

(2)我们也可以自己写类加载器,此时就不会涉及到双亲委派了

4、垃圾回收机制(GC)(避免内存泄漏问题)

(1)垃圾回收中有一个很重要的问题:STW问题,出发垃圾回收的时候,很可能会是当前程序和其他业务暂停,JAVA现在已经可以把STW的时间控制在1ms之内,影响就很小了

(2)垃圾回收是回收内存,程序计数器和栈不需要GC他们可以自行释放内存,元数据区一般不需要GC一般涉及到类加载,很少涉及到类卸载,堆是主要的GC区域(主要的就是回收对象)

4.1、垃圾回收我们要分两部展开:

(1)识别出垃圾(1.1-1.4)

(2)把标记为垃圾的对象的内存空间进行释放(2.1-)

识别出垃圾:

(1.1)在Java中,适用对象都需要通过引用的方式来使用(匿名对象是例外)

如果一个对象没有任何引用指向他,就是为无法被代码使用,就可以作为垃圾了

简单情况:

(1.2)

当我们局部变量t执行完,也就没有引用指向new Test()了此时new Test()就被认定成垃圾了

较复杂的情况(1.3)(1.4):

(1.3)引用计数:这种思想方法,并没有在JVM中使用,但是他的思想我们需要了解(给对象安排一个额外的空间,空间里要保存当前这个对象有多少个引用)

垃圾回收的时候,如果发现他的引用计数器为0了就定义为垃圾

引用计数器存在两个关键问题:

1)消耗额外的内存空间

2)引用计数可能产生循环引用问题,此时引用计数就无法工作了,这个问题就是可能会两个对象在内部分别对对方进行引用,导致计数器一直不为零

(1.4)可达性分析:本质上使用时间换空间,相比于引用计数,需要消耗额外的时间,是可控的,不会长生循环引用的问题,例如二叉树那样遍历访问,访问不到的就是垃圾

(2.1)把标记为垃圾的对象进行内存空间的释放

(2.2)标记-清除

(2.3)复制算法

将左边不是垃圾的对象复制到内存的另一边(内存碎片问题没了,但是使用的空间小了,而且如果数据很多复制两会很大,会增加很多开销)

(2.4)标记-整理,也能解决内存碎片问题

将后面的元素往前移将释放的垃圾覆盖掉,能解决内存碎片问题,但是移动复制成本依然很大

(2.5)分代回收(取长补短,非常好的回收方式,现在应用的 )

引入对象的年龄,JVM中有专门负责周期想扫面的线程,一个对象扫描一次,能扫描到就不是垃圾,年龄加1,不能扫描到就直接释放掉

第一轮扫描在伊甸区会有很多对象被消灭掉,剩下的线程年龄加1,转移到生存区,第二轮扫描伊甸区和上一轮一样,生存区左边扫描去掉大部分剩下的年龄加1转移到生存区的右边,如果经过若干轮的对象仍然健在,之后我们就转移到老年区,老年区不是不扫描,老年区的扫描频率会降低很多,如果扫描到为引用的对象直接也消灭掉掉

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

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

相关文章

【小沐学QT】QT学习之信号槽使用

文章目录 1、简介2、代码实现2.1 界面菜单“转到槽”方法2.2 界面信号槽编辑器方法2.3 QT4.0的绑定方法2.4 QT5.0之后的绑定方法2.5 C11的方法2.6 lamda表达式方法 结语 1、简介 在GUI编程中,当我们更改一个小部件时,我们通常希望通知另一个小程序。更普…

JavaScript的书写方式

JavaScript的书写方式 目前较为流行的是第二种和第三种,第一种很少见。在第二种和第三种推荐使用第三种,因为在日常开发/工作中,第三种是最为常见的 1.行内式 把JS代码嵌入到html元素内部 示例代码 运行效果 由于JS中字符串常量可以使用单引…

搜维尔科技:CATIA为建筑、基础设施和城市规划提供虚拟孪生力量

超越传统项目交付方法限制的协作 复杂建筑和基础设施项目开发的设计和工程流程需要多个利益相关者和所有项目阶段的密切合作。此外,日益复杂的施工项目要求所有团队都依赖 CATIA 和3D EXPERIENCE 虚拟孪生技术作为“通用语言”,以促进协作并减少阶段之间…

K8S(kubernetes) 部署运用方式汇总

k8s 部署运用这边汇总两类,第一种是命令版本。第二种是文本版本,通过创建yaml文件方式。 此次目标:通过k8s创建nginx,端口80并且可以被外网访问。 kubectl get namespaces 一、创建命名空间 首先创建一个命名空间,有了命名空间后…

paimon表读优化-Read-optimized Table

目录 概述实践文档测试 结束 概述 paimon 版本 : 0.7 测试目标: 类似 hudi ro 表 实践 文档 Read-optimized Table 测试 0: jdbc:hive2://10.32.36.142:10009/> select * from trace_log_refdes_hive_ro$ro limit 10;24/02/28 14:24:33 INFO ExecuteStatement: Execu…

获取tensorflow lite模型指定中间层的输出

以mobilenet v2为例子,我已经训练好了模型,有tflite格式和onnx格式两种模型的权重文件,我想获取tflite模型在推理阶段neck部分的输出。 查看onnx模型得到neck最后一层位置 使用netron查看onnx模型结构 从name中能知道Reshape是neck的最后一…

微信小程序固定头部-CSS实现

效果图 代码逻辑:设置头部的高度,浮动固定后,再加个这个高度的大小的外边距 .weui-navigation-bar {position: fixed;top: 0px;left: 0px;right: 0px;height:90px; } .weui-navigation-bar_bottom{height:90px; }

SpringCloud 基本概念

开篇 学习springcloud的前提我已经认为你已经具备: 微服务的基本概念具备springboot的基本用法 eurake server:注册中心,对标zookeeper eurake client:服务,对标dubbo ribbon:负载均衡,对标nginx feign:与ribbon类似,目前项目没有使用,暂时就不写 hystrix:断路…

双指令集成一体控制比例放大器

双指令独立输入比例放大器是一种能够接收两个独立指令输入来控制两个比例电磁铁的比例阀放大器。 该类放大器可以同时控制两个单电磁铁比例阀,每一组都可以根据不同的指令输入进行独立操作。 它通常兼容多种类型的指令输入,如0-10V、0-5V以及4-20mA等&…

docker版本 jenkins配置gitlab自动部署

前端项目 Build steps pwd npm config set registry https://registry.npm.taobao.org npm -v node -v #npm install npm run build:prod tar -czvf QASystem.tar.gz distpwd cd /data/zhouxy37/vue_deploy tar -zxvf QASystem.tar.gz sudo mv dist QASystem cp -r QASyste…

机器人内部传感器阅读梳理及心得-速度传感器-模拟式速度传感器

速度传感器是机器人内部传感器之一,是闭环控制系统中不可缺少的重要组成部分,它用来测量机器人关节的运动速度。可以进行速度测量的传感器很多,如进行位置测量的传感器大多可同时获得速度的信息。但是应用最广泛、能直接得到代表转速的电压且…

fastjson序列化MessageExt对象问题(1.2.78之前版本)

前言 无论是kafka&#xff0c;还是RocketMq&#xff0c;消费者方法参数中的MessageExt对象不能被 fastjson默认的方式序列化。 一、查看代码 Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,ConsumeConcurrentlyContext context) {t…

江科大stm32学习笔记——【4-1】OLED

一.原理 1.调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息。 显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上。 Keil调试模式&#xff1a;借助Keil软件的调…

resilience4j 2.0.0版本使用要求最低JDK17(使用踩坑记录)

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

六自由度Stewart平台的matlab模拟与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1运动学原理 4.2 Stewart平台运动学方程 5.完整工程文件 1.课题概述 六自由度Stewart平台的matlab模拟与仿真&#xff0c;模拟六自由度Stewart平台的动态变化情况以及伺服角度。 2.系统仿真结果 3.核…

v-rep--websocket接口

websocket是什么 V-REP 中的 Web Socket 是一种用于在 V-REP 和外部应用程序之间进行通信的协议和技术。Web Socket 基于 TCP 连接&#xff0c;可以提供双向、实时的数据传输&#xff0c;适用于互动性或实时交互性应用。 (比如v-rep在云服务器上运行&#xff0c;通过websocke…

【国产MCU】-CH32V307-定时器同步模式

定时器同步模式 文章目录 定时器同步模式1、定时器同步模式介绍2、驱动API介绍3、定时器同步模式实例1、定时器同步模式介绍 CH32V307的定时器能够输出时钟脉冲(TRGO),也能接收其他定时器的输入(ITRx)。不同的定时器的ITRx的来源(别的定时器的TRGO)是不一样的。 通用定…

Covalent Network的长期数据可用性 获得了众多加密 KOL的肯定及支持

随着 Web3 生态系统的动态发展&#xff0c;Covalent Network&#xff08;CQT&#xff09;的关键性正在显现&#xff0c;通过提供分布式、加密安全的数据层&#xff0c;以解决长期数据可用性的问题。Covalent Network&#xff08;CQT&#xff09;不仅仅是一个工具&#xff0c;更…

企业内部文件资料如何进行加密 ——防止泄露?

企业内部文件资料的加密是防止数据泄露的关键措施之一。 www.weaem.com 以下是一些建议&#xff0c;用于在企业内部进行文件资料的加密&#xff0c;以防止数据泄露&#xff1a; 选择适合的加密技术&#xff1a; 透明加密&#xff1a;这种加密方式允许用户在不改变原有操作习惯的…

简单网站模板1(HTML)

想要拥有自己的网站&#xff0c;却不知该如何才能简约好看&#xff0c;接下来分享一种自己搭建的网站模板&#xff0c;希望大家喜欢。 展示图&#xff1a; CODE: <!DOCTYPE html> <html> <head><title>我的网站</title><style>body {fo…