【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)

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JVMJava虚拟机)内存模型垃圾回收Java程序中重要的概念。JVM内存模型定义了Java程序在运行时所使用的内存结构,而垃圾回收是一种自动化的内存管理机制,用于回收不再使用的对象以释放内存空间。 JVM内存模型主要包括以下几个部分: 1. 堆(Heap):堆是JVM中最大的一块内存区域,用于存储对象实例。在堆中分配的内存垃圾回收器自动管理。 2. 方法区(Method Area):方法区用于存储类的信息、常量、静态变量等数据。在JDK 8及之前的版本中,方法区被实现为永久代(Permanent Generation),而在JDK 8之后,被改为元空间(Metaspace)。 3. 虚拟机栈(VM Stack):每个线程在运行时都会创建一个虚拟机栈,用于存储局部变量、方法调用和返回信息等。每个方法在执行时都会创建一个栈帧(Stack Frame),栈帧包含了方法的局部变量表、操作数栈、动态链接、返回地址等信息。 4. 本地方法栈(Native Method Stack):本地方法栈与虚拟机栈类似,但用于执行本地方法(Native Method)。 垃圾回收JVM的一项重要功能,它负责自动回收不再使用的内存JVM中的垃圾回收器会定期扫描堆中的对象,标记出不再被引用的对象,并将其回收释放。垃圾回收可以有效地避免内存泄漏和内存溢出的问题,提高程序的性能和稳定性。 JVM内存模型垃圾回收Java程序员需要了解和理解的重要概念,它们直接影响到Java程序的性能和内存使用情况。合理地管理内存和优化垃圾回收对于编写高效、稳定的Java程序至关重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值