【JVM】内存区域划分、类加载机制(双亲委派模型图解)、垃圾回收(可达性分析、分代回收)

一、JVM简介

JVM (Java虚拟机) 是执行Java字节码的虚拟机。它是Java平台的核心,并且为Java代码提供了跨平台的能力。JVM 是一种虚拟的计算机,在其上运行的程序是Java字节码,它提供了Java代码在不同操作系统和硬件平台上执行的能力。JVM 将Java字节码解释成机器语言

二、内存区域划分

JVM本质是就是一个Java进程,会从操作系统申请一大块内存,给Java代码使用,这块内存进一步划分:

其中最核心的就是三个区域:
🚓(1)堆——new出来的对象(成员变量)
🚓(2)栈——维护方法之间的调用关系)(局部变量)
🚓(3)方法区/元数据区——放类加载后的类对象(静态变量)

具体又分成下面五部分:
在这里插入图片描述
注意:
🚍(1)虚拟机栈是给Java代码使用的,本地方法栈是给JVM的本地方法使用的
🚍(2)堆和元数据区在一个JVM进程中只有一份,栈和计数器则存在多份,每个线程都有一份
🚍(3)程序计数器记录当前程序执行到哪个指令了,用long类型存储了一个内存地址,这个内存地址就是下个要执行的字节码的地址

三、类加载

3.1 什么是类加载?

.class文件,加载到内存,得到类对象的过程就叫类加载

3.2 类加载的过程

在这里插入图片描述

🚑(1)加载

找到.class文件(双亲委派模型),并读取文件内容

🚑(2)验证

验证是连接阶段的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信 息被当作代码运行后不会危害虚拟机自身的安全。

🚑(3)准备

给类对象分配内存空间(未初始化的类对象(包括静态变量)的内存空间都是0)

🚑(4)解析

Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。
在这里插入图片描述

🚑(5)初始化

初始化阶段,Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。初始化阶段就是执行类构造器方法的过程。

3.3 加载过程中的“ 双亲委派模型 ”

首先明确,类加载的过程是由JVM中内置的类加载器完成的。

JVM中内置了三个类加载器:
(1)Bootstrap ClassLoader:负责加载Java标准库中的类
(2)Extension ClassLoader:负责加载一些非标准但是扩展的库的类
(3)Application ClassLoader:负责加载项目中自己写的类以及第三方库中的类

且上述类加载器存在如下关系:
(1)是(2)的父亲类加载器,(2)是(3)的父亲类加载器
在这里插入图片描述

3.4 非必要,不加载

不是JVM一启动就把所有的.class文件都加载了,只有“必要”时加载

“必要”:
🚲(1)创建了这个类的实例
🚲(2)使用了这个类的静态方法\静态属性
🚲(3)使用子类会触发父类的加载

四、垃圾回收

4.1 什么是垃圾回收?

垃圾回收称为GC(Garbage Collection),是一种帮助程序猿自动释放内存的技术

4.2 释放的区域

在JVM中垃圾回收所释放的空间是堆(栈和程序计数器都是随着线程一起销毁,而元数据区存储的是类对象,很少会卸载)

4.3 GC的两个阶段

🚕(1)找垃圾
🚕(2)释放垃圾

4.4 找垃圾

在这里插入图片描述

(1)引用计数

Test t = new Test();
Test t2 = t;

在这里插入图片描述
两个缺陷:
(1)浪费内存空间
(2)存在循环引用的情况

循环引用:
在这里插入图片描述

(2)可达性分析(JVM)

在这里插入图片描述
在这里插入图片描述

4.5 释放垃圾

(1)标记清除

在这里插入图片描述

(2)复制清除

在这里插入图片描述

(3)标记整理

在这里插入图片描述

(4)分代回收(JVM)

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【面试经典150 | 数学】加一

文章目录 写在前面Tag题目来源解题思路方法一:加一 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结…

C++语言的由来与发展历程

C语言的由来与发展历程可以追溯到1978年,当时美国电话电报公司(AT&T)的贝尔实验室发明了C语言,以满足UNIX操作系统的开发需求。在C语言的基础上,Bjarne Stroustrup于1983年创立了C编程语言,作为C语言的…

「引流工具」火炬多平台多功能引流高效推广脚本,抖音+快手+小红书多平台自动引流软件

全自动多平台多功能引流脚本: 脚本支持斗音,快手,小红薯,扣扣。默默,弹弹,金日头条,微博,知乎,bibi,易车,最右,美团,汽车…

【Synopsys Bug记录】DC综合报错(显示warning:Unable to resolve reference)

文章目录 一、问题描述二、问题所在三、问题解决总结4.1 Warning的产生4.2 代码风格4.3 网表正确性 一、问题描述 在综合一个SOC时,发现综合后的门级网表文件缺少了apb系统下的子模块的网表。该SOC已经成功在FPGA上运行了,按理说在设计上是没有问题的。在…

word文档转换为ppt文件,怎么做?

大家是否会遇到需要将word文档转换为ppt文件的情况?除了反反复复粘贴复制以外,还有其他方法可以转换文件格式,今天给大家分享word转换ppt方法。 首先我们先将word文件打开大纲模式 然后我们将文中的大标题设置为1级标题,副标题设…

Boolean源码解剖学

原创/朱季谦 有天突发其想,想看一下Boolean底层都做了些什么,故而去看了一番Boolean的源码,基于一些思考的基础上,输出了这篇文章。 一.类继承 Boolean的源码类定义部分如下: 1 public final class Boolean implemen…

Java源码分析:Guava之不可变集合ImmutableMap的源码分析

原创/朱季谦 一、案例场景 遇到过这样的场景&#xff0c;在定义一个static修饰的Map时&#xff0c;使用了大量的put()方法赋值&#xff0c;就类似这样—— public static final Map<String,String> dayMap new HashMap<>(); static {dayMap.put("Monday&q…

在通用jar包中引入其他spring boot starter,并在通用jar包中直接配置这些starter的yml相关属性

场景 我在通用jar包中引入 spring-boot-starter-actuator 这样希望引用通用jar的所有服务都可以直接使用 actuator 中的功能&#xff0c; 问题在于&#xff0c;正常情况下&#xff0c;actuator的配置都写在每个项目的yml文件中&#xff0c;这就意味着&#xff0c;虽然每个项目…

java学习part05

43-流程控制-使用Scanner类从键盘获取数据_哔哩哔哩_bilibili 1.接收输入 步骤 例子 2.生成随机数 3.switch-case 4.for 5.while

本地jar导入maven

一、通过dependency引入 1.1. jar包放置&#xff0c;建造lib目录 1.2. pom.xml文件 <dependency><groupId>zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.2</version><!--system&#xff0c;类似provided&#x…

网络规模与性能优化的一篇随笔

本周写篇轻松的话题&#xff0c;注意信息传输的尺度和缩放比例&#xff0c;写篇随笔。 控制面和数据面随规模缩放的影响&#xff0c;举几个例子就能说明白。 CSMA/CD&#xff0c;控制面和数据面在一起&#xff0c;控制信息交互时延和数据面时延在同一尺度时&#xff0c;就到了…

本周Github有趣项目:draw-a-ui等

有趣的项目、工具和库 gpt-crawler 抓取网站以生成知识文件&#xff0c;从而从 URL 创建您自己的自定义 GPT。 需要步骤&#xff1a; 配置运行爬虫、 将您的数据上传到 OpenAI&#xff1a;使用此选项通过 UI 访问您生成的知识&#xff0c;您可以轻松与他人共享 创建自定义助…