JVM及其垃圾回收机制(GC)

news2025/1/11 19:42:00

目录

一.JVM内存区域划分

二.JVM类加载机制

类加载过程

类加载的时机

双亲委派模型

三.JVM垃圾回收机制(GC)

GC工作过程

1.找到垃圾/判断垃圾

(1)引用计数【python/PHP】

(2)可达性分析【Java】

2.对象释放

(1)标记清除算法

(2)复制算法

(3)标记整理算法

(4)分代回收算法


JVM即Java虚拟机

一.JVM内存区域划分

JVM是一个应用程序,要从操作系统里申请内存。在启动的时候,会申请到一个很大的内存区域。JMV要根据需要,把整个空间分成几个部分,每个部分各自有不同的功能作用。

此处的栈,不是数据结构中的栈(后进先出),这里的栈是JVM的一个特定空间。对于JVM虚拟机,用来存储native方法之间的调用关系;对于本地方法栈,存储的是native方法之间的调用关系。

栈空间的内部包含多个元素,每个元素表示一个方法。每个元素称为一个“栈帧”,一个栈帧中包含这个方法的入口地址、参数、返回地址、局部变量.....

方法区:一个进程里只有一块,多个线程共用这一块

:每个线程有一份,每个进程有N个

:每个进程有N个

每个线程用自己的栈,多个线程用同一个堆。

基本原则:

1.局部变量在栈上

2.普通成员变量在堆上

3.静态成员变量在方法区(元数据区)

二.JVM类加载机制

类加载就是.class文件,从文件(硬盘)被加载到内存中(元数据区)的过程。

类加载过程

记忆:

加载:找到.class文件,读取文件内容

验证:根据jvm虚拟机规范,检查.class文件的格式是否符合要求

准备:给类对象分配内存空间(此时内存初始化全成0)

解析:对字符串常量进行初始化,把符号引用转换成直接引用。

初始化:调用构造方法,对类对象里的内容进行初始化。加载父类,执行静态代码块。

类加载的时机

不是Java程序一运行就把所有的类加载了,而是正真用到才加载。

1.构造类的实例

2.调用这个类的静态方法/使用静态属性

3.加载一个子类就需要先加载其父类

双亲委派模型

描述的是这个加载,找.class文件的基本过程

JVM默认提供了三个类加载器

首先加载一个类的时候,是先从ApplicationClassLoader开始,一层一层往上委托给自己的父亲。当没有父亲/父亲加载完,没有上级的类,才由本层进行加载。当轮到BootstrapClassLoader进行加载时,它会负责搜索自己负责的标准库相关的类,如果找到就加载。如果没有找到就继续由子类加载器加载。

这个顺序最主要的目的就是为了保证Bootstrap能够先加载,Application能够后加载。这样的机制可以保证当用户在自己的代码中创建了一个和标准库相同名字的类的时候,不会让jvm已有的代码混乱。

三.JVM垃圾回收机制(GC)

垃圾:不再使用的内存

垃圾回收机制:把不用的内存自动释放

GC主要针对堆进行释放的。GC是以“对象”为基本单位,进行回收的。

GC回收的是整个对象都不再使用的情况。

GC工作过程

1.找到垃圾/判断垃圾

判断对象是否有“引用”指向它。Java中是通过引用来使用对象的。如果一个对象没有引用指向了,就不会再被使用了。

(1)引用计数【python/PHP】

给每个对象分配了一个计数器,每次创建一个引用指向该对象,计数器+1;每次引用被销毁,计数器减-1。

局限:

1)内存空间浪费多,每个对象都需要分配一个计数器。(当对象本身很小时,多一个计数器的空间,会使空间的利用率大大降低)

2)存在循环引用的问题。(当两个对象相互指向时,此时销毁一个对象,两个对象的计数器都-1,但实际上销毁一个对象,另外的一个对象也会不存在)

(2)可达性分析【Java】

前提:Java中的对象都是通过引用来指向访问的。Java中的对象通过链式/树形结构,整体串起来(类比定义一个二叉树)

