学会JVM,从这篇开始

news2024/11/23 18:53:14

目录

一、了解 JVM 

二、JVM内存划分

三、类加载

1. 类加载是干啥的?

什么是类对象 ?

2. 类加载的大致过程

3. 什么是 双亲委派模型(重点) ? 

四、GC

1. GC回收的是哪里的内存

2. 回收如何判断某个对象是否是垃圾?

① 引用计数(Python PHP采用)

② 可达性分析(JVM采用)

3. 如何回收

① 标记清除

② 复制算法

③ 标记整理

④ 分代回收:综合了上述方法,根据对象不同的特点,用不同的方法

垃圾回收器


 

 

一、了解 JVM 

JVM ( Java Virtual Machine ),又称之为 Java虚拟机。JVM 的运行与操作系统无关,能够实现跨平台,只要是安装了JVM的机器,都能运行Java程序,Java语言最重要的特点 "跨平台运行",也正是这个原因。

想要详细了解 Java 推荐大家一本书 << 深入理解Java虚拟机>> (周志明)

而不作为 这个垂直领域(开发编译器 等..)的程序员,我们工作中所要知道的并不多,只需熟记下面的内容。

 

二、JVM内存划分

Java 程序,就是一个名为 Java的进程,这个进程就是“JVM”,JVM会先从操作系统里申请一大块空间,在这个基础上再划分成几个小的区域。(可以理解成你买个房子,你会规划一下厨房\客厅\卧室...)。而学习JVM内存划分,就是学习这几个区域。

  •  堆  :存放 new 的对象。
  •  方法区:存放 类对象(加载好的类)。
  •  栈 :分为“本地方法栈”和“虚拟机栈”。本地方法栈:存放本地方法之间的调用关系(本地方法指的是JVM内部使用C++写的代码)。虚拟机栈:用来保存调用关系的内存空间。
  •  程序计数器 :放的是下一个要执行的指令的地址。

牢记:局部变量存放在栈上。成员变量存放在堆上。静态变量是在类对象里,也就是在方法区中。

 

三、类加载

1. 类加载是干啥的?

Java 程序在运行之前,是先要进行编译,将 .java文件 变成 .class文件(二进制字节码文件)

在运行的时候,JVM进程就会读取对应的 .class 文件,并解析内容,在内存中构造出类对象进行初始化......简单点说就是 将类从文件加载到内存之中

什么是类对象 ?

这个图就是 Java的官方文档截取的,左边是类型 右边是相关属性,日常开发中,我们会遇到版本不兼容的问题,就是因为类对象的格式不同,JDK8 和 JDK19还是有很多区别的。

2. 类加载的大致过程

1. 加载

2. 连接 ---->①验证②准备③解析

3. 初始化

要熟悉了解这个图!!

 

3. 什么是 双亲委派模型(重点) ? 

JVM 加载器 是由 类加载器(class loader) 这样的模块来负责的,而JVM本身自带了多个类加载器 (我们程序员也可以自己实现)。

  • Bootstrap ClassLoader  负责加载标准库中的类
  • Extension ClassLoader  负责加载JVM扩展的库的类
  • Application ClassLoader  负责加载咱们自己的项目里的自定义类

而 上述类加载器相互配合的工作过程,就是双亲委派模型

三个类加载器存在父子关系 :

加载的时候,从Application ClassLoader 开始,加载器不会立即扫描自己负责的路径,而是把任务委派给 父类加载器 先进行处理,整个过程就是按照下图的过程,如果最后没有找到,就会报错 “类加载失败”。

 

 

四、GC

  • GC(Garbage Collection):垃圾回收机制 
  • 当我们呢申请内存,但不进行释放的时候,就会产生 内存泄漏 ,而手动释放又太麻烦,就产生了GC垃圾回收机制,也就是JVM自动释放垃圾的方式。Python PHP JS Go Java ....。
  • C++并没有GC,原因是 GC有一个 STW问题 ,也就是在特定的时候,会产生卡顿,而C++追求的是机制的快。C++使用的是“智能指针”。

 

1. GC回收的是哪里的内存

  • 堆:GC主要回收的地方
  • 方法区:类对象,加载之后一般不会卸载
  • 栈:成员变量,释放的时间确定,不必回收
  • 程序计数器:固定内存空间,不必回收

而 主要回收的堆 又分为几块,如下图

 

 

2. 回收如何判断某个对象是否是垃圾?

