JVM 双亲委派模型以及垃圾回收机制

目录

1. JVM 内存区域划分

2. JVM 中类加载的过程

1) 类加载的基本流程

2) 双亲委派模型

3. JVM 中垃圾回收机制

1) 找到垃圾

a) 引用计数

b) 可达性分析

2) 释放垃圾


1. JVM 内存区域划分

一个运行起来的 Java 进程,其实就是一个 JVM 虚拟机。

而进程是资源分配的基本单位,所以 JVM 就首先会申请一大块内存,然后把这个内存划分成不同的区域,每个区域都有不同的作用。

JVM 内存区域划分成以下四个部分:

1. 方法区 (1.7 及之前) / 元数据区 (1.8 开始)

方法区存储的内容,就是类对象。( .class 文件加载到内存之后,就成了类对象)

2. 堆

这里存储的内容,就是代码中 new 的对象。

堆是占据空间最大的区域。

3. 虚拟机栈(就是平常我们所说的栈)

这里存储的内容,就是代码执行过程中,方法之间的调用关系。

4. 程序计数器

是个比较小的空间,主要用来存放一个 "地址",这个地址,就表示了下一条要执行的指令,在内存中的哪个地方(方法区里)。

每个方法,里面的指令,都是以二进制的形式, 保存到类对象中的。

 刚开始调用方法的时候,程序计数器记录的就是方法的入口的地址。

随着一条一条的执行指令,每执行一条指令,程序计数器的值都会自动更新,去指向下一条指令。

程序计数器和虚拟机栈是每个线程都有一份,而堆和方法区在 JVM 进程中是只有一份的。

在 Java 里,每个线程都有自己私有的栈空间。

2. JVM 中类加载的过程

1) 类加载的基本流程

java 代码会被编译成 .class 文件(包含了一些字节码),java 程序想要运行起来,就需要让 JVM 读取到这些 .class 文件,并把里面的内容,构造成类对象,保存到内存的方法区中。 

官方文档把类加载的过程主要分成了 5 个步骤。

1. 加载:找到 .class 文件,打开文件,读取文件内容。

往往代码中,会给定某个类的 "全限定类名"(比如 java.lang.String,java.util.ArrayList) ,JVM 就会根据这个类名,在一些指定的目录范围内查找。

2. 验证: .class 文件是一个二进制的格式。(某个字节,都是有某些特定含义的),就需要验证你当前读到的这个格式是否符合要求。

3. 准备:给类对象分配内存空间(最终的目标,是要构造出类对象)

这里只是分配空间,还没有初始化,此时这个空间上的内存的数值,就是全 0 的,此时如果尝试打印类的 static 成员,就是全 0 的。

4. 解析:针对类对象中包含的字符串常量进行处理,进行一些初始化操作。

java 代码中用到的字符串常量,在编译之后,也会进入到 .class 文件中。

5. 初始化:针对类对象进行初始化。

把类对象中需要的各个属性都设置好。

还需要初始化号 static 成员

还需要执行静态代码块

以及可能还需要加载一下父类。

总结类加载的基本流程:

1. 加载:找到 .class 文件,打开 .class 文件,读取 .class 文件

2. 验证:验证当前 .class 文件格式是否正确

3. 准备:给类对象分配内存空间

4. 解析:将符号引用替换成直接引用

5. 初始化:初始化类对象

2) 双亲委派模型

属于类加载中第一个步骤 "加载" 中的一个环节,是负责根据全限定类名,来找到 .class 文件的。

类加载器,是 JVM 中的一个模块(专门负责类加载的操作)。

JVM 中,内置了三个类加载器:

1. BootStrap ClassLoader           爷

2. Extension ClassLoader           父

3. Application ClassLoader         子

这个父子关系,不是继承构成的,而是这几个 ClassLoader 里有一个 parent 这样的属性,指向了一个 父 "类加载器"。

程序员也可以手动创建出新的类加载器。

所以说,双亲委派模型,就是一个查找优先级的问题,先找标准库,再找扩展库,最后找第三方库。

3. JVM 中垃圾回收机制

在 Java 中,new 一个对象,就是 "动态内存申请",在 C 语言中,使用 malloc 这种 "动态内存申请" 的函数,使用完之后,就需要手动调用 free 释放内存,如果不释放,就会出现内存泄露这样的问题,而在 Java 中就不用手动释放内存,因为 JVM 自动判定,是否某个对象已经不再使用了,并帮我们进行释放不再使用的对象的内存了。像这种不再使用的对象,就称之为 "垃圾",这种机制,也就叫做 GC 垃圾回收机制。

GC 也有缺陷:

1. 系统开销,需要有一个/一些特定的线程,不停的扫描你内存中的所有的对象,看是否能够回收,此时是需要额外的内存和 CPU 资源的。

2. 效率问题,这样的扫描线程,不一定能够及时的释放内存 (扫描总是有一定周期的),一旦同一时刻,出现大量的对象都需要被回收,GC 产生的负担就会很大,甚至引起整个程序都卡顿 (STW 问题    stop   the   world)