可达性分析,就是把所有这些对象被组织的结构视为是树,从根节点出发,遍历树,所有能被访问到的对象,标记为“可达”(不能访问到的就标记为“不可达”)

jvm通过上述遍历,把不可达的作为垃圾进行回收。

2.对象释放

(1)标记清除算法

简单粗暴,把标记的垃圾清除掉。但是被释放的空闲空间是零散的,不是连续的。

而申请内存时要求的是连续的空间。(总的空闲空间很大,但是每个具体的空间都很小,可能导致在申请较大一点的内存的时候就申请失败了)

(2)复制算法

复制算法解决的就是上述标记清除算法带来的“内存碎片”问题

缺点:

1.空间利用率低

2.如果垃圾比较少,有效对象多,复制成本就比较大

(3)标记整理算法

保证了空间利用率,同时也解决了内存碎片。但是效率并不高,搬运空间大时,效率会降低。

上述的三种算法,都有各自的缺点。所以把垃圾回收分成不同的场景,让三种算法对应不同的需求,扬长避短。为此提出了分代回收算法。

(4)分代回收算法

根据生命周期的长短,分别使用不同的算法。给对象引入“年龄”这个概念(年龄:熬过GC的轮次,经历一轮可达性分析的遍历,判断是否是垃圾)

年龄越大,这个对象存在的时间越久。

伊甸区到幸存区:复制算法

幸存区之后,也要周期性的接受GC的考验。如果变成垃圾就要被释放,如果不是垃圾就被拷贝到另外一个幸存区。俩个幸存区同一个时刻只用一个,两者之间来回拷贝。幸存区的体积不大,空间浪费也就不大。

两个幸存区之间:复制算法

如果对象在俩个幸存区之间已经来回拷贝许多次,这个时候就要进入老年代。老年代也要周期性扫描,,但是频率会更低。

老年代对象是垃圾时,使用标记整理的方式进行释放。

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

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

相关文章

Springboot细节补充

一、Bean是怎么装配的? 1、bean扫描 在之前的ssm中,spring要么用标签的形式来扫描包,要么使用注解ComponentScan来扫描 但是在Springboot中,启动类上默认有一个注解SpringBootApplication,里面就包含了ComponentScan…

五、L2TPv2 VPN

L2TPv2 VPN 1、L2TPv2概述1.1.目的1.2.特点 2、L2TP原理2.1.基本概念2.2.工作原理2.2.1.协议架构2.2.2.报文结构2.2.3.报文封装2.2.4.报文传输 3、工作过程4、应用场景4.1、远程拨号用户发起L2TP隧道连接4.2、LAC接入拨号请求发起L2TP隧道连接4.3、LAC接入PPPoE用户发起L2TP隧道…

Makefile的简单语法学习

通配符 假如一个目标文件所依赖的依赖文件很多,那样岂不是我们要写很多规则,这显然是不合乎常理的,我们可以使用通配符,来解决这些问题。 我们对上节程序进行修改,代码如下: test : a.o b.ogcc -o test $…

bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds: ceph-deploy mds

创建池 [rootceph-0 ~]# ceph osd pool create cephfs_data 64 pool cephfs_data created [rootceph-0 ~]# ceph osd pool create cephfs_metadata 32 pool cephfs_metadata created cephfs_metadata 64 报错 官方说明: 元数据池通常最多可容纳几 GB 的数据。为…

“谐波”分析治理,电能质量在线监测

安科瑞 崔丽洁 摘要:在国家鼓励半导体材料国产化的政策导向下,本土半导体材料厂商不断提升半导体产品技术水平和研发能力,逐渐打破了国外半导体厂商的垄断格局,推进中国半导体材料国产化进程,促进中国半导体行业的发展…

ubuntu20.04有公网ip如何做端口映射?

一,有公网IP时如何做端口映射? 然后打开浏览器,输入192.168.2.1自己路由地址,进入路由器的控制面板(如果不知道用户名和密码,可以在自己路由设备背面可见默认帐号密码)。 点击转发规则&…

深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)

