JVM(Java虚拟机)

news2024/11/24 6:53:13

目录

1.JVM 简介

2. JVM 运行时数据区

2.1程序计数器

2.栈

3.堆

4.方法区

3.类加载

1.loading

2.linking

1.验证

2.准备

3.解析

3.Initializing

4.双亲委派模型

5.JVM垃圾回收机制

1.劣势

2.回收什么

3.垃圾回收具体怎么回收

1.找垃圾

方法:

问题:

2.释放垃圾


1.JVM 简介

JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。

2. JVM 运行时数据区

2.1程序计数器

每个线程都有一个

1.作用:记录当前线程执行的行数(相当于一个书签)

内存中最小的区域,保存下一条要执行的指令的地址在哪里.

程序要运行,JVM要把字节码加载起来,放在内存中,程序就会一条一条把指令从内存中放到CPU内存上执行,就要记住当前执行的是哪一条了

2.栈

1.存储内容:局部变量和方法调用信息

一个进程只有一份

方法调用的时候,每次调用一个新的方法,就涉及到"入栈"操作,每次执行完方法,就涉及到"出栈"操作

栈空间很小,如果递归条件没有写好,可能会出现栈溢出

3.堆

一个进程有一份,多个线程共用一个堆

1.内存中空间最大的区域

2.存储内容:new的对象,对象的成员变量(不包含静态变量)

4.方法区

1.存储内容:类对象(包含静态成员)

.java->.class(二进制字节码).class会被加载到内存中,被JVM构造成类对象

3.类加载

把.class文件,加载到内存中,构成类对象

1.loading

找到对应的.class文件,打开并读取.class文件,同时初步生成一个类对象

2.linking

建立多个实体直接的联系

1.验证

验证读到的内容是不是和规范中规定的格式,完全匹配

如果读到的数据格式不符合规范,就会;类加载,并抛出异常

2.准备

为类中的变量(静态变量)分配内存并设置类变量初始值

3.解析

java虚拟机把常量池中的符号引用替换成直接引用的过程,是初始化常量的过程

.class文件的结构体中初识情况下是记录了编号,根据编号找到对应内容,填充到类对象中

3.Initializing

真正对类对象进行初始化,尤其是针对静态成员

4.双亲委派模型

JVN中类加载器,根据类的全限定名找到.class文件的过程

默认的类加载器,主要是3个~~

1.BootStrapClassLoader负责加载标准库中的类(String, ArrayList, Random, Scanner.....)

2.ExtensionClassLoader负责加载JDK扩展的类.

3.ApplicationClassLoader 负责加载当前项目目录中的类

双亲委派模型:描述了找目录的过程,就是上述类加载器是如何配合的

1)考虑加载 java.lang.String

1>程序启动,进入AppliactionClassLoader类加载器

2>ApplicationClassLoader就会检查下,它的父加载器是否已经加载过了.如果没有,就调用父类加载器ExtensionClassLoader

3>ExtensionClassLoader也会检查下,它的父加载器是否加载过了.如果没有,就调用父类加载器BootStrapClassLoader

4>BootStrapClassLoader也会检查下,它的父加载器是否加载过,自己没有父亲,于是自己扫描自己负责的目录

5>java.lang.String这个类在标准库中能找到!!!直接由BootStrapClassLoader负责后续的加载过程.查找环节就结束了

 

2)考虑加载自己写的Test类

1>程序启动,进入AppliactionClassLoader类加载器

2>ApplicationClassLoader就会检查下,它的父加载器是否已经加载过了.如果没有,就调用父类加载器ExtensionClassLoader

3>ExtensionClassLoader也会检查下,它的父加载器是否加载过了.如果没有,就调用父类加载器BootStrapClassLoader

4>BootStrapClassLoader也会检查下,它的父加载器是否加载过,自己没有父亲,于是自己扫描自己负责的目录,没扫描到!回到子加载器继续扫描

5>ExtensionClassLoader也扫描自己负责的目录,也没扫描到,回到子加载器继续扫描.

6>ApplicationClassLoader也扫描自己负责的目录,能找到Test类,于是进行后续加载.查找目录的环节结束.

如果最终ApplicationClassLoader 也找不到,就会抛出 ClassNotFoundException 异常!!

 

5.JVM垃圾回收机制

1.劣势

1.影响额外的开销

2.影响程序的流畅运行

2.回收什么

1.程序计数器

固定大小,不涉及到释放,不需要GC

2.栈

函数执行完毕,对应的栈帧就自动释放

3.堆

最需要GC的,代码中大量的内存都在堆上

4.方法区

进行"类加载要释放内存,卸载操作很低频的操作

只释放完全不使用的

回收的基本单位是对象不是字节

3.垃圾回收具体怎么回收

1.找垃圾

方法:

1.基于引用计数

针对每个对象都有额外引入一小块内存,保存有对少个引用指向他

当内存不使用(引用计数为0),可以释放

