【JavaEE 初阶(十)】JVM

❣博主主页: 33的博客❣
▶️文章专栏分类:JavaEE◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你了解更多进阶知识

在这里插入图片描述

目录

  • 1.前言
  • 2.JVM内存区域划分
  • 3.类加载
    • 3.1双亲委派模型
  • 4.垃圾回收(GC)
    • 4.1垃圾识别
      • 4.1.1引用计数
    • 4.1.2可达性分析
    • 4.2垃圾释放
    • 4.2.1标记释放
    • 4.2.2复制算法
    • 4.2.3标记整理
    • 4.2.4分代回收
  • 5.总结

1.前言

JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统,JVM本省是一个比较复杂的东西,我主要从三个方面进行讲述:内存区域划分,类加载机制垃圾回收算法。

2.JVM内存区域划分

JVM其实就是一个进程,进程在运行过程中,要从操作系统申请资源空间,JVM申请的空间会划分为几个不同的区域,每个区域作用各不相同。这些资源支持了后续Java程序的执行。
在这里插入图片描述
堆区:整个进程只有一份,代码中new出来的对象,对象中的非静态成员变量,放在堆区
栈区:虚拟机栈记录了JAVA代码中的调用关系,java局部变量。
程序计数器:专门用来存储下一条Java指令的地址
元数据:整个进程只有一份,一些辅助性质的,描述性质的属性,我们所写的JAVA代码,各种逻辑运算,会通过javac完成代码转换成字节码,此时这些字节码在程序运行时就会被JVM加载到元数据中,此时当前程序如何执行,做哪些事就按照上述元数据区记录的字节执行。
下列元素n,m,t各在什么区?

class Test{
int n;
static int m;
}
main(){
Test t=new Test();
}

t为局部变量在栈区
new Test在堆区
n是成员变量也在堆中
m是static修饰,类属性在元数据区

3.类加载

类加载就是指JAVA程序运行是,把.class文件从硬盘中读到内存,再进行一系列解析。
类加载大致可以分为5步:
1)加载
把硬盘上的.class文件找到,打开文件读取文件内容
2)验证
确保读到的文件内容是合法的
3)准备
给类申请内存空间,默认值为全0
4)解析
主要针对类中的字符串常量进行处理
例如有一串代码为String s=”hello";s变量存入的是hello的地址,但是再.calss文件中不纯在地址的概率,那么为了就可以给s填一个偏移量。
在这里插入图片描述

5)初始化
把类对象的各个部分的属性进行赋值填充

3.1双亲委派模型

在类加载的时候有一个重要模型就是双亲委派模型,描述了如何找到.class文件。在进行加载操作的时候有一个专门的模块叫做类加载器,默认含有三个
BootstrapClassLoader:负责查找标准库的目录
ExtensionClassLoader:负责查找扩展库的目录
ApplicationClassLoader:负责查找当前项目的代码目录,第三方库目录
上述三个类加载器存在父子关系,类似于二叉树,有一个指针指向父类加载器
在这里插入图片描述
双亲委派工作流程:
1)从ApplicationClassLoader作为入口,开始工作
2)ApplicationClassLoader不会立即搜索自己负责的目录,会把搜索的任务交给自己的父亲
3)进入ExtensionClassLoader,也不会立即搜索自己负责的目录,也会把搜索的任务交给自己的父亲
4)进入BootstrapClassLoader,不会立即搜索自己负责的目录,也会把搜索的任务交给自己的父亲
5)BootstrapClassLoader发现自己没有父亲节点,此时会真正的搜索负责的目录,如果找到了就执行后续操作,没有找到就返回给孩子
6)ExtensionClassLoader收到父亲的任务以后,会搜索自己负责的目录,如果找到了就执行后续操作,没有找到就返回给孩子
7)ApplicationClassLoader收到父亲的任务以后,会搜索自己负责的目录,如果找到了就执行后续操作,没有找到就返回给孩子,但如果没有孩子就说明类加载失败,抛出ClassNotFoundException

4.垃圾回收(GC)

垃圾回收是回收的内存,其中主要回收的是堆中的内存,栈中的内存在代码块结束以后会自动销毁。那么垃圾回收具体是怎么展开的呢?主要分为垃圾识别和垃圾释放

4.1垃圾识别

判定new出来的对象在后续是否要使用,如果不再使用旧标记为垃圾。
例:

void func(){
Test t=new Test();
t.find();
}

当程序执行到}时,t就被释放,此后就不再使用new Test()对象了,就可以标记为垃圾,但如果有些大妈比较复杂,例如

Test t=new Test();
Test m=t;
Test n=m;
Test z=n;

此时就有很多引用指向new Test()对象,就学要确保没有任何一个引用指向这个对象才能标记为垃圾,那么我们怎么知道什么时候没有引用指向它呢?

4.1.1引用计数

