JVM部分内容

news2025/5/24 4:31:53

1.JVM内存区域划分

为什么要划分内存区域,JAVA虚拟机是仿照真实的操作系统进行设计的,JVM也就仿照了它的情况,进行了区域划分的设计。

JAVA进程也就是JAVA虚拟机会从操作系统申请内存空间给进程使用,JVM内存空间划分,就相当于JVM进程自身从操作系统申请到内存空间,再把内存空间按照不同的功能进行分配。

1.具体划分

1.程序计数器

这是一个很小的区域,只是用来记录当前指令执行到哪个地址了。

2.元数据区

保存当前类被加载好的对象

3.栈

保存方法的调用关系。

每次调用方法,就会进入方法内部执行,当执行完毕就会返回调用位置,继续往后走。

栈这个空间不大,一般是几十几百MB,大部分情况下是够用的,少数情况下可能会出现栈溢出。

4.堆

保存new的对象

Test t = new Test();

左边的t如果是一个局部变量,t就是在栈上。如果是一个成员变量,t就是在堆上。如果是一个静态成员变量,t就是在元数据区。

右边的new Tests()一定是在堆上。

堆是JVM中最大的空间区域,往集合类里添加元素也是保存在堆里,如果堆上的对象不再使用的话,就会被释放掉(垃圾回收)。

方法元信息和类元信息都是类对象提供的,指的是一些属性,比如类叫什么名字,是不是public,继承自哪些类,实现了哪些接口......方法叫什么名字,参数有几个,返回值是什么类型......

元数据区和堆整个JAVA进程共用一份,

程序计数器和栈一个进程中可能有多份(一个线程一份)

2.类加载机制

1.类加载的步骤

类加载一共有三个阶段,其中第二个阶段又被分为3个步骤,所以一共有5个步骤。

1).加载:找到.class文件

根据类的全限定名(包名+类名,形如java.lang.String),打开文件,读取内容到内存中。

2).验证:解析,校验.class文件读到的内容是否是合法的,并且把这里的数据转成结构化的数据。.class文件这个二进制文件格式是由明确要求的。JAVA写的代码都会转到下面这个.class中,只不过会换成二进制的表现形式。

magic表示魔数,区分不同的二进制文件类型,这是一个固定值,不同的二进制文件有不同的取值

u4表示4个字节的无符号位整数,u2表示2个字节的无符号位整数。

cp_info,method_info......表示其他的结构体。

3).准备:给类对象申请内存空间,此处申请的内存空间相当于是"全0"空间。

4).解析:针对字符串常量进行初始化。

字符串常量本身就包含在.class文件中,需要把文件中的字符串常量解析出来放到内存空间里(元数据区,常量池)

5).初始化

针对刚才谈到的类对象进行最终的初始化,针对类对象的各种属性进行填充,包括类中的静态成员。如果这个类有父类,而且这个父类没有被加载,那么这个父类也会触发类加载。

6).类加载触发的时机

这里使用懒汉模式,用到哪个类就加载哪个类

1.构造某个类的实例

2.调用/使用类静态属性,静态方法

3.使用某个类的时候,如果这个类的父类还没有加载,那么就会给这个父类触发类加载

2.双亲委派模型

这个模型描述了类加载中,根据全限定类名找到.class文件的过程。

JVM中有专门的模块负责类加载,叫做类加载器。JVM提供了三种类加载器,分别是BootstrapClassLoader,ExtentionClassLoader,ApplicationClassLoader。

它们三个并不是父类子类关系,而是使用parent引用指向。这三个类加载器首当其冲的就是找.class文件

寻找过程

先从ApplicationClassLoader作为入口开始,然后把加载类的过程委托给父类完成

父类ExtentionClassLoader不会立即开始查找,而是把任务委托给它的父类完成

BootstrapClassLoader也想委托给父类,可是它没有父类,只能自己进行类加载,根据类名找标准库范围,是否存在匹配的.class文件

BootstrapClassLoader没有找到就会把任务归还给子类ExtentionClassLoader,接下来ExtentionClassLoader就会进行查找。

ExtentionClassLoader没有找到就会把任务归还给子类ApplicationClassLoader,接下来ApplicaitonClassLoader就会进行查找,没找到就抛出异常。

程序员是可以自定义类加载器的,自定义的时候可以把类加载器放到双亲委派模型当中也可以不放在里面。

3.垃圾回收机制

就是指JAVA释放内存的手段

1.GC如何回收各个区域

1.程序计数器,线程销毁,自然就释放

2.栈,方法执行结束,栈帧就结束,自然就释放

3.元数据区,类对象一般不会释放