但是 GC 属于大势所趋,Python,PHP,Go.... 都是具有 GC 机制的。

GC 是垃圾回收,GC 回收的目标,其实是 内存中的 对象。

对于 Java 来说,就是 new 出来的这些对象。

栈里的局部变量,是跟随着栈帧的生命周期走的。(方法执行结束,栈帧销毁,内存自然释放)

静态变量,生命周期就是整个程序,这就意味着 静态变量 是无需释放的。

因此真正需要 gc 释放的对象就是 堆 上的对象。

gc 可以理解成两个大的步骤:

1. 找到垃圾

2. 释放垃圾

1) 找到垃圾

在 GC 的圈子中,有两种主流的方案:1. 引用计数     2. 可达性分析 (Java 采用的是这种)

a) 引用计数

new 出来的对象,单独安排一块空间,来保存一个计数器。

b) 可达性分析

可达性分析,本质上是一个时间换空间这样的手段。

有一个/一组线程,周期性的扫描代码中的所有对象。

从一些特定的对象出发,尽可能的进行访问的遍历,把所有能够访问到的对象,都标记成 "可达",反之,经过扫描之后,未被标记成 "可达" 的对象,就是垃圾了。

就跟二叉树的遍历差不多,只不过不是二叉树,而是 N 叉树。

2) 释放垃圾

有三种基本的思路:

1. 标记清除

是一种比较简单粗暴的方式。

2. 复制算法

第二种思路,就是解决,刚刚标记清除出现的内存碎片的办法。

通过复制的方式,把有效的对象,归类到一起,再统一释放剩下的空间。

3. 标记整理

既能够解决内存碎片的问题,又能够处理复制算法中利用率。

类似于顺序表删除元素的搬运操作。

实际上,JVM 采取的释放思路,是上述基础思路的结合体。

分代回收:

分代回收,对象能活过的 GC 扫描轮次越多,就是越老。

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

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

相关文章

leetcode-73.矩阵置零-day5