本章的内容: 什么是函数栈帧? 理解函数栈帧能解决什么问题? 函数栈帧的创建和销毁解析 本文放到 --> 该专栏内:http://t.csdnimg.cn/poMzA 目录 什么是函数栈帧❓ 理解函数栈帧能解决什么问题呢?💢 函数栈帧的…

抖音商城双11好物节,从供需两侧重新定义“好货”

【潮汐商业评论/原创】 你用的第一款护肤品是什么? 大部分人回忆起童年的时候,想起来的都是那款有着牛奶香味的、塑料包装的小袋白色乳霜——郁美净儿童霜。 但是不知何时,它逐渐淡出了很多人、特别是年轻人的视野,直到今年在互…

iManager云套件支持配置kingbase

作者 yangjunlin 前言 越来越多的涉密单位对于信创环境的要求逐渐升高,服务应用对国产数据库的依赖性也在提高,针对超图iManager for k8s产品中的开源数据库替换为kingbase等国产化数据库的客户需求和场景也就随之而来,因此本文将带着读者一步…

ChatGPT微信小程序系统源码/开源支持二开/AI聊天微信小程序源码/人工智能ChatGPT实现的微信小程序

源码简介: 关键字:人工智能 ChatGPT 二开ChatGPT微信小程序源码,作为AI聊天微信小程序源码,它是人工智能ChatGPT实现的微信小程序。它可以适配H5和WEB端 支持AI聊天次数限制。 ChatGPT-MP(基于ChatGPT实现的微信小程序&#xf…

广东食养食疗国际研讨会成功举行

经商务部批准的第20届中国国际保健博览会11月11日在广州隆重开幕。广东省养生文化协会召开的食养食疗国际研讨会首次亮相展会,备受大众关注。来自20多个国家地区的代表,通过线下线上、现场演讲、书面交流等不同形式参加本次活动。30多个商协会负责人和近…

后门程序2

System\CurrentControlSet\Services\Disk\Enum Windows 操作系统注册表中的一个路径。这个路径通常包含有关磁盘设备的信息。在这个特定的路径下,可能存储了有关磁盘枚举的配置和参数 Enum(枚举)子键通常包含了系统对磁盘的枚举信息&#xf…

Python实现WOA智能鲸鱼优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

Spring的Redis客户端

如何在Spring中操作redis 在创建springboot项目的时候引入redis的依赖. 在配置文件里指定redis主机的地址和端口,此处我们配置了ssh隧道,所以连接的就是本机的8888端口. 创建一个controller类,注入操作redis的对象. 前面使用jedis,是通过jedis对象里的各种方法来操作redis的,此…

[原创]仅需小小的改变,B++ Builder 12的代码完成提示即可完美工作.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse、C Bui…

实验室试剂耗材安全管理:从热点事件看其重要性

随着科学技术的不断发展,实验室试剂耗材在各个学科领域的应用越来越广泛。然而,随之而来的实验室试剂耗材安全管理问题也日益凸显。近年来,一系列实验室安全事件引发了社会广泛关注,使我们深刻认识到实验室试剂耗材安全管理的重要…

HslCommunication模拟西门子读写数据

导入HslCommunication C#端代码(上位机) 这里要注意的是上位机IP用的当前电脑的IP。 using HslCommunication; using HslCommunication.Profinet.Siemens; using System; using System.Collections.Generic; using System.ComponentModel; using Syste…

Ridgeline plot / 远山图 / 山脊图 怎么画?怎么优化?

工具 Origin 2022 当然,用Matlab、Python也是可以的。 颜色配置 色卡调整

ehcart散点图x轴不按照顺序排列的问题

如图所示,一开始我x轴用的type为category,所以导致x轴的顺序是乱的,如下所示: 后来去官网看了下文档,才知道只需要type改成value就可以了!!!差点就去写for循环排序了呀

正交矩阵的定义

对于n阶矩阵A,如果,其中为单位矩阵,为A的转置矩阵,那么就称A为正交矩阵。 对于正交矩阵, 对于正交矩阵,其列向量都是单位向量,行向量都是单位向量