当前位置: 首页 > news >正文

【Java EE初阶 --- 网络原理】JVM

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言 ,Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

文章目录

  • 前言
  • JVM内存区域划分
    • 程序计数器
    • 元数据区
  • JVM类加载
    • 类加载的步骤
    • 双亲委派模型
  • 垃圾回收(GC)
    • 分代回收
  • 完结

前言

JVM(Java Virtural Machine) ,简称Java虚拟机:指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。它是Java运行的基础,也是实现”一次编译,到处运行“的关键。

JVM内存区域划分

真实的操作系统中,对进程的地址空间进行了区分设计,JVM仿照操作系统的情况,也要进行分区设计。
在这里插入图片描述
JVM核心区域有四个

程序计数器

作用:用来记录当前线程执行的行号
只占一块很小的内存空间,可以看作是当前指令执行到的地址

元数据区

指作用:保存当前类加载好的数据
Java代码想要运行就需要把 .java文件转化成 .calss字节码文件,再加载到内存中(内加载)。而元数据区就是用来存放这些数据的区域

指作用:保存方法的调用关系
每次调用方法时,就会进入方法内部执行,方法执行完毕,返回调用位置,继续向后执行。

指作用:程序中创建的所有对象都保存在堆中
Test t = new Test();
指如果 t 是一个局部变量,t 就在栈上
如果 t 是一个成员变量,t 就在堆上
如果 t 是一个静态成员变量,t 就在元数据区上
在这里插入图片描述
堆是JVM中最大的空间区域

JVM类加载

Java中默认提供了三种加载器:BootstrapClassLoader(Java标准库的目录)、ExtensionClassLoader(Java扩展库的目录)、ApplicationClassLoader(Java的第三方库)

类加载的步骤

1. 加载:找到.class文件,根据包名+类名(java.lang.String)打开文件,读取文件内容到内存中
2. 验证:解析,校验.class文件读到的内容,根据格式判断是否合法,并把内容转化成结构化数据
3. 准备:给类对象申请内存空间
4. 解析:针对字符串常量,进行初始化。就是把.class文件中解析出来的字符串常量放到元数据区中
5. 初始化:针对类对象进行最终的初始化;堆类对象的各种属性进行填充,如果这个类有父类且父类还没有加载,此环节触发父类加载

双亲委派模型

更准确的是父亲委派模型,描述了类加载中,根据全限定名找到.class文件的过程
在这里插入图片描述
约定优先级,先从Bootstrap开始找

垃圾回收(GC)

Java中释放内存的手段,还记得在C语言中,申请内存malloc,最后一定要手动释放free,否则会内存泄漏。Java觉得手动释放太麻烦,引入垃圾回收,进行自动释放。
找到垃圾(什么是垃圾?)
1. 引用计数(PHP/Python)
在这里插入图片描述

在Java中要想使用某个对象,就会自动触发引用计数的修改,如果引用计数为0,就说明没有引用指向这个对象,这个对象就是垃圾。 但是这种方法导致内存消耗更大
2. 可达性分析(Java)

引用计数空间开销很大,而可达性分析用时间换空间
首先用某些特定的对象作为起点,这些对象可以是栈上的局部变量、常量池引用指向的对象、静态成员等等,接下来去尽可能的遍历每个对象,能访问到的对象标记为“可达”,当所有的对象遍历完后,未被标记的对象就是“不可达”的,这些对象就是垃圾。

清除垃圾

  1. 把垃圾对象的内存直接进行释放,但是会产生内存碎片的问题
    在这里插入图片描述
  2. 复制算法:把内存空间一分为二,使用内存空间时只使用其中一个;把不是垃圾的对象拷贝到另一侧,然后释放掉之前使用的那一半空间。缺点是浪费空间,复制成本会很高。
  3. 标记整理:可达性分析标记出了不是垃圾的对象,把这些对象“搬运”到未被标记的空间。当然,内存开销也很大

分代回收

“代”指对象的“年龄”,某对象经过一轮GC(垃圾回收)可达性分析后,判断不是垃圾,此时对象年龄就+1。
一般情况:年龄越大,保留的可能性越大,年龄越小,保留的可能性越小
在这里插入图片描述

结合两种回收方法,复制算法的内存开销可控;标记整理的“搬运”负担也可以接受

完结


可以点一个免费的赞并收藏起来~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散 ~ ~ ~

http://www.lryc.cn/news/615140.html

相关文章:

  • 堆----3.数据流的中位数
  • 【Redis】Redis-plus-plus的安装与使用
  • 自定义通知组件跟随右侧边栏移动
  • SQL基本
  • 探索Trae:使用Trae CN爬取 Gitbook 电子书
  • 2025-08-09 李沐深度学习14——经典卷积神经网络 (2)
  • 生态问题是什么?
  • P1890 gcd区间
  • 如何理解SA_RESTART”被信号中断的系统调用自动重启“?
  • SELinux 入门指南
  • ROS2 多线程 与组件机制
  • Python NumPy入门指南:数据处理科学计算的瑞士军刀
  • Qt 的对象线程亲和性规则
  • 华为欧拉OpenEnler系统在启动MindIE时权限问题的解决方法
  • 从灵感枯竭到批量产出:无忧秘书创作平台如何重构内容生产者的工作流程?全环节赋能分析
  • Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例)
  • WinForm 中 ListView 控件的实战应用与功能拓展
  • kafka架构原理快速入门
  • AI大语言模型在生活场景中的应用日益广泛,主要包括四大类需求:文本处理、信息获取、决策支持和创意生成。
  • 软件定义车辆加速推进汽车电子技术
  • Blender 快捷键速查表 (Cheat Sheet)
  • 【线性代数】6二次型
  • 可直接运行的 Playwright C# 自动化模板
  • 通过 Certimate 统一管理 SSL 证书 支持自动化申请、全平台部署
  • 【线性代数】线性方程组与矩阵——(1)线性方程组与矩阵初步
  • 数据挖掘2.6 Perceptron Modeling 感知器建模
  • 我想做自动化报社保,用哪种技术更好一点呢?
  • stm32项目(25)——基于stm32的植物生长箱环境监测系统
  • 「iOS」————响应者链与事件传递链
  • GPT-5:数字大脑的进化史