4.堆,创建很多对象,会有旧的对象消亡。

说是“回收内存”,本质上是“回收对象”

2.找垃圾

1.引用计数

这个方案是python,php在使用

每个对象在new的时候都会搭配一个小的内存空间,这个空间保存一个整数用来计数,这个整数表示当前有多少个引用指向它。如果引用计数为0,就表示这是个垃圾。

缺点

1.内存消耗得更多,尤其是对象本身比较小时,引用计数消耗的比例就更大

2.可能出现“循环引用”的问题

此时虽然这两个对象引用计数不为0,但是它们没法使用。

2.可达性分析

这个方案是java在使用

1.以代码中的特定对象作为遍历的起点"GCROOT"

这个对象可以是,栈上的局部变量,常量池引用指向的对象,静态成员

2.尽可能进行遍历

判定某个对象是否能遍历到

3.每次访问到一个对象都会把这个对象标记为“可达”,当完成所有对象的遍历之后,没有被标记成“可达”的对象就是“不可达”。一共有多少个对象JVM是知道的,知道哪些是可达的,那么剩下的就是不可达。

可达性分析的过程是周期性的。

3.回收垃圾

1.标记-清除

把垃圾对象的内存直接进行释放,这样做会产生内存碎片问题

这样会导致空闲的内存空间不是连续的,这样是无法申请一个大一些的内存的

2.复制算法

只使用一半的内存空间,当清理垃圾时,把不是垃圾的对象拷贝到另一半,然后整体回收。

这样使用内存的利用率比较低,同时当不是垃圾的对象比较多时,复制的开销大。

3.标记-整理

解决了空间碎片和内存利用率的问题。但是内存搬运的操作开销也比较大。

4.分代回收

这是JAVA使用的方案

当某个对象经过一轮GC之后,它的年龄就会加1

针对不同年龄的对象采取不同的策略

如果某个对象年龄比较大,那么它大概率还会继续存在很久(要死早死了,之所以没死,是因为有特殊之处)

新创建的对象就放到伊甸区,绝大部分伊甸区的对象是活不过第一轮GC的。伊甸区到幸存区使用的是复制算法,因为复制的规模小,开销可控

幸存区的对象也要经历GC的扫描,每一轮GC都会消灭一大部分对象,剩余的对象再经过复制算法复制到另一个幸存区

如果这个对象在幸存区经历了多次复制都存活了下来,就会晋升到老生代,老生代使用的就是标记-整理算法了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python-leetcode 68.有效的括号

题目: 给定一个只包括“(”),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足:左括号必须用相同类型的右括号闭合;左括号必须以正确的顺序闭合&#xff0c…

NLP学习路线图(四):Python编程语言

引言 自然语言处理(Natural Language Processing, NLP)是人工智能领域最引人注目的分支之一。从智能客服到机器翻译,从舆情分析到聊天机器人,NLP技术正在重塑人机交互的边界。本文将结合Python编程语言,带您走进NLP的…

Serverless爬虫架构揭秘:动态IP、冷启动与成本优化

一、问题背景:旧技术的瓶颈 在传统爬虫架构中,我们通常部署任务在本地机器或虚拟机中,搭配定时器调度任务。虽然这种方式简单,但存在以下明显缺陷: 固定IP易被封禁:目标网站如拼多多会通过IP频率监控限制…

从单体到分布式:深入解析Data Mesh架构及其应用场景与价值

Data Mesh(数据网格)是一种新兴的数据架构范式,旨在解决传统集中式数据平台的可扩展性、敏捷性和治理问题。它强调领域驱动的分布式数据所有权、自助数据平台以及跨组织的协作,使数据成为产品,并通过去中心化的方式提高…

AI大模型ms-swift框架实战指南(十三):Agent智能体能力构建指南

