JVM的基本概念

目录

一、JVM的内存划分

二、JVM的类加载过程

三、JVM的垃圾回收机制(GC)

四、分代回收


一、JVM的内存划分

一个运行起来的Java进程,就是一个Java虚拟机,就需要从操作系统中申请一大块内存。申请的内存会划分为不同的区域,每个区域有不同的作用。

1、方法区/元数据区 存储的内容为类对象

2、 存储的内容为代码中new的对象

3、代码执行过程中,方法之间的调用关系

4、程序计数器 存放“地址”,表示下一条指令在内存的哪个地方

其中,栈和程序计数器每个线程都有一个。

一个变量处于哪个区域和变量的形态密切相关

局部变量处于栈上

成员变量处于堆上

静态变量(类属性)处于方法区/元数据区上

局部变量和成员变量的区别

1.在类中的位置不同

成员变量:在类中,方法外

局部变量:在方法定义中或者方法声明上

2.在内存中的位置不同:

成员变量:在堆内存中

局部变量:在栈内存中

3.生命周期不同:

成员变量:随着对象的创建而存在,随着对象的消失而消失

局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

4.初始化值不同

成员变量:有默认的初始化值

局部变量:没有默认的初始化值,必须定义、赋值,然后才能使用。

二、JVM的类加载过程

Java程序想要运行起来,就需要让JVM读取到Java中的文件,并且把里面的内容构造成类对象,保存在内存的方法区中。

基本流程:

1、加载

找到.class文件,打开文件,读取文件内容。往往代码中会给某个类“全限定类名”,方便区分。

例如:java.long.String java.util.ArrayList

JVM就会根据这个类名,在一些指定的目录范围内查找。

2、验证

.class文件是一个二进制的格式(每个字节都是有特定含义的),就需要验证当前读到的这个格式是否符合要求。

3、准备

给类对象分配内存空间,只是分配空间,还没有初始化。

4、解析

针对类对象中的字符串常量进行处理,进行一些初始化操作,这个过程把“符号引用”替换成“直接引用”。

5、初始化

针对类对象进行初始化,把类对象中的各个属性都设置好。

三、JVM的垃圾回收机制(GC)

在Java中,new一个对象,也就是“动态内存申请”,当内存不再使用,JVM会自行判断,如果这个内存后面确实不用了,JVM就会自动的把这个内存给回收。

GC的缺陷:

1、系统开销大,要有特定的线程进行扫描

2、效率问题,扫描线程要有一定的周期,不能及时释放

回收步骤:

1、找到要回收的对象,利用可达性分析

有一组线程,周期性的扫描代码中的所有对象,从特定的对象出发,尽可能的进行访问的遍历,把所有能够访问的对象,都标记成“可达”,反之,经过扫描后,未被标记的对象,就是需要回收的垃圾。

2、释放垃圾

1、标记清除

直接把垃圾进行释放,可能会产生很多的内存碎片。

2、复制算法

通过复制的方式,把有效的对象,归类在一起,再统一进行释放。


把内存分成两份,如果1、3、5是垃圾,就把2、4复制到另一份,然后把前一份整体释放。

优点:可以有效的解决内存碎片化的问题

缺点:1、内存要浪费一半,利用率不高

           2、如果有效对象非常多,拷贝的开销就非常大

3、标记整理

如果1、3、5是垃圾,就将2、4往前搬运,然后整体释放。

既能解决内存碎片化的问题,又能处理算法的利用率,但是搬运的开销很大。

四、分代回收

实际上,JVM采用的思路是基础思路的结合体,分代回收。


在新生代中会包含伊甸区和幸存区

伊甸区:刚new出来的新对象,放到伊甸区。从对象诞生,到第一轮扫描分析,这个时间不长,但是,在这个时间里,大部分对象都会变成无用的对象。

幸存区:

1、伊甸区到幸存区

复制算法,每一轮GC扫描后,都能把有效对象复制到幸存区,伊甸区就可以整体释放了。