通过判断是否存在引用指向,确定这个对象是否使用,如果不存在引用对象则就可以释放。释放的方式有两种典型的方法,分别是 引用计数 和 可达性分析

① 引用计数(Python PHP采用)

每个对象都加上一个计数器,这个计数器就表示 当前的对象有几个引用。当计数器的值为 0 的时候,表示这个对象已经没有引用指向,也表示无法被使用了,这时候就被认为是垃圾。

优点:① 空间利用率低(当是int类型的对象的时候,还有加一个计数器)

           ② 可能出现 循环引用 的问题,例如下面代码

public class Test {
    Test test;
    public static void main(String[] args) {
        Test a = new Test(); //a对应的对象 +1=1
        Test b = new Test(); //b对应的对象 +1=1
        a.test = b; //b对应的对象 +1=2
        b.test = a; //a对应的对象 +1=2
        a = null; //a对应的对象 -1=1
        b = null; //b对应的对象 -1=1
        // 我们会发现 这时候 a对应的对象 和 b对应的对象 计数器内的值都为1
        // 但是实际上 并没有引用指向它们,这就是循环引用的问题,计数器无法归零
    }
}

② 可达性分析(JVM采用)

约定一些特定的变量作为“GC Roots”。每隔一段时间,就从 GC Roots 出发,进行遍历,看看哪些变量能够被访问到(可达),哪些不能被访问(不可达)。

约定的GC Roots:①栈上的变量 ②常量池引用的对象 ③方法区 引用类型的静态变量

3. 如何回收

① 标记清除

 

② 复制算法

 

 

③ 标记整理

④ 分代回收:综合了上述方法,根据对象不同的特点,用不同的方法

 

垃圾回收器

其实上面的内容都是“纸上谈兵”,真枪实弹的是垃圾回收器,而常见的垃圾回收器可以了解一下CMS、G1、ZGC(Java15开始使用),可以后期了解。

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

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

相关文章

【计算机考研408】2023考研408大题预测总结

数据结构 链表相关算法题 反转链表1 题源1&#xff1a;反转链表1 比较简单&#xff0c;可以作为思想记忆&#xff0c;不太会这么直接考察 408可能考察链表的实现&#xff0c; ListNode* reverseList(ListNode* head) {if(head NULL) return NULL;//头插法ListNode * p …

计算机毕设Python+Vue学生健康管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

jsp+ssm计算机毕业设计二手车交易系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

(八) mysql主从以及Redis集群

mysql主从以及Redis集群一、Mysq主从复制安装1、新建主服务器容器实例33072、进入/mydata/mysql-master/conf目录下新建my.cnf3、进入mysql-master容器4、master容器实例内创建数据同步用户5、新建从服务器容器实例33086、创建从机的配置文件7、在主数据库中查看主从同步状态8、…

Linux——shell及其基本命令

一、认识shell Shell是一个命令语言解释器。登陆Linux后&#xff0c;所有的命令都被shell解释&#xff0c;它支持函数、变量、数组、程序设计结构等。分为Bourne Shell和 C Shell&#xff0c;红帽默认Bash&#xff0c;是B Shell的扩展&#xff0c;完全兼容。 1&#xff0e;启…

python中使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习问题

在强化学习中&#xff0c;我们有兴趣确定一种最大化获取奖励的策略。最近我们被客户要求撰写关于MDP的研究报告&#xff0c;包括一些图形和统计输出。假设环境是马尔可夫决策过程 &#xff08;MDP&#xff09;的理想模型 &#xff0c;我们可以应用动态编程方法来解决强化学习…

【C++】STL——stack和queue的介绍与使用及模拟实现

stack和queue的介绍与使用及模拟实现 文章目录stack和queue的介绍与使用及模拟实现1.stack的介绍与使用1.1.stack的介绍1.2.stack的使用1.3.stack的模拟实现2.queue的介绍和使用2.1.queue的介绍2.2.queue的使用2.3.queue的模拟实现3. 容器适配器3.1.STL标准库中stack和queue的底…

分享15个全球顶尖的AIGC图片生成平台

人工智能正在改变许多行业的格局&#xff0c;而其中改变最直观和影响最大的就是AIGC领域的图像创作。 发展至今已经有很多AI图像生成平台&#xff0c;他们的共同特点就是使用人工智能将文本转换为图像&#xff0c;这是一次革命性的突破&#xff0c;也就是说通过这些AI工具可以…

springboot多数据源---3多数据源组件

