JavaEE初阶复习(JVM篇)

news2025/4/9 17:40:39

JVM 

Java虚拟机

jdk java开发工具包

jre java运行时环境

jvm java虚拟机(解释执行 java 字节码)

java作为一个半解释,半编译的语言,可以做到跨平台. java 通过javac把.java文件=>.class文件(字节码文件)

字节码文件, 包含的就是java字节码, jvm把字节码进行翻译转化为不同系统上可以识别的cpu指令.

JVM的内存划分(面试题)

JVM本质上是一个进程

进程运行中, 要从操作系统这里申请一些资源(内存就是核心的资源)

JVM作为一个进程, 从系统中申请了一大块内存, 这一大块内存给java程序使用的时候, 又会根据实际的使用用途来划分出不同的空间(比如java定义变量的时候,就是使用JVM从系统这边申请到的内存)

JVM划分各区域的解释

1> 堆 代码中new出来的对象就都是在堆里面. 对象中持有的非静态成员变量, 也就是在堆里面(后面GC主要就是回收这里的引用)

2> 栈 

本地方法栈: jvm内部, 通过c++代码的调用关系和局部变量

虚拟机栈: 记录了java代码的调用关系和java里面的局部变量

此处的堆和栈和数据结构里面的不一样

3> 程序计数器: 主要存储下一条要执行的 java 指令的地址(每个线程都有自己的程序计数器和栈)

