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

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

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

    (2)可达性分析(JVM)

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

    4.5 释放垃圾

    (1)标记清除

    在这里插入图片描述

    (2)复制清除

    在这里插入图片描述

    (3)标记整理

    在这里插入图片描述

    (4)分代回收(JVM)

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

  • 相关阅读:
    面对复杂的数据难题,如何选择数据治理平台
    PsychoPy Coder 心理学实验 斯特鲁普效应
    kubernetes集成GPU原理
    详解TCP/IP协议第一篇:网络基础知识
    vue3中使用echarts:legend点击事件问题、tooltip的trigger为axis tooltio不显示问题
    嵌入式Linux入门-手把手教你初始化SDRAM(附代码)
    Technical Support
    Vue3.0 实现支持搜索和筛选的用户列表(带动画过渡效果)
    Jenkins Docker Swarm插件 配置的坑
    python集合
  • 原文地址:https://blog.csdn.net/m0_68101404/article/details/134423715