一、dynamic-datasource多数源组件 两三个数据源、事务场景比较少 基于 SpringBoot 的多数据源组件&#xff0c;功能强悍&#xff0c;支持 Seata 分布式事务。 支持 数据源分组 &#xff0c;适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。 支持数据库敏感配置信息 加密…

卡尔曼滤波

文章目录References卡尔曼滤波的作用世界中充满着不确定性在工程中整体感受状态空间方程结合例子理解公式公式6-1说明公式6-2说明参数H的意义总结怎么融合&#xff1f;从简单的例子入手-测量一枚硬币的直径融合实例卡尔曼公式详细推导协方差矩阵卡尔曼增益的推导详细推导误差协…

基于规则的分类(顺序覆盖算法)及最近邻分类器(KNN算法)

顺序覆盖算法的步骤 顺序覆盖算法的目标是提取一个分类规则&#xff0c;该规则覆盖训练集中大量正例&#xff0c;没有或仅覆盖少量反例。 整个过程包含以下四个步骤&#xff1a; 规则增长规则评估停止准则规则剪枝 顺序覆盖算法的第一步——规则增长 一般到特殊&#xff08…

高压功率放大器基于液晶生物光电传感器中的应用

实验名称&#xff1a;基于液晶的高通量蛋白质光电生物传感器 研究方向&#xff1a;生物识别与检测 测试目的&#xff1a; 蛋白质分析是疾病诊断和医学研究中一类重要的方法。本文提出了一种单基底的液晶生物光电传感器&#xff0c;可用于快速检测蛋白质的浓度。实验发现单基底液…

ZigBee案例笔记 -- LED控制与按键检测(输入/输出)

文章目录1.相关寄存器2.按键检测&#xff08;引脚输入配置&#xff09;3.LED控制&#xff08;引脚输出配置&#xff09;1.相关寄存器 CC2530&#xff08;ZigBee&#xff09;的开发也是类似51单片机一样针对寄存器进行配置&#xff0c;因为其内核实质上也是51内核&#xff0c;对…

Sulfo CY5-MAL|磺基-CY5 马来酰亚胺

Sulfo CY5-MAL|磺基-CY5 马来酰亚胺 英文名称&#xff1a;Cyanine5 maleimide Cyanine5 MAL Cy5 maleimide Cy5 MAL CAS&#xff1a;1437872-46-2 外观&#xff1a;深蓝色粉末 分子量&#xff1a;641.24 分子式&#xff1a;C38H45ClN4O3 花菁染料&#xff0c;一种发…

Hive实训任务

文章目录Hive 实训任务Hive 实训任务 熟练掌握如何创建外部表&#xff0c;加载数据&#xff0c;查询等 先创建一个cx_stu02 外部表&#xff0c;external 指定外部表关键字 create external table cx_stu02(name string,gender string,age int ) row format delimited fields…

一文初识大数据Flink框架

文章目录什么是Flinkflink在github上的现状flink发展历史flink能做什么flink 的高并发能力一些计算框架对比图flink发展方向flink生态体系处理无界和有界数据随处部署应用程序运行任何规模的应用程序利用内存性能官方文档地址:https://flink.apache.org/ 什么是Flink &#x…

php宝塔搭建部署实战Piwigo开源相册管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的Piwigo开源相册管理系统源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#x…

基于Python + Requests 的Web接口自动化测试框架

之前采用JMeter进行接口测试&#xff0c;每次给带新人进行培训比较麻烦&#xff0c;干脆用Python实现&#xff0c;将代码和用例分离&#xff0c;易于维护。 项目背景 公司的软件采用B/S架构&#xff0c;进行数据存储、分析、管理 工具选择 python开发的速度很快&#xff0c…

【计算机考研408】数据结构代码规范

408-数据结构代码规范 文章目录408-数据结构代码规范序言优化参考文献考前预测线性表-链表单链表静态链表栈、队列、数组栈的顺序存储类型队列树与二叉树二叉树的定义二叉树的层序遍历树的双亲表示法孩子表示法树的孩子兄弟表示法图邻接矩阵存储法邻接表法二分查找/折半查找模板…

在linux上运行python脚本(安装pytorch踩坑记录,pyinstaller使用方式,构建docker镜像)

背景 脚本需要导入pytorch等库才能运行。 脚本在windows上运行成功&#xff0c;尝试放到linux上运行。 linux服务器内存较小。 方法一&#xff1a;在linux上安装依赖 把脚本放到linux上&#xff0c;直接安装依赖。 安装环境也有两种方法&#xff1a;一是先安装conda&#xf…