4> 元数据区(之前叫做方法区): 这里放一些辅助性,描述性质的属性(比如在硬盘上保存数据的本体,还有一些辅助信息: 文件的大小, 文件的位置,文件的拥有者,文件的修改时间...).比如类的信息,方法的信息(一个程序有哪些类, 每个类里面又包含哪些方法, 每个方法里面包含哪些指令.

堆, 元数据区(整个进程有一份) 栈, 程序计数器(每个线程有一份)

常考的笔试题

JVM的类加载机制(面试题)

类加载: java进程运行的时候, 需要把.class文件从硬盘读取到内存, 并进行一系列解析的校验解析的过程.

类加载的过程: 

1> 加载 把硬盘上的 .class 文件找到, 打开文件, 读取到文件的内容.(二进制的数据)

2> 验证 确认当前读到的文件内容是合法的 .class 文件(字节码) 格式.(里面有jvm开发的版本信息, 高版本的可以运行低版本的 .class)(校验.class 文件的格式是否符合 JVM 规范要求

3> 准备 给类对象, 申请内存空间(此时申请到的内存空间, 里面的默认值, 全都是0)

4> 解析 针对类中的字符串常量进行管理(java虚拟机将常量池里面的 符号引用 替换为 直接引用

的过程) 

class Test{ private String s = "hello"}  s里面包含的是"hello"的内存地址, 地址存的是内存的地址, 但是此时我们访问的是.class文件, 文件里面不存在地址的概念,  文件是放在硬盘上的, 因此我们.class文件里面的s存的是"hello"的相对偏移量,此时文件中填充的s的"hello"偏移量就是 符号引用 ,后续我们把.class放在内存里面,就会把"hello"加载到内存中, 此时"hello"就有地址了,此时内存中的s保存的是"hello"的内存地址, 此时就是 直接引用

5> 初始化: 针对类对象完成后续的初始化(执行静态代码的逻辑), 对对象的各个部分的属性进行赋值填充

双亲委派模型(加载环节)

描述怎么查找 .class 文件的策略

JVM的几个类加载器

BootstrapClassLoader: 负责查找标准库的目录

ExtensionClassLoader: 负责查找扩展库的目录( java 规范里面描述了标准库中应该有哪些功能)

ApplicationClassLoader: 负责查找当前项目的代码目录, 以及第三方库的目录

从下面开始,逐层先把搜索任务交给上层,直到没有上层为止, 然后从最上层开始进行搜索,如果找到了就进入打开文件, 读文件的操作.如果没有搜索到就去下层目录开始找.以此往下到最后一层, 如果没有找到就抛出 ClassNotFoundException 异常

JVM的垃圾回收算法(GC)面试题

我们主要GC的区域就是堆(new 对象的区域)

垃圾回收,主要回收的是对象, 每次垃圾回收的时候, 释放若干个对象

 垃圾回收机制

1> 识别出垃圾: 哪些是垃圾, 哪些不是垃圾(对象没有引用了,匿名对象除外)

判定整个对象后续是否需要继续使用(看整个对象是否被引用),如果一个对象都没有引用指向他, 就视为无法被代码中使用, 就可以视作垃圾.

创建的对象是放在堆, 引用的关系存放在栈

多个对象引用

如何计算引用?

1. 引入计数器 给每个对象安排一个额外的空间, 空间里面要保存当前整个对象有几个引用.

此时的垃圾回收机制,就是看整个引用计数是否为0,是0就可以释放了

问题1: 消耗额外的内存空间, 我们需要给每个对象都安排一个计数器

问题2: 引用计数可能会产生" 循环引用的问题 " . 此时, 引用计数就无法正确工作了

2. 可达性分析(JVM用的是这个)

相比于消耗一个空间来计算引用数目, 我们用时间来换空间

在写代码的时候, 会写很多的变量, 此时我们以这些对象变量为起点, 根据引用关系向下搜索,所有能够被搜索到的对象就不是垃圾了,搜索一圈也没有访问到的对象,就是垃圾.

比如我有若干个结点, 通过引用关系来构成二叉树, 我们从根结点开始遍历, 遍历它的左子树, 遍历完后遍历右子树, 直到叶子结点没有子节点为止, 此时我们遍历到的结点都不是垃圾 ,如果我们把某个结点的 left设置为null, left之前结点就遍历不到了, 此时就是不可达, 就是垃圾

2> 把标记为垃圾的对象的内存空间进行释放

释放的方式

a> 标记-清除

把标记为垃圾的对象直接释放掉(会产生内存碎片的问题: 产生很多小的 离散的 空闲内存空, 我们申请内存空间是申请的一块连续的内存空间)

b> 复制算法

不直接释放内存, 而是把不是垃圾的对象复制到内存的另一半里面, 然后释放掉原先一半的内存空间(总的内存变少了, 每次复制的对象如果很多, 那么复制的开销就会很大)

c> 标记 - 整理 

类似于 顺序表 删除中间元素(搬运)

分带回收

引入概念, 对象的年龄

JVM 中有专门的线程负责周期性扫描/释放

一个对象, 如果被线程扫描了一次, 就不是垃圾, 年龄+1(初始年龄是0)

JVM 中会根据对象年龄的差异, 把整个堆的内存分成俩大部分: 新生代(年龄小的对象) / 老年代(年龄大的对象)

新生代又分为伊甸区,生存区, 幸存区

1> 当new出一个新的对象, 就放在伊甸区.(伊甸区就会有, 很多的对象)

2> 第一轮GC: 之后大部分的对象都没了, 还存在的对象会被使用复制算法拷贝放在生存区

后续的GC扫描线程伊甸区和生存去都会扫描, 然后进行垃圾清理, 在生存区存活下来的对象会使用复制算法放在幸存区里面,每一次GC的扫描,对象的年龄都会+1

3> 如果在生存区里面经历若干轮GC, 还存在的对象, 就会被拷贝到老年区

4> 老年区扫描的频次大大低于其他区域, 扫描线程主要扫描的还是新手区

5> 在老年区里面的对象没有引用后, 就会被JVM按照标记整理的方式进行搬运处理掉.

垃圾收集器

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

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

相关文章

MINIQMT学习课程Day9

获取qmt账号的持仓情况后,我们进入下一步,如何获得当前账号的委托状况 还是之前的步骤,打开qmt,选择独立交易, 之后使用pycharm,编写py文件 导入包: from xtquant import xtdata from xtqua…

动态规划似包非包系列一>组合总和IIV

目录 题目分析:状态表示:状态转移方程:初始化填表顺序返回值:代码呈现: 题目分析: 状态表示: 状态转移方程: 初始化填表顺序返回值: 代码呈现: class Soluti…

Java 二叉树非递归遍历核心实现

非递归遍历的核心是用栈模拟递归的调用过程,通过手动维护栈来替代系统栈,实现前序、中序和后序遍历。以下是三种遍历的代码实现与关键逻辑分析: 一、二叉树遍历 1.1、前序遍历(根 → 左 → 右) 核心逻辑:…

【力扣hot100题】(052)课程表

什么人一学期要上2000节课啊jpg 看了非常久都没思路,主要是数据结构还没复习到图论,根本没思路怎么储存一个图…… 唯一记得的就是两种存储方法,一种是二维数组法,记录每一条边的有无,一种是只记录有的边&#xff0c…

SpringBoot配置文件多环境开发

目录 一、设置临时属性的几种方法 1.启动jar包时,设置临时属性 ​2.idea配置临时属性 3.启动类中创建数组指定临时属性 二、多环境开发 1.包含模式 2.分组模式 三、配置文件的优先级 1.bootstrap 文件优先: 2.特定配置文件优先 3.文件夹位置优…

RSA和ECC在密钥长度相同的情况下哪个更安全?

​现在常见的SSL证书,如:iTrustSSL都支持RSA和ECC的加密算法,正常情况下RAS和ECC算法该如何选择呢?实际上在密钥长度相同的情况下,ECC(椭圆曲线密码学)通常比RSA(Rivest-Shamir-Adle…

Dive into Deep Learning - 2.4. Calculus (微积分)

Dive into Deep Learning - 2.4. Calculus {微积分} 1. Derivatives and Differentiation (导数和微分)1.1. Visualization Utilities 2. Chain Rule (链式法则)3. DiscussionReferences 2.4. Calculus https://d2l.ai/chapter_preliminaries/calculus.html For a long time, …

9.进程信号

信号量 信号量是什么? ​ 本质是一个计数器,通常用来表示公共资源中,资源数量多少的问题。 ​ 公共资源:可以被多个进程同时访问的资源。 访问没有保护的公共资源会导致数据不一致问题 什么是数据不一致问题 ​ 由于公共资源…

python爬虫:小程序逆向(需要的工具前期准备)

前置知识点 1. wxapkg文件 如何查看小程序包文件 打开wechat的设置: .wxapkg概述 .wxapkg是小程序的包文件格式,且其具有独特的结构和加密方式。它不仅包含了小程序的源代码,还包括了图像和其他资源文件,这些内容在普通的文件…

PGSQL 对象创建函数生成工具

文章目录 代码结果 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>PGSQL 函数生成器</tit…

查询当前用户的购物车和清空购物车

业务需求&#xff1a; 在小程序用户端购物车页面能查到当前用户的所有菜品或者套餐 代码实现 controller层 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…

八、重学C++—动态多态(运行期)

上一章节&#xff1a; 七、重学C—静态多态&#xff08;编译期&#xff09;-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146999362?spm1001.2014.3001.5502 本章节代码&#xff1a; cpp/dynamicPolymorphic.cpp CuiQingCheng/cppstudy - 码云 - 开源中…

饮食助力进行性核上性麻痹患者,提升生活质量

进行性核上性麻痹是一种少见的神经系统变性疾病&#xff0c;患者会出现姿势不稳、眼球运动障碍等症状。合理的饮食对于维持患者身体机能、延缓病情发展有重要意义。 高蛋白质食物是饮食结构的重要部分。像瘦肉、去皮禽肉、鱼类、豆类及其制品&#xff0c;还有低脂奶制品等&…

bun 版本管理工具 bum 安装与使用

在使用 node 的过程中&#xff0c;我们可能会因为版本更新或者不同项目的要求而频繁切换 node 版本&#xff0c;或者是希望使用更简单的方式安装不同版本的 node&#xff0c;这个时候我们一般会用到 nvm 或者类似的工具。 在我尝试使用 bun 的时候&#xff0c;安装前第一个想到…

木马学习记录

一句话木马是什么 一句话木马就是仅需要一行代码的木马&#xff0c;很简短且简单&#xff0c;木马的函数将会执行我们发送的命令 如何发送命令&#xff06;发送的命令如何执行? 有三种方式&#xff1a;GET&#xff0c;POST&#xff0c;COOKIE&#xff0c;一句话木马中用$_G…

决策树实战:用Python实现智能分类与预测

目录 一、环境准备 二、数据加载与探索 三、数据预处理 四、决策树模型构建 五、模型可视化&#xff08;生成决策树结构图&#xff09; 六、模型预测与评估 七、超参数调优&#xff08;网格搜索&#xff09; 八、关键知识点解析 九、完整项目开发流程 十、常见问题解…

Crond任务调度

今天我们来看看任务调度,假如我们正在睡觉,突然有个半夜两点的任务要你备份一下数据库,你怎么办&#xff1f;难道从被窝中爬起来吗&#xff1f;显然不合理,此时就需要我们定时任务调度程序了. 原理图&#xff1a; crontab 进行定时任务的调度 概述. 任务调度:是指系统在某个…

HTML5+CSS3+JS小实例:带滑动指示器的导航图标

实例:带滑动指示器的导航图标 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, ini…

MINIQMT学习课程Day7

在上一篇&#xff0c;我们安装好xtquant&#xff0c;qmt以及python后&#xff0c;这一章&#xff0c;我们学习如何使用xtquant 本章学习&#xff0c;如何获取账号的资金使用状况。 首先&#xff0c;打开qmt&#xff0c;输入账号密码&#xff0c;选择独立交易。 进入交易界面&…

git clone 提示需要登录 github

我们在进行git的时候&#xff0c;可能会弹出让你登陆github的选项&#xff0c;这里我们介绍Token登陆的方法。 正常登陆你的Github 下拉找到 Developer settings按照如下步骤进行操作 填写相关信息&#xff0c;勾选对应选项 返回就能看到token已经被生成&#xff0c;可以使…