【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) 好比一个:管道 栈:喝多了吐。队列…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