例如:函数调用创建对象,分配内存,方法结束,局部变量和栈帧一起释放,使引用计数为0,就认为这个对象是个垃圾

缺陷:

1.空间利用率低,要是对象很小,空间利用率就降低

2.有循环引用的问题

两个对象t1,t2分别引用对方的属性,此时两个对象的引用计数为2,要是两个对象都设置为null,此时引用计数不为0,无法释放,因为引用长在彼此的身上,外界的代码无法访问到这两个对象,此时两个对象不能使用,不能释放,就会出现内存泄漏

2.基于可达性分析

通过额外的线程,定期对整个内存空间的对象进行扫描

有起始位置,把可以访问到的对象标记一遍,没有标记的就是不可达,就是垃圾

起始位置:

栈上的局部变量

常量池中的引用指向对象

方法区中的静态成员指向的对象

优点:克服引用计数的缺点:空间利用率低,循环使用

缺点:系统开销大,遍历一次很慢

问题:

2.释放垃圾

1.标记-清除

标记:可达性分析的过程

清除:释放内存

直接释放内存,分布是离散的,问题"内存碎片"

2.复制算法

把不是垃圾的拷贝到另一半,把原来 空间整体都释放

问题:

内存利用率低

保留对象多,释放对象少时,开销大

3.标记-整理

根据复制算法进行改进

把保留的对象拷贝到前面(直接覆盖要释放的对象),多余的删除

空间利用率高,没有解决复制/搬运的开销

JVM实现会把多种方案结合

分代回收

针对对象分类:(根据对象的年龄分类),一个对象熬过一轮GC的扫描,长一岁

不同年龄用不同的方案

1.刚创建的对象放在伊甸区

2.伊甸区对象熬过一轮GC扫描,被拷贝到幸存区(使用复制算法)

3.在后续的GC,幸存区对象在两个幸存区中来回拷贝(复制算法),每轮都会淘汰幸存者

4.持续若干轮后,进入老年的代

因此老年代的GC扫描频率大大低于新生代,老年代中使用标记整理的方式进行回收

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

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

相关文章

4月JAVA面试太难,吃透这份JAVA架构面试笔记后,成功涨到30K

昨天跟一位高级架构师的前辈聊天时,聊到今年的面试。有两个感受,一个是今年面邀的次数比往年要低不少,再一个就是很多面试者准备明显不足。不少候选人能力其实不差,进入团队干活后达到期望不难,但由于没准备或不会表达…

快速响应 智慧应急|大势智慧亮相第三届武汉国际安全应急博览会

4月26日至4月28日,第三届武汉国际安全应急博览会(后简称“应博会”)在湖北武汉顺利举办。本次展会,大势智慧以实时三维重建能力为核心,提供各类应急场景的技术支撑,助力应急处置和救援等方面的应用。 展会…

基于AI技术的智能考试系统设计与实现(论文+源码)_kaic

摘 要 随着当今世界互联网信息技术的飞速发展,互联网在人们生活中的应用越来越广泛,在线考试成为选拔人才的重要方法。实现一个基于AI技术的智能考试系统,该系统采用Java编程语言实现。通过使用自然语言处理技术和机器学习算法,该…

【C++】入门

目录 1. 什么是C2. 命名空间2.1 命名空间的定义2.2 命名空间的使用 3. 输入和输出4. 缺省参数4.1 概念4.2 分类 5. 函数重载5.1 函数重载概念5.2 为什么支持函数重载 6. 引用6.1 概念6.2 特性6.3 常引用6.4 指针与引用的区别 7. 内联函数7.1 特性 1. 什么是C C语言是结构化和模…

【c语言】五大内存区域 | 堆区详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

Paimon: Streaming data lake 数据湖项目的后起之秀

什么是Paimon? Paimon的官网介绍是&#xff1a;Streaming data lake platform with high-speed data ingestion, changelog tracking and efficient real-time analytics. Paimon 是流数据湖平台&#xff0c;具有高速数据摄取、变更日志跟踪和高效的实时分析能力 数据湖是大…

unity什么是曲线动画?

介绍 unity什么是曲线动画&#xff1f; 在Unity中&#xff0c;曲线动画&#xff08;Curve Animation&#xff09;是一种基于曲线的动画系统&#xff0c;它允许你通过在时间轴上编辑曲线来控制游戏对象的某个属性在时间上的变化。曲线动画可以用于很多方面&#xff0c;比如控制…

Linux套接字编程-2

在上一篇博客中&#xff0c;我们先对套接字编程的内容进行了一个简单涵盖&#xff0c;并详细陈述了UDP协议内容。本篇我们承接上文&#xff0c;讲述完UDP后&#xff0c;我们来讲解TCP。 目录 1.TCP协议 1.1通信两端流程 1.1.1服务端流程 1.1.2客户端流程 1.2套接字相关操…

LeCun、田渊栋参与撰写,70页「自监督学习」大全