当我们创建一个对象时,给每个对象分配一个额外的空间记录当前对象有几个引用。
在这里插入图片描述
每增加一个引用,计数位置+1,每减少一个引用,技术位置-1,如果为0就标记为垃圾
问题一
这样会消耗额外的空间,当我们的对象非常多,但对象的体积非常小,那么久可能导致计数所占的空间就占了所有空间的大部分。
问题二
可能会引起循环引用,那么就永远释放不了资源

class Test{
Test t;
}
Test a=new Test();
Test b=new Test();
a.t=b;
b.t=a;
a=null;
b=null;

在这里插入图片描述
这俩对象不能再使用也释放不了

4.1.2可达性分析

在写代码的时候会定义很多变量,就可以从这些变量作为起点开始遍历,所谓的遍历就是会沿着这些变量的引用类型成员再京一部访问,所有能被访问到的自然不是垃圾
在这里插入图片描述

4.2垃圾释放

4.2.1标记释放

最直接的方法就是把标记为垃圾的直接释放掉:但是这样会生成很多内存碎片,后续如果有类对象再申请空间可能就不够用
在这里插入图片描述

4.2.2复制算法

把一个空间分成两半,假设数据存放于左半边那么把不是垃圾的数据全部赋值到右半再讲左半数据全部释放掉。
灰色为垃圾标记,数字为数据
在这里插入图片描述
在这里插入图片描述
这样总的内存空间减少,且复制的开销也很大。

4.2.3标记整理

在这里插入图片描述
在这里插入图片描述
该方案是把所有的数据依次向前搬运,覆盖掉垃圾区,再把剩下的垃圾进行释放。
虽然这样能解决内存碎片的问题,但搬运的内存开销很大

4.2.4分代回收

JVM中有专门的线程负责周期性扫描,一个对象如果被扫描了一次,年龄就+1,JVM会根据对象年龄的差异,把整个堆分成2部分,新生代,老年代。
在这里插入图片描述
1)当代码中new出一个新的对象,这个对象就是被创建在伊甸区,伊甸区的对象大部分都活不够第一轮,生命周期非常短
2)第一轮GC扫描完成以后,少数伊甸区幸存的对象会通过复制算法拷贝到生存区,在后续GC扫描的时候不仅会扫描伊甸区还会扫描生存区的对象,生存区的大多数对象也会在扫描中被标记为垃圾,少数存活,就会继续通过复制算法拷贝到另一个生存区,每次经历一轮GC年龄就+1.
3)如果这个对象在生存区中经历了若干轮依然在,那么就会把这个对象拷贝到老年区。
4)老年代的对象也会被GC扫描只是频次大大减小
5)对象在老年代结束以后就会释放内存。

5.总结

本篇文章主要JVM内存区域划分,类加载,双亲委派模型,垃圾识别,引用计数,可达性分析,垃圾释放,分代回收等等。

下期预告:MySQL

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

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

相关文章

结构体变量的创建和初始化以及内存对齐

前言 嗨,我是firdawn,在本章中我们将介绍,结构体变量的创建和初始化,结构成员访问操作符以及结构体的内存对齐,下面是本章的思维导图,接下来,让我们开始今天的学习吧! 一&#xf…

下载CentOS系统或者下载Ubuntu系统去哪下?

因为Centos官网是挂在国外的服务器上,下载镜像时相比于国内的下载速度会慢很多,分享国内的镜像站去阿里巴巴下载Centos镜像。 首先分享两种下载方式,如果只想下载Centos那么就访问方式一的下载地址即可,如果还想下载其他的系统&a…

AI大模型探索之路-实战篇5: Open Interpreter开放代码解释器调研实践

系列篇章💥 AI大模型探索之路-实战篇4:DB-GPT数据应用开发框架调研实践 目录 系列篇章💥前言一、何为Open Interpreter?二、与 ChatGPT 的代码解释器比较三、 Open Interpreter的特性1、强大的本地计算能力2、丰富的功能3、高度的…

基于springboot+vue的招聘信息管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

生产物流智能优化系统

对生产调度、物流调度【车辆路径问题、配送中心拣选问题】智能优化算法研究形成系统性程序,逐步开发设计一个智能优化系统【包括:问题说明、实验界面、算法结构和算法程序应用说明】, 当前完成TSP和集送车辆路径的算法程序,程序效…

产品经理-需求分析(三)

1. 需求分析 从业务的需要出发,确定业务目的和目标,将业务需求转为产品需求 1.1 业务需求 业务需求 业务动机 业务目标 就是最根本的动机和目标成果,通过这个需求解决特定的问题 1.2 产品需求 产品需求 解决方案 产品结构 产品流程…

Java进阶学习笔记8——单继承、Object类、方法重写

Java 是单继承的,Java中的类不支持多继承,但是支持多层继承。 Object类是所有类的父类。 Java不支持多类继承: Java支持多层继承: 反证法: Object类: Object类是java所有类的祖宗类,我们写的任…

Excel中Lookup函数

