JVM的基本概念

news2024/11/14 3:17:04

目录

一、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.coloradmin.cn/o/2157401.html

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

相关文章

Maven笔记(一):基础使用【记录】

Maven笔记(一)-基础使用 Maven是专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构 Maven提供了一套标准化的项目结构,所有IDE(eclipse、myeclipse、IntelliJ IDEA 等 项目开发工具) 使…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17 1. Large Language Models in Biomedical and Health Informatics: A Review with Bibliometric Analysis H Yu, L Fan, L Li, J Zhou, Z Ma, L Xian, W Hua, S He… - Journal of Healthcare …, 2024 生物…

HarmonyOS应用开发(组件库)--组件模块化开发、工具包、设计模式(持续更新)

致力于,UI开发拿来即用,提高开发效率 正则表达式...手机号校验...邮箱校验 文件判断文件是否存在 网络下载下载图片从沙箱中图片转为Base64格式从资源文件中读取图片转Base64 组件输入框...矩形输入框...输入框堆叠效果(用于登录使用&#xf…

【自动驾驶】决策规划算法(二)参考线模块Ⅰ| 平滑算法与二次规划

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

(学习记录)使用 STM32CubeMX——GPIO引脚输入配置

STM32F103C8T6的GPIO引脚输入配置 时钟配置 (学习记录)使用 STM32CubeMX——配置时钟(入门)https://blog.csdn.net/Wang2869902214/article/details/142423522 GPIO 引脚输出配置 (学习记录)使用 STM32…

Springcloud框架-能源管理系统-能源管理系统源码-能源在线监测平台-双碳平台

一、介绍 基于SpringCloud的能管管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 有需者咨询,非诚勿扰; 二、软件架构 二、功能介绍 三、数字大屏展示 四、数据采集原理 五、软件截图

macos pyenv 安装python tk 、tkinter图形库方法步骤和使用总结

在macos中, pyenv 是一款用来管理多版本python 的工具, 我们常用的tk图形库是一个独立的工具库,我们在python里面使用的tkinter模块仅是调用这个独立的tk图形库, 所以如果我们希望在python里面使用它, 就必须要先安装t…

委托的注册及注销+观察者模式

事件 委托变量如果公开出去,很不安全,外部可以随意调用 所以取消public,封闭它,我们可以自己书写两个方法,供外部注册与注销,委托调用在子方法里调用,这样封装委托变量可以使它更安全,这个就叫…

金融加密机的定义与功能

金融加密机是一种用于保护金融交易数据和信息安全的重要安全设备。它通过硬件和软件的多重保障,确保金融交易中的敏感数据不被泄露或篡改。以下是关于金融加密机的详细介绍: 一、定义与功能 金融加密机是一种硬件安全设备,通过实现各种密码算…

深度deepin初体验(一)系统详细安装过程 | 国产系统

这里写自定义目录标题 深度deepin初体验(一)系统详细安装过程1.介绍2.安装要求3.环境4.创建虚拟机/系统升级系统选择语言硬盘分区备份文件拷贝系统重启常规设置 深度deepin初体验(一)系统详细安装过程 1.介绍 深度deepin是在debi…

Python开发深度学习常见安装包 error 解决

Python Python 是一种广泛使用的高级编程语言,它以其清晰的语法和代码可读性而闻名。Python 支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。由于其简洁性和强大的标准库,Python 成为了数据科学、机器学习、网络开发、自动化脚…

气膜馆:新型场馆的盈利之道—轻空间

气膜馆作为一种创新的场馆形式,凭借其先进的技术和灵活的应用,正在快速崛起,展现出广阔的市场前景与丰富的盈利潜力。通过多元化的经营模式,气膜馆为创业者提供了前所未有的商机。本文将深入分析气膜馆的盈利模式及其在市场中的竞…

气膜储煤棚:未来能源管理的新选择—轻空间

在全球对可持续发展与环保的日益重视下,传统的煤炭储存方式面临着诸多挑战。气膜储煤棚应运而生,成为现代煤炭储存的理想解决方案。本文将深入探讨气膜储煤棚的优势与应用,为企业提供新的思路。 先进的技术设计 气膜储煤棚采用创新的气膜技术…

AcWing算法基础课-790数的三次方根-Java题解

大家好,我是何未来,本篇文章给大家讲解《AcWing算法基础课》790 题——数的三次方根。本题考查算法为浮点数二分查找。本文详细介绍了一个使用二分法计算浮点数三次方根的算法。通过逐步逼近目标值,程序能够在给定的区间内精确计算出结果&…

关闭小广告【JavaScript】

在 JavaScript 中实现关闭小广告的功能&#xff0c;可以通过监听点击事件来隐藏广告元素。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport&q…

SpringBoot框架之KOB项目 - 配置Mysql与注册登录模块(中)

修改Spring Security 登录验证模式 传统的验证登录模式 公开页面&#xff1a;输入url就可以直接访问授权页面&#xff1a;登录之后才可以访问 Jwt验证模式 容易实现跨域不需要在服务器端存储 对比于传统模式将所有的sessionId换成jwt token access token refresh token 过…

如何在Chrome最新浏览器中调用ActiveX控件?

小编最近登陆工商银行网上银行&#xff0c;发现工商银行的个人网银网页&#xff0c;由于使用了ActiveX安全控件&#xff0c;导致不能用高版本Chrome浏览器打开&#xff0c;目前只有使用IE或基于IE内核的浏览器才能正常登录网上银行&#xff0c;而IE已经彻底停止更新了&#xff…

Tile View Kanban Board平铺视图和看板

Goto 数据网格和视图入门 平铺视图&#xff08;TileView 类&#xff09;将数据记录显示为平铺。此视图类型可以以任何自定义方式排列多个元素&#xff08;bound 和 unbound&#xff09;。用户可以按如下方式编辑瓦片&#xff1a; 使用模态 Edit Form。利用 HTML-CSS 平铺模板…

VScode配置连接远程服务器configure ssh Hosts

VScode配置连接远程服务器&#xff0c;具体步骤 一、点击VScode左下脚这两个∟的按钮 二、点击完上面的按钮后&#xff0c;出现如下的下拉选项&#xff0c;选择“Connect to Host” 三、选择“Connect to Host”后&#xff0c;下拉选项会更新&#xff0c;选择“Configure SSH …

openFrameworks_如何使用ofxXmlSettings和ofxGui来创建识别界面

效果图&#xff1a; 代码及详解 1.添加两个插件的头文件: #include "ofxGui.h" #include "ofxXmlSettings/src/ofxXmlSettings.h" 2.添加GUI部分&#xff0c;然后在.h声明右边的openframeworks的UI部分&#xff0c;包括面板ofxPanel&#xff0c;按钮ofx…