来源 | 机器之心 微信号&#xff1a;almosthuman2014 「关于自监督学习&#xff0c;你想知道但又不敢问的一切都在这里了。」图灵奖得主、Meta 人工智能首席科学家 Yann LeCun 刚刚发了这样一则推文。 在推文中&#xff0c;LeCun 介绍了他和 Meta 人工智能研究院研究员、研究经…

数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)

目录 题意理解 问题 描述 输入样例 输出样例 求解思路 建两棵二叉树 不建树 建一棵树 搜索树表示 程序框架搭建 如何建搜索树 如何判别 方法 查找函数 判断函数 其他函数 题意理解 给定一个插入序列就可以唯一确定一颗二叉搜索树。 但是&#xff0c;一颗给定…

libigl添加Viewer Menu时出现imgui相关的错误:无法打开包括文件: “imgui.h”: No such file or directory

libigl添加如下图所示的Viewer Menu时&#xff0c;出现了“无法打开包括文件: “imgui.h”: No such file or directory”的错误 很显然是libigl内嵌的imgui出了问题 从项目路径libigl-example-project-main\out\build\x64-Release\_deps\libigl-src\include\igl\opengl\glfw\…

【谷粒商城之CompletableFuture异步编排】

本笔记内容为尚硅谷谷粒商城CompletableFuture异步编排部分 目录 一、线程回顾 1 、初始化线程的 4 种方式 2.、线程池的七大参数 运行流程&#xff1a; 3、常见的4种线程池 4、开发中为什么使用线程池 二、CompletableFuture 异步编排 业务场景 1、创建异步对象 …

无线化超轻薄,香港城市大学体感反馈贴片WeTac

此前&#xff0c;青亭网曾报道香港城市大学与腾讯Robotics X Lab合作研发的低电压体感方案&#xff0c;原理是通过微电流刺激来模拟触觉&#xff0c;可模拟微小物体的体感。近期&#xff0c;香港城市大学的一组科研人员也公布了一项类似的方案&#xff1a;WeTac&#xff0c;该方…

轻松上手:使用VSCode调试Python模块级代码的完整教程

安装VSCode&#xff1a;请确保已经安装了Visual Studio Code。安装Python插件&#xff1a;在VSCode中&#xff0c;转到Extensions视图 (View -> Extensions) 并搜索"Python"。找到由Microsoft提供的插件并点击安装。重启VSCode以确保插件安装正确。准备项目&#…

边听歌边充电LDR6028+LDR9201既能充电又能OTG方案

随着type-c接口的普及&#xff0c;市面上的手机&#xff0c;平板&#xff0c;笔电逐渐都采用了type-c接口&#xff0c;设备为了不断的追求更轻薄的机身和防水要求慢慢的取消了一些影响手机外观完整性的接口&#xff0c;比如3.5mm耳机孔。 有线耳机用户一般会选择使用C口转3.5m…

资深架构师解读零代码开发平台—如何不写代码实现流程审批

审批节点 “审批节点&#xff1a;” 流程中涉及审批时&#xff0c;需要用到审批节点。审批可通过或者驳回&#xff0c;也可以发送通知。可以多人会签/或签审批。 1. 审批节点 1.1 审批设置 ① 审批方式 审批方式默认为或签方式&#xff0c;只一个人审批即可 当选择会签时&#…

【英语】大学英语CET考试,口语考试介绍与备考1(讲义笔记)

文章目录 1、考试基本信息2、考试题型介绍3.1 短文朗读与回答问题&#xff08;语音篇&#xff09;3.1.1 语音篇真题3.1.2 语音篇6项基础知识3.1.3 语音语调练习&#xff08;名言名句&#xff09;3.1.4 短文朗读练习材料&#xff08;真题&#xff09; 3.2 自我介绍与看图说话&am…

IC面试,你一定要准备好这些(内附大厂面试题目)

大家都知道&#xff0c;面试的表现会对于个人职业发展的重要性&#xff0c;不仅能决定是否录用&#xff0c;还会影响到后期的谈薪&#xff0c;所以面试前一定要做好充分的准备。 怎么准备面试&#xff1f; 这里就建议简历上的表述尽量客观化、专业化&#xff0c;多使用数字和…

目标跟踪综述 (持续更新)

这几天对目标跟踪挺感兴趣的&#xff0c;但是在CSDN和知乎上面找的相关介绍资料都看的一知半解&#xff0c;所以自己找了一篇 2022-04-26 发表的综述文章作下笔记学习下。 目录 一、基于相关滤波的目标跟踪算法 1、相关滤波视频目标跟踪算法的框架 2、相关滤波目标跟踪算法…

GPT-4开源平替miniGPT-4来了,仅需23G显存单机可run,附论文、项目代码地址

来源 | 新智元 微信号&#xff1a;AI-era 先是ChatGPT的发布给世界带来了一点小小的NLP震撼&#xff0c;随后发布的GPT-4更是破圈计算机视觉&#xff0c;展现了非凡的多模态能力。 不光能读懂人类的梗&#xff0c;给个手绘草图甚至可以直接写出网站的代码&#xff0c;彻底颠覆…