#Excel查找函数最常用的是Vlookup,而且是经常用其精确查找。Lookup函数的强大之处在于其“二分法”的原理。 LOOKUP(查找值,查找区域(Vector/Array),[返回结果区域]) 为什么查找区域必须升序/…

2024年全国大学生电工数学建模竞赛B题解析 | 数据处理 代码 论文分享

B 题:大学生平衡膳食食谱的优化设计及评价 1 数据预处理2 问题一2.1 问题1.12.1.1 评价体系的构建2.1.2 指标计算2.1.3 指标计算结果2.1.4 基于层次分析法的膳食营养评价模型2.1.5 评价模型的求解 2.2 问题1.22.2.1 食物与成分间拓扑关系的构建2.2.2 微调模型的建立…

内网(极空间)搭建gitlab跳板机转发端口及域名配置

背景说明 https://blog.csdn.net/GodDavide/article/details/139182475 上文说到: 我已经用docker搭好了gitlab-ce服务,但我是部署在自己的家庭nas-极空间z4pro里的,属于内网环境。 另外我有一台阿里云服务器,做跳板机。 我有一个阿里的域名…

跟TED演讲学英文:Bring on the learning revolution! by Sir Ken Robinson

Bring on the learning revolution! Link: https://www.ted.com/talks/sir_ken_robinson_bring_on_the_learning_revolution Speaker: Sir Ken Robinson Date: February 2010 文章目录 Bring on the learning revolution!IntroductionVocabularySummaryTranscriptAfterword I…

基于DdddOcr通用验证码离线本地识别SDK搭建个人云打码接口Api

前言 最近介绍了一款免费的验证码识别网站,识别效率太低,考虑到ddddocr是开源的,决定搭建搭建一个,发现原作者sml2h3已经推出好久了,但是网上没有宝塔安装的教程,于是本次通过宝塔搭建属于自己的带带弟弟OCR通用验证码离线本地识别 原项目地址:https://github.com/sml2…

Project Reactor 响应式编程

Project Reactor 响应式编程 什么是响应式编程 响应式编程(Reactive Programming)是一种编程范式,致力于处理异步数据流和变化。它的核心思想是构建响应于变化的系统,即当数据流或事件发生变化时,系统能够自动地调整…

【研发日记】【策划向】(一)游戏策划其实就是一道加减法题

文章目录 序设计的过程其实是控制自己欲望的过程我海纳百川,你要不要看看?我跟别人不一样!我的人设就是没有人设,或者说任何人设都是我的人设 记 序 不知不觉进入这个行业几年了,也经历了独立开发和团队开发的过程。在…

【第1章】SpringBoot入门

文章目录 前言一、版本要求1. SpringBoot版本2. 其他2.1 System Requirements2.2 Servlet Containers2.3 GraalVM Native Images 3. 版本定型 二、新建工程1.IDEA创建 ( 推荐 ) \color{#00FF00}{(推荐)} (推荐)2. 官方创建 三、第一个SpringBoot程序1. 引入web2. 启动类3. 启动…

【Spring】SSM介绍_SSM整合

1、SSM介绍 1.1简介 SSM(Spring SpringMVC MyBatis)整合是一种流行的Java Web应用程序框架组合,它将Spring框架的核心特性、SpringMVC作为Web层框架和MyBatis作为数据访问层框架结合在一起。这种整合方式提供了从数据访问到业务逻辑处理再…

【Text2SQL】WikiSQL 数据集与 Seq2SQL 模型

论文:Seq2SQL: Generating Structured Queries from Natural Language using Reinforcement Learning ⭐⭐⭐⭐⭐ ICLR 2018 Dataset: github.com/salesforce/WikiSQL Code:Seq2SQL 模型实现 一、论文速读 本文提出了 Text2SQL 方向的一个经典数据集 —…

Aligned Layer:trustless应用的通用验证层

1. 引言 Aligned Layer近期获得了2000万美金的A轮融资,Aligned Layer: 致力于成为 去中心化 zero-knowledge (ZK) proof 验证层。旨在为不同证明系统,提供快速、经济且可扩展的零知识证明验证。作为以太坊生态系统及其他生态系统的通用sour…

【pyspark速成专家】4_Spark之RDD编程2

目录 四,常用PairRDD的转换操作 五,缓存操作 四,常用PairRDD的转换操作 PairRDD指的是数据为长度为2的tuple类似(k,v)结构的数据类型的RDD,其每个数据的第一个元素被当做key,第二个元素被当做value. reduceByKey #reduceByKey…

罗德里格斯公式(旋转矩阵)推导

文章目录 1. 推导2. 性质3. 参考 1. 推导 r r r为旋转轴, θ \theta θ为旋转角度。 先将旋转轴单位化 u r ∣ ∣ r ∣ ∣ u\frac{r}{||r||} u∣∣r∣∣r​ 旋转可以被分为垂直和旋转两个方向, 我们求沿轴方向的分量其实就是在求 p p p向量在 u u u方…