class Solution {public void setZeroes(int[][] mat) {int m mat.length, n mat[0].length;// 1. 扫描「首行」和「首列」记录「首行」和「首列」是否该被置零boolean r0 false, c0 false;for (int i 0; i < m; i) {if (mat[i][0] 0) {r0 true;break;}}for (int j …

C++11语法解析(二)

可变参数模板 基本语法及原理 ・C11 支持可变参数模板&#xff0c;也就是说支持可变数量参数的函数模板和类模板&#xff0c;可变数目的参数被称为参数包&#xff0c;存在两种参数包&#xff1a;模板参数包&#xff0c;表示零或多个模板参数&#xff1b;函数参数包&#xff1…

opencv——图片矫正

图像矫正 图像矫正的原理是透视变换&#xff0c;下面来介绍一下透视变换的概念。 听名字有点熟&#xff0c;我们在图像旋转里接触过仿射变换&#xff0c;知道仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程&#xff0c;转换过程坐标点的相对位置和属性不发生变换&a…

BatchNorm 与 LayerNorm

文章目录 1. BatchNorm批量归一化2. LayerNorm层归一化3. BatchNorm 和 LayerNorm 对比4. BatchNorm 和 LayerNorm 怎么选择References 今天重看Transformer&#xff0c;发现里面提到了BatchNorm和LayerNorm两种归一化方法&#xff0c;在这儿做一下总结和整理。 1. BatchNorm批…

OpenCV相关函数

一、二值化函数&#xff08;threshold&#xff09; 功能&#xff1a;将灰度图像转换为二值图像&#xff0c;通常用于图像分割。通过设置阈值&#xff0c;把图像中低于阈值的像素设为0&#xff0c;高于阈值的像素设为1。 参数&#xff1a; src&#xff1a;输入图像。 thresh&a…

[传智杯 #6 省赛] 小红劈字符串

一、题目 二、代码解析 首先&#xff0c;input() 函数用于获取用户从控制台输入的内容&#xff0c;在这里用户输入的应该是一个仅由小写字母组成的字符串&#xff0c;然后将这个输入的字符串赋值给变量 xh。接着&#xff0c;使用 len(xh) 函数来计算字符串 xh 的长度&#xff…

【跨库查询、多库查询】.NET开源 ORM 框架 SqlSugar 系列

文章目录 一、跨库方式1&#xff1a;跨库导航二、手动跨库查询三、同服务器&#xff1a;自动查询跨库查询3.1 Mysql和SqlServer自动3.2 自动: PgSql跨Scheme查询3.3 其他库同服务器 四、跨服务器&#xff1a;自动跨库查询4.1 配置SqlServer dblink4.2 配置 Oracle dblink4.3 配…

数据可视化大屏UI组件库:B端科技感素材PSD

在数据可视化领域&#xff0c;一个出色的大屏UI设计不仅能够准确传达数据背后的信息&#xff0c;更能提升用户的视觉体验。然而&#xff0c;对于UI设计师而言&#xff0c;设计这样一款界面往往面临着寻找合适设计素材的挑战。为了应对这一难题&#xff0c;我们推出了这款数据可…

QT数据库(四):QSqlRelationalTableModel 类

关系数据库概念 例如下列departments、majors、studInfo 这 3 个数据表之间存在关系。 主键与外键 标记“**”的是主键字段&#xff0c;标记“*”的是外键字段。主键字段是一个数据表中表示记录唯一性的字段&#xff0c;例如 studInfo 数据表中的 studID 字段。外键字段是与其…

人工智能原理实验四:智能算法与机器学习

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程&#xff0c;通过实验&#xff0c;帮助学生更好地掌握人工智能相关概念、技术、原理、应用等&#xff1b;通过实验提高学生编写实验报告、总结实验结果的能力&#xff1b;使学生对智能程序、智能算法等…

免费生成AI PPT产品推荐?

要完全免费几乎是没有的&#xff0c;要知道AI还是非常烧钱的。 不过免费蹭还是有很多方法的&#xff0c;这里收集了一些&#xff1a; 下面分享我自己免费蹭过的几款AI制作PPT的工具。 1 金山-WPS PPT对我们来说并不陌生&#xff0c;而微软的PowerPoint与金山的WPS也是我们最常…

WPF 消息循环(二)

们已经知道&#xff0c;win32/MFC/WinForm/WPF 都依靠消息循环驱动&#xff0c;让程序跑起来。 这里就介绍 WPF 中是如何使用消息循环来驱动程序的。 1. 背景 只听说过 Dispatcher &#xff0c;哪里来的消息循环&#xff1f; WPF 启动运行堆栈&#xff1a; > WpfApp1.…

PostgreSQL 常用运维SQL整理

一、查询并杀会话 -- 查询会话 select pid,usename,client_addr,client_port,query_start,query,wait_event from pg_stat_activity; -- 杀会话 select pg_terminate_backend(pid号); -- 使用如下命令自动生成杀会话语句 select datid,datname,pid,usesysid,usename,applicat…

JS中的Promise用法大全

目录 一、相关概念介绍1.什么是Promise2.Promise状态3.创建Promise4.then()方法5.catch方法6.链式调用7.异步编程 二、使用1.构造Promise2.executor 函数3.then() 方法4.then() 方法返回的Promise的状态 三、Async/Await语法糖四、Promise应用场景五、总结 一、相关概念介绍 1…

【新界面】基于卷积神经网络的垃圾分类(Matlab)

基于CNN的垃圾识别与分类GUI【新界面】 有需要可直接联系我&#xff0c;基本都在在线&#xff0c;能秒回&#xff01;可加我看演示视频&#xff0c;不懂可以远程教学 1.此项目设计包括两份完整的源代码&#xff0c;有GUI界面的代码和无GUI界面系统的代码。 &#xff08;以下部…

pytorch bilstm crf的教程,注意 这里不支持批处理,要支持批处理 用torchcrf这个。

### Bi-LSTM Conditional Random Field ### pytorch tutorials https://pytorch.org/tutorials/beginner/nlp/advanced_tutorial.html ### 模型主要结构&#xff1a; ![title](sources/bilstm.png) pytorch bilstm crf的教程&#xff0c;注意 这里不支持批处理 Python version…

bugku-simple MQTT-wp解析

1.下载题目打开题目&#xff0c;是一个流量包&#xff0c;题目说是MQTT&#xff0c;然后打开流量之后的流量都是MQTT&#xff0c;我们来搜一下MQTT是什么流量 MQTT流量&#xff1a; 是一种基于发布订阅模式的轻量级的通讯协议&#xff0c;并且该协议构建于TCP/IP协议之上&…

HCIA-Access V2.5_2_2网络通信基础_TCP/IP协议栈报文封装

TCP/IP协议栈的封装过程 用户从应用层发出数据先会交给传输层&#xff0c;传输层会添加TCP或者UDP头部&#xff0c;然后交给网络层&#xff0c;网络层会添加IP头部&#xff0c;然后交给数据链路层&#xff0c;数据链路层会添加以太网头部和以太网尾部&#xff0c;最后变成01这样…

Windows 与 Linux 下 Ping IPv6 地址 | 常用网络命令

注&#xff1a;本文为网络命令相关文章合辑。 未整理去重。 一、IPv6 概述 IPv6 即 “Internet 协议版本 6”&#xff0c;因 IPv4 地址资源面临耗尽问题而被引入以替代 IPv4。IPv6 则提供了理论上多达 2 128 2^{128} 2128 个地址&#xff0c;有效解决地址不足困境。 IPv6 具…

关卡选择与布局器

unity布局管理器 使用unity布局管理器轻松对关卡选择进行布局。 实现过程 准备普通按钮button设置字体和对应的sprite设置父gameobject&#xff08;levelbase&#xff09; 再创建UI.image&#xff08;selectbackground&#xff09;布局背景和大小gameobject&#xff08;grid…