2、幸存区到幸存区

GC扫描线程也会扫描幸存区,就会把可达的对象,拷贝到幸存区的另一部分。

会进行多轮扫描,每一轮会拷贝很多对象,也会淘汰一部分对象。

3、幸存区到老年代

当对象经过多轮扫描后,JVM认为这个对象短期无法释放,就会把这个对象拷贝到老年代。

老年代:

进入老年代的对象,虽然也会被GC扫描,但频率会降低很多,可以减少开销。

新生代,主要使用复制算法。

老年代,主要使用标记整理。


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

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

相关文章

5.工欲善其事,必先利其器!收集金融数据你必须先做这个!

在正式从网络上获取数据并存储到我们的数据库之前,我们还需要做一些准备工作。其中最重要的无疑是把Python环境配置好。 你可以不好好学习Python,毕竟我后边会一步步教大家,也会提供现成的Python脚本。但是你必须得在你的电脑上把Python安装…

基于51单片机无线蓝牙智能家居控制系统设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图![请添加图片描述](https://i-blog.csdnimg.cn/direct/c25dac9c3044416385d22a655dee5c3d.jpeg)设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff…

LLM安全风险及应对

LLM安全风险主要从四个维度分析:用户输入、训练数据、模型本身以及工具和插件。 风险类别具体风险风险解释应对措施具体举例用户输入相关风险提示注入(Prompt Injection)攻击者通过设计特定输入,使模型生成恶意或不安全的输出。- …

FLStudio21Mac版flstudio v21.2.1.3430简体中文版下载(含Win/Mac)

给大家介绍了许多FL21版本,今天给大家介绍一款FL Studio21Mac版本,如果是Mac电脑的朋友请千万不要错过,当然我也不会忽略掉Win系统的FL,链接我会放在文章,供大家下载与分享,如果有其他问题,欢迎…

【成神之路】Ambari实战-011-代码生命周期-metainfo加载原理深度剖析

在 Ambari 中,metainfo.xml 是定义服务和组件的关键配置文件。Ambari 通过解析它来加载和管理服务的整个生命周期。今天,我们将深入探索 metainfo.xml 是如何被解析的,并以 Redis 集群服务为例,逐步解读 Ambari 的处理过程。&…

cv中每个patch的关联

在计算机视觉任务中,当图像被划分为多个小块(patches)时,每个 patch 的关联性可以通过不同的方法来计算。具体取决于使用的模型和任务,以下是一些常见的计算 patch 关联性的方法: 1. Vision Transformer (…

Java : 图书管理系统

图书管理系统的作用: 高效的图书管理 图书管理系统通过自动化管理,实现了图书的采编、编目、流通管理等操作的自动化处理,大大提高了图书管理的效率和准确性。 工作人员可以通过系统快速查找图书信息,实时掌握图书的借还情况&…

【comfyUI工作流】一键生成专属欧美漫画!

现在你不需要在webui上手动设置一堆的参数 来将自己的照片转绘成欧美漫画插画 可以通过我制作的工作流一键完成转绘,更加效率便捷, 而且不需要你懂什么专业的AI绘画知识,会打开工作流,上传图片就可以 工作流特点 真实照片一键…

程序员的AI时代:拥抱变革,塑造未来

你们有没有想过,如果有一天,你的编程工作被一个AI助手取代了,你会怎么办?这不是危言耸听,随着AIGC技术的飞速发展,这样的场景可能真的会出现。但是,别担心,今天我们就来聊聊&#xf…

XSS—xss-labs靶场通关

level 1 JS弹窗函数alert() <script>alert()</script> level 2 闭合绕过 "> <script>alert()</script> <" level 3 onfocus事件在元素获得焦点时触发&#xff0c;最常与 <input>、<select> 和 <a> 标签一起使用…

[Excel VBA办公]如何使用VBA批量删除空行

在处理Excel数据时&#xff0c;空行可能会干扰数据分析和展示。以下是一个VBA代码示例&#xff0c;帮助你批量删除工作表中的空行。 1. 代码说明 此代码将遍历指定工作表&#xff0c;删除所有空行&#xff0c;确保数据整洁。 2. VBA代码 删除sheet1的空行 Sub DeleteEmptyRow…

re题(39)BUUCTF-[FlareOn3]Challenge1

BUUCTF在线评测 (buuoj.cn) 查壳是32位&#xff0c;ida打开&#xff0c;进入main函数&#xff0c;进入sub_401260看看 查看byte_413000存的字符串 _BYTE *__cdecl sub_401260(int a1, unsigned int a2) {int v3; // [espCh] [ebp-24h]int v4; // [esp10h] [ebp-20h]int v5; //…

19 基于51单片机的倒计时音乐播放系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 五个按键&#xff0c;分别为启动按键&#xff0c;则LCD1602显示倒计时&#xff0c;音乐播放 设置按键&#xff0c;可以设置倒计时的分秒&#xff0c;然后加减按键&#xff0c;还有最后一个暂停音乐…

项目集成sharding-jdbc

目录 项目集成sharding-jdbc 1.业务分析 2.数据库构建 3.分库分表策略 项目配置默认数据源 一&#xff1a;导入sharding-jdbc依赖 二&#xff1a;在application文件中编写配置 三&#xff1a;注释掉主配置文件中配置的数据源 注意&#xff1a;这里添加了spring.main.allow…

芝士AI论文写作|开题报告、论文生成、降重、降AI、答辩PPT

芝士AI&#xff0c;免费论文查重软件,为毕业生提供专业的AI论文生成、强力降重、AIGC降低、论文重复率检测、论文降重、学术查重、学术检测、PPT生成、学术论文观点剽窃检测等一站式服务。免费论文查重_芝士AI&#xff08;PaperZZ&#xff09;论文检测__PaperZZ论文查重 是不是…

Snap 发布新一代 AR 眼镜,有什么特别之处?

Snap 发布新一代 AR 眼镜&#xff0c;有什么特别之处&#xff1f; Snap 简介 新一代的 AR 眼镜特点 Snap 简介 Snap 公司成立于 2010 年&#xff0c;2017 年美国东部时间 3 月 2 日上午 11 时许&#xff0c;在纽交所正式挂牌交易&#xff0c;股票代码为 “SNAP”。其旗下的核…

QT 信号和槽函数

信号和槽函数介绍 conncet(sender, signal, receiver, slot) /* * 1. 信号发出者&#xff1b; * 2. 信号&#xff1b; * 3. 信号接收者&#xff1b; * 4. 接受到信号执行任务&#xff1b; 槽函数 */自定义信号和槽函数 场景 &#xff1a;老师饿了&#xff0c;学生请客&#xf…

使用 KMeans 聚类算法 对鸢尾花数据集进行无监督学习的简单示例

代码功能 主要功能&#xff1a; 加载数据集&#xff1a; 代码使用 load_iris() 函数加载了鸢尾花数据集&#xff08;Iris dataset&#xff09;。这个数据集包含 150 条样本&#xff0c;每条样本有 4 个特征&#xff0c;对应于 3 种不同的鸢尾花。 KMeans 聚类&#xff1a; 使用…

Kafka-Manager安装及操作

文章目录 一、kafka-manager介绍二、kafka-manager安装三、Kafka-Manager操作 一、kafka-manager介绍 CMAK (Cluster Manager for Apache Kafka, previously known as Kafka Manager) CMAK (previously known as Kafka Manager) is a tool for managing Apache Kafka cluster…

Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链【本系列文章的分析重点】

文章目录 CC1链的第二种方式-LazyMap版调用链LazyMap构造payloadCC1的调用链 系列篇其他文章&#xff0c;推荐顺序观看~ Java反序列化利用链篇 | JdbcRowSetImpl利用链分析Java反序列化利用链篇 | CC1链_全网最菜的分析思路【本系列文章的分析重点】Java反序列化利用链篇 | CC1…