【Java】快速入门JVM
文章目录
- 1. JVM简介
- 2. 类加载简介
- 3. 类加载的过程
- 4. 双亲委派
- 5. GC垃圾回收
- 6. JVM的回收方式
- 7. 分代回收

1. JVM简介
JVM(Java虚拟机)是一个名字为Java的进程,是用于执行Java程序的虚拟机。
JVM会从操作系统中申请一大块内存空间,又把这个内存空间划分成为几个小的区域
区域的划分:
- 堆
- 方法区
- 栈(Java虚拟栈和本地方法栈)
- 程序计数器
- 运行时常量池
代码中的局部变量是放在栈上的,成员变量放在堆上,静态变量放在方法区中,程序计数器放的是下一个要执行的指令地址
一个JVM进行中,堆和方法区只有一份,单栈和程序计数器,每个线程都有自己的一份
补充: 方法区的概念是jdk1.8之前的叫法,而jdk1.8之后没有方法区了,而多了个元数据区.
方法区是JVM申请内存中划分出的一个区域,而元数据区时是用的本地内存
2. 类加载简介
类加载是JVM将类的字节码加载到内存中,并进行验证、准备和解析的过程。也就是
源代码(.java)文件编译成字节码文件(.class)
3. 类加载的过程
类加载的过程大致分为以下几步:
- 加载
- 加载
- 验证
- 准备
- 解析
- 初始化
加载:加载是将类的字节码文件加载到内存中的过程。
验证:验证是确保类的字节码符合Java虚拟机规范的过程。
准备: 给类中的静态变量分配内存空间
解析: 初始化字符串常量,把符号引用(占位符)替换成直接引用(内存地址)
初始化:初始化是执行类的初始化代码的过程。
什么时候进行类加载呢?
使用到一个类的时候,就触发类加载(类不一定是程序已启动就加载了,第一次使用时才加载),有点类似于"懒汉模式"
4. 双亲委派
双亲委派是Java类加载器的一种机制,用于保证类的加载安全和避免重复加载。
在讲双亲委派之前,先来了解类加载器
Java类加载器主要有以下几种类型:
- 启动类加载器(Bootstrap Class Loader):它是JVM的内置类加载器,负责加载Java标准库中的类
- 扩展类加载器(Extension Class Loader):它是Java平台提供的标准类加载器之一,用于加载Java扩展库(如javax包中的类)和Java虚拟机的扩展部分。
- 应用程序类加载器(Application Class Loader):也称为系统类加载器(System Class Loader),它是加载应用程序类的默认加载器。应用程序类加载器加载应用程序类路径上的类,即开发人员编写的类和第三方类库。
上述三个类加载器存在父子关系,启动类加载器是扩展类加载器的父类,扩展类加载器是应用程序类加载器的父类
进入类加载的时候,输入的内容是全限定类名,加载的时候从Application Class Loder开始. 即当一个类加载器收到加载类的请求时,它会先委派给父类加载器,只有在父加载器找不到该类的情况下,才会自己加载。如果一直找到最下面的"Application Class Loder"也没有找到,就会抛出一个"类没找到"这样的异常
按照这个顺序的加载最大的好处就是如果子定义的类和Java标准库的类冲突了,此时仍然保留类加载可以加载到标准库中的类
5. GC垃圾回收
GC垃圾回收是Java虚拟机(JVM)自动管理内存的过程。它通过自动识别和回收不再使用的对象,释放内存资源,并提供了内存管理的机制,使开发人员无需手动进行内存释放。
在学习C语言时,有个关键字叫 malloc
(动态内存申请),它的内存释放时机是不确定的,需要使用的free
进行释放.如果不进行free
,这个内存就会一直持续到程序结束. 如果忘记释放,就可能会造成"内存泄漏"
而在Java中,当对象不再被引用时,它们变成了垃圾。垃圾回收器负责扫描程序的内存,找出这些不再被引用的对象,并将它们的内存空间回收,以便后续的对象可以使用。
GC垃圾回收机制基本上可以把内存泄漏问题解决的差不多,但GC也并不是完美的,GC有个STW(stop the world)问题
STW指的是垃圾回收过程中,应用程序的执行被暂停停止的情况。在STW期间,所有的应用线程都会被挂起,直到垃圾回收完成。
STW问题可能会对应用程序的性能和响应时间产生影响,特别是在大型内存或高并发场景下。应用程序的执行会被中断,可能导致暂停时间较长,从而影响系统的实时性和用户体验。
GC垃圾回收主要会受到是哪些内容呢? 答案是堆,且GC中回收内存,不是以"字节"为单位进行回收的,而是以"对象"为单位回收.
GC怎么判断某个对象是否是垃圾呢?
假设有一个对象,如果已经没有任何引用能够指向它了,说明对象自然就无法再被使用了
两种典型的判定对象是否存在引用的方法:
- 引用计数(不是JVM采取的办法)
- 引用计数的优点: 简单,容易实现,执行效率比较高
- 引用计数的却嗲: 空间利用率低,可能会出现循环引用的情况
- 可达性分析(JVM采取的办法)
在Java中,GC通过根对象作为起点,查找所有与根对象直接或间接相连的对象,这些对象被称为可达对象,它们是程序中仍然被引用的对象。与根对象没有引用链相连的对象被认为是不可达的,它们将被垃圾回收器标记为可回收的对象。
6. JVM的回收方式
共有以下几种方式:
- 标记清除: 标记-清除是最基本的垃圾回收算法。它分为两个阶段:标记阶段和清除阶段。在标记阶段,垃圾回收器标记所有可达的对象,将其标记为存活对象。在清除阶段,垃圾回收器清除未被标记的对象,释放它们占用的内存空间。
- 复制算法:将内存分为两个区域,一次只使用其中一个区域。在对象存活后,将其复制到未使用的区域中,然后清除旧区域中的所有对象。复制算法适用于对象存活率较低的场景,因为需要较大的内存空间来进行复制。
- 标记整理: 标记-整理算法结合了标记-清除和复制算法的特点。它首先标记所有可达对象,然后将存活对象向一端移动,并清除未移动的内存空间。标记-整理算法适用于对象存活率较高的场景。
7. 分代回收
上述三种方式,虽然都可以实现GC回收,但都会存在一些问题. 因此在使用时,就需要根据不同的场景,采取不同的策略.
所以有引入的一个新的垃圾回收机制-“分代回收”
分代回收:分代算法是基于对象生命周期的假设,将内存分为不同的代,一般分为新生代和老年代。新生代中的对象生命周期短暂,采用复制算法进行回收;而老年代中的对象生命周期较长,采用标记-清除或标记-整理算法进行回收。分代算法适用于大部分应用程序,因为对象的生命周期通常是不同的。
新生代的对象被GC扫描的概率低,老年代的对象被GC的扫描率低. 新生代只有熬过多次GC的扫描,没有被回收,才会进入老年代
注: 如果对象是一个特别大的对象,会直接进入老年代
文章到这就结束了,感谢您的观看!
相关文章:

【Java】快速入门JVM
文章目录 1. JVM简介2. 类加载简介3. 类加载的过程4. 双亲委派5. GC垃圾回收6. JVM的回收方式7. 分代回收 1. JVM简介 JVM(Java虚拟机)是一个名字为Java的进程,是用于执行Java程序的虚拟机。 JVM会从操作系统中申请一大块内存空间,又把这个内存空间划分…...
C#之Winfrom自定义输入框对话框。
如果你需要一个带有输入框的对话框,并在输入完成后接收输入的值,你可以使用自定义窗体来实现。以下是一个示例代码:创建一个继承自 Form 的自定义窗体类,命名为 InputDialogForm,并将窗体上放置一个文本框(…...
docker制作镜像
docker制作镜像 docker制作镜像有两种: 1.docker build dockerfile 2.基于容器制作镜像 基于容器制作镜像 语法:docker commit options 容器名称 参数: -a:作者 -c:修改dockfile创建的镜像 -m:提交…...

广西茶叶元宇宙 武隆以茶为媒 推动茶文旅产业融合发展
8月4日,重庆市武隆区启动为期3天的“武隆首届玩茶荟”。本次活动以“中国最美玩茶地——武隆”为主题,吸引众多国内知名专家、茶企和茶馆相关负责人,共同探索武隆茶文旅融合发展新路径和新业态。 广西茶叶元宇宙:广西茶叶元宇宙 …...
alibaba.excel库使用
目录 依赖 实体类 Controller Service 所用到的接口及工具类 ExcelUtil ExcelListener DefaultExcelListener DefaultExcelResult ExcelResult JsonUtils SpringUtils StreamUtils ValidatorUtils SpringUtils 使用alibab中的excel库来实现excel的导入、导出 依赖 <de…...
机器学习模型选择评估和超参数调优
如何选择模型?如何评估模型?如何调整模型的超参数?模型评估要在测试集上进行,不能在训练集上进行,否则评估的准确率总是100%。所以,一般我们准备好数据集后,要将其分为训练集和测试集࿰…...

深入浅出 Typescript
TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准(ES6 教程)。 TypeScript 由微软开发的自由和开源的编程语言。 TypeScript 设计目标是开发大型应用,它可以编译成纯 JavaScript,编译出来的 JavaScript …...

Vue3和TypeScript项目-移动端兼容
1 全局安装typescript 2 检测安装成功 3 写的是ts代码,但是最后一定要变成js代码,才能在浏览器使用 这样就会多一个js文件 3 ts语法 数组语法 对象语法 安装vue3项目 成功后进入app。安装依赖。因为我们用的是脚手架,要引入东西的时候不需要…...

基于STM32CubeMX和keil采用通用定时器中断实现固定PWM可调PWM波输出分别实现LED闪烁与呼吸灯
文章目录 前言1. PWM波阐述2. 通用定时器2.1 为什么用TIM142.2 TIM14功能介绍2.3 一些配置参数解释2.4 PWM实现流程&中断2.4.1 非中断PWM输出(LED闪烁)2.4.2 中断PWM输出(LED呼吸灯) 3. STM32CubeMX配置3.1 GPIO配置3.2 时钟配置3.3 定时器相关参数配置3.4 Debug配置3.5 中…...

mysql大表的深度分页慢sql案例(跳页分页)
1 背景 有一张表,内容是 redis缓存中的key信息,数据量约1000万级, expiry列上有一个普通B树索引。 -- test.top definitionCREATE TABLE top (database int(11) DEFAULT NULL,type varchar(50) DEFAULT NULL,key varchar(500) DEFAULT NUL…...

集中/本地转发、AC、AP
1.ADSL ADSL MODEM(ADSL 强制解调器)俗称ADSL猫 ADSL是一种异步传输模式(ATM)。ADSL是指使用电话线上网,需要专用的猫(Modem),在上网的时候高频和低频分离,所以上网电话两不耽误,速…...

Spring集成Seata
Seata的集成方式有: 1. Seata-All 2. Seata-Spring-Boot-Starter 3. Spring-Cloud-Starter-Seata 本案例使用Seata-All演示: 第一步:下载Seata 第二步:为了更好看到效果,我们将Seata的数据存储改为db 将seata\sc…...

三种方式创建对象的几种方式及new实例化时做了什么?
创建对象的几种方式 利用对象字面量创建对象 const obj {}2.利用 new Object创建对象 const obj new Object()3.使用 构造函数实例化对象 function Fn(name) {this.name name} const obj new Fn(张三) console.log(obj.name); //张三为什么要用构造函数的形式࿱…...

vue2-vue实例挂载的过程
1、思考 new Vue()这个过程中究竟做了什么?过程中是如何完成数据的绑定,又是如何将数据渲染到视图的等等。 2、分析 首先找到vue的构造函数。 源码位置:/src/core/instance/index.js options是用户传递过来的配置项,如data、meth…...
C++ 右值引用案例
C 右值引用案例 右值引用(Rvalue reference)是 C11 引入的新特性,它的主要意义是实现移动语义(Move semantics)和完美转发(Perfect forwarding)。这两者都可以提高代码的性能和灵活性。 一、移…...

2.文件的逻辑结构
第四章 文件管理 2.文件的逻辑结构 顺序文件采用顺序存储则意味着各个逻辑上相邻的记录在物理上也是相邻的存储的。所以如果第0号记录的逻辑地址为0的话,则i号记录的逻辑为i *L。 特别的如果这个定长记录的顺序文件采用串结构,也就是这些记录的顺序和他…...

20天学rust(一)和rust say hi
关注我,学习Rust不迷路 工欲善其事,必先利其器。第一节我们先来配置rust需要的环境和安装趁手的工具,然后写一个简单的小程序。 安装 Rust环境 Rust 官方有提供一个叫做 rustup 的工具,专门用于 rust 版本的管理,网…...

牢记这16个SpringBoot 扩展接口,写出更加漂亮的代码
1、背景 Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Springboot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们只要引…...
c++两种设计模式 单例和工厂模式
c两种设计模式 单例和工厂模式 一.单例 1.单例的概念 1.当前的类最多只能创建一个实例 2.当前这个唯一的实例,必须由当前类创建(自主创建),而不是调用者创建 3.必须向整个系统提供全局的访问点,来获取唯一的实例 …...

2023-08-05——JVM 栈
栈 stack 栈:数据结构 程序数据结构算法 栈:先进后出,后进先出 好比一个:桶 队列:先进先出(FIFO :First Input First Out) 好比一个:管道 栈:喝多了吐。队列…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...