系列篇章💥 No.文章1AI大模型ms-swift框架实战指南(一):框架基础篇之全景概览2AI大模型ms-swift框架实战指南(二):开发入门之环境准备3AI大模型ms-swift框架实战指南(三&#xff09…

LLM最后怎么输出值 解码语言模型:从权重到概率的奥秘

LM Head Weights(语言模型头部权重):左侧的“LM Head Weights”表示语言模型头部的权重矩阵,它是模型参数的一部分。权重矩阵与输入数据进行运算。Logits(未归一化对数概率):经过与LM Head Weig…

Leetcode百题斩-回溯

回溯是一个特别经典的问题,也被排在了百题斩的第一部分,那么我们接下来来过一下这个系列。 这个系列一共八道题,偶然间发现我两年前还刷到这个系列的题,回忆起来当时刚经历淘系大变动与jf出走海外事件,大量同事离职闹…

超小多模态视觉语言模型MiniMind-V 训练

简述 MiniMind-V 是一个超适合初学者的项目,让你用普通电脑就能训一个能看图说话的 AI。训练过程就像教小孩:先准备好图文材料(数据集),教它基础知识(预训练),再教具体技能&#xf…

边缘云的定义、实现与典型应用场景!与传统云计算的区别!

一、什么是边缘云?‌ 边缘云是一种‌分布式云计算架构‌,将计算、存储和网络资源部署在‌靠近数据源或终端用户的网络边缘侧‌(如基站、本地数据中心或终端设备附近),而非传统的集中式云端数据中心。 ‌核心特征‌&…

Scrapy爬取heima论坛所有页面内容并保存到MySQL数据库中

前期准备: Scrapy入门_win10安装scrapy-CSDN博客 新建 Scrapy项目 scrapy startproject mySpider # 项目名为mySpider 进入到spiders目录 cd mySpider/mySpider/spiders 创建爬虫 scrapy genspider heima bbs.itheima.com # 爬虫名为heima ,爬…

com.alibaba.fastjson2 和com.alibaba.fastjson 区别

1,背景 最近发生了一件很奇怪的事:我们的服务向第三方发送请求参数时,第三方接收到的字段是首字母大写的 AppDtoList,但我们需要的是小写的 appDtoList。这套代码是从其他项目A原封不动复制过来的,我们仔细核对了项目…

了解Android studio 初学者零基础推荐(2)

在kotlin中编写条件语句 if条件语句 fun main() {val trafficLight "gray"if (trafficLight "red") {println("Stop!")} else if (trafficLight "green") {println("go!")} else if (trafficLight "yellow")…

C# 初学者的 3 种重构模式

(Martin Fowlers Example) 1. 积极使用 Guard Clause(保护语句) "如果条件不满足,立即返回。将核心逻辑放在最少缩进的地方。" 概念定义 Guard Clause(保护语句) 是一种在函数开头检查特定条件是否满足&a…

MySQL 数据类型深度全栈实战,天花板玩法层出不穷!

在 MySQL 数据库的世界里,数据类型是构建高效、可靠数据库的基石。选择合适的数据类型,不仅能节省存储空间,还能提升数据查询和处理的性能 目录 ​编辑 一、MySQL 数据类型总览 二、数值类型 三、字符串类型 四、日期时间类型 五、其他…

前端vscode学习

1.安装python 打开Python官网:Welcome to Python.org 一定要点PATH,要不然要自己设 点击install now,就自动安装了 键盘winR 输入cmd 点击确定 输入python,回车 显示这样就是安装成功了 2.安装vscode 2.1下载软件 2.2安装中文 2.2.1当安…

Index-AniSora技术升级开源:动漫视频生成强化学习

B站升级动画视频生成模型Index-AniSora技术并开源,支持番剧、国创、漫改动画、VTuber、动画PV、鬼畜动画等多种二次元风格视频镜头一键生成! 整个工作技术原理基于B站提出的 AniSora: Exploring the Frontiers of Animation Video Generation in the So…

ubuntu24.04+RTX5090D 显卡驱动安装

初步准备 Ubuntu默认内核太旧,用mainline工具安装新版: sudo add-apt-repository ppa:cappelikan/ppa sudo apt update && sudo apt full-upgrade sudo apt install -y mainline mainline list # 查看可用内核列表 mainline install 6.13 # 安装…

MATLAB贝叶斯超参数优化LSTM预测设备寿命应用——以航空发动机退化数据为例

原文链接:tecdat.cn/?p42189 在工业数字化转型的浪潮中,设备剩余寿命(RUL)预测作为预测性维护的核心环节,正成为数据科学家破解设备运维效率难题的关键。本文改编自团队为某航空制造企业提供的智能运维咨询项目成果&a…

鸿蒙应用开发:Navigation组件使用流程

一、编写navigation相关代码 1.在index.ets文件中写根视图容器 2.再写两个子页面文件 二、创建rote_map.json文件 三、在module.json5文件中配置路由导航 子页配置信息 4.跳转到其他页面 但是不支持返回到本页面的 用以下方式 以下是不能返回的情况 onClick(()>{this.pag…

【Linux】系统在输入密码后进入系统闪退锁屏界面

问题描述 麒麟V10系统,输入密码并验证通过后进入桌面,1秒左右闪退回锁屏问题 问题排查 小白鸽之前遇到过类似问题,但是并未进入系统桌面内直接闪退到锁屏。 之前问题链接: https://blog.csdn.net/qq_51228157/article/details/140…