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

目录

一.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的考验。如果变成垃圾就要被释放,如果不是垃圾就被拷贝到另外一个幸存区。俩个幸存区同一个时刻只用一个,两者之间来回拷贝。幸存区的体积不大,空间浪费也就不大。

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

shell 语法介绍

大家好,我是蓝胖子,在日常开发中或多或少都会接触到shell脚本,可以说会shell脚本是一位后端开发的基本功,今天我将会花上一篇文章总结下常见的shell的语法,学完本篇,相信简单的shell脚本就能够看懂了&#…

uniapp的实战总结大全

🙂博主:冰海恋雨 🙂文章核心:uniapp部分总结 目录 ​编辑 目录 前言: 解决方案 1. 跨平台开发 2. Vue.js生态 3. 组件库 4. 自定义组件 5. Native能力 6. 插件生态 7. 性能优化 写法 1. 模板&#xf…

基于范数求解缩放因子方法的MIMO系统预编码技术matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. MIMO系统模型 4.2. 基于范数求解缩放因子的预编码技术 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 。。。。。。。。。。。。。。。…

Hbuilder介绍,uniapp框架

Hbuilder对程序前端页面进行开发(包括android,ios,小程序,web等等),其实也就是相当于把android开发进行前后端分离了。方便分工协作。提高开发效率。 用前端框架开发可以实现一次编码,多平台运行。 &…

人工智能极简史:一文读懂ChatGPT的前世今生

2022年11月30日,OpenAI推出的一款人工智能技术驱动的自然语言处理工具——ChatGPT,迅速在社交媒体上走红,短短5天,注册用户数就超过100万。 2023年1月末,ChatGPT的月活用户已突破1亿,一度成为史上增长最快的…

网站定制开发的流程|软件app小程序开发定制

网站定制开发的流程|软件app小程序开发定制 网站定制开发是一个为个体或企业创建定制化网站的过程。它涉及到规划、设计、开发和测试等一系列步骤,以满足客户的需求和目标。下面是网站定制开发的基本流程。 1. 需求分析:首先,与客户沟通并了解…

Netty Review - 快速上手篇

文章目录 基础概念官网Whats NettyWhy NettyAbout Netty Author & LeaderWhat can Netty doNetty开发流程Flow HL View客户端开发Handler客户端启动类 服务端开发Handler服务器端启动类 运行示例 基础概念 BIO、NIO和AIO这三个概念分别对应三种通讯模型:阻塞、…

Docker 中的端口

Docker 中的端口 0.0.0.0:8080->80/tcp ,主机(即运行 Docker 的机器)监听8080端口,如果有请求转发到容器的 80 端口上去。 详细解释一下: 0.0.0.0:8080->80/tcp :这是一个端口映射规则。 0.0.0.0:80…

【C语言 | 指针】C指针详解(经典,非常详细)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

Django下的Race Condition漏洞

目录 环境搭建 无锁无事务的竞争攻击复现 无锁有事务的竞争攻击复现 悲观锁进行防御 乐观锁进行防御 环境搭建 首先我们安装源码包:GitHub - phith0n/race-condition-playground: Playground for Race Condition attack 然后将源码包上传到Ubuntu 为了方便使…

软板当然可以弯折啊,只是容易弯出问题而已

高速先生成员:黄刚 每次在介绍具体案例之前,都还是先铺垫下基础知识吧。今天讲的是一个软板的案例,我们循例先介绍下软板的概念。相信大多数的硬件工程师,PCB设计工程师或者测试工程师都见过,就是像下面的这些了。 它作…

openGauss学习笔记-118 openGauss 数据库管理-设置数据库审计-维护审计日志

文章目录 openGauss学习笔记-118 openGauss 数据库管理-设置数据库审计-维护审计日志118.1 前提条件118.2 背景信息118.3 操作步骤 openGauss学习笔记-118 openGauss 数据库管理-设置数据库审计-维护审计日志 118.1 前提条件 用户必须拥有审计权限。 118.2 背景信息 与审计日…

手写线性表C++ vector

目录 一、vector基本概念 1.1、构造函数 1.2、析构函数 1.3、插入元素 1.4、删除元素 1.5、重载运算符 二、完整代码 一、vector基本概念 C中的vector是一种动态数组,它可以根据需要自动调整大小。vector是C标准模板库(STL)中的一个容…

海康威视(iVMS)综合安防系统任意文件上传漏洞复现 [附POC]

文章目录 海康威视(iVMS)综合安防系统任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 海康威视(iVMS)综合安防系统任意文件上传漏洞复…

中国银行模拟器app,用java设计框架,图片网上找的,提供代码,仅供娱乐

回执单生成器的Java程序需要涉及到一些基本的Java编程技能,包括创建类、处理用户输入和格式化输出。下面是一个简单的示例代码,用于生成一个简易的回执单。这个程序将接收用户的输入,然后生成一个格式化的回执单。 请注意,这个示…

解决Chrome无法自动同步书签

前提:(要求能正常访问google) 准备一个谷歌账号 安装Chrome浏览器 开启集装箱插件(或者其他能访问谷歌的工具) 步骤:(使用集装箱插件/能正常访问谷歌的其他工具) 下载安装使用“集…

Databend 开源周报第 119 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 用户案例&#…

故障演练 | 微服务架构下如何做好故障演练

前言 微服务架构场景中,应用系统复杂切分散。长期运行时,局部出现故障时不可避免的。如果发生故障时不能进行有效反应,系统的可用性将极大地降低。 什么是故障演练 故障演练是指模拟生产环境中可能出现的故障,测试系统或应用在…

HTML简单介绍

且视他人之疑目如盏盏鬼火,大胆地去你的夜路。 目录 1.网页 2.Web标准 3.HTML 3.1HTML结构 3.2HTML标签​编辑 4.标签介绍 4.1排版标签 4.2文本格式化标签 4.3媒体标签 4.3.1图片标签 4.3.2 音频标签 4.3.3视频标签 5.相对路径 6.链接标签 6.1target属…