JavaEE初阶复习(JVM篇)
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按照标记整理的方式进行搬运处理掉.
垃圾收集器

相关文章:
JavaEE初阶复习(JVM篇)
JVM Java虚拟机 jdk java开发工具包 jre java运行时环境 jvm java虚拟机(解释执行 java 字节码) java作为一个半解释,半编译的语言,可以做到跨平台. java 通过javac把.java文件>.class文件(字节码文件) 字节码文件, 包含的就是java字节码, jvm把字节码进行翻译转化为…...
MINIQMT学习课程Day9
获取qmt账号的持仓情况后,我们进入下一步,如何获得当前账号的委托状况 还是之前的步骤,打开qmt,选择独立交易, 之后使用pycharm,编写py文件 导入包: from xtquant import xtdata from xtqua…...
动态规划似包非包系列一>组合总和IIV
目录 题目分析:状态表示:状态转移方程:初始化填表顺序返回值:代码呈现: 题目分析: 状态表示: 状态转移方程: 初始化填表顺序返回值: 代码呈现: class Soluti…...
Java 二叉树非递归遍历核心实现
非递归遍历的核心是用栈模拟递归的调用过程,通过手动维护栈来替代系统栈,实现前序、中序和后序遍历。以下是三种遍历的代码实现与关键逻辑分析: 一、二叉树遍历 1.1、前序遍历(根 → 左 → 右) 核心逻辑:…...
JavaScript性能优化实践:从微观加速到系统级策略
JavaScript性能优化实践:从微观加速到系统级策略 引言:性能优化的"时空折叠"思维 在JavaScript的世界里,性能优化如同在时间与空间的维度中折叠代码。本文将通过"时空折叠"的隐喻,从代码执行效率(时间维度)和内存占用(空间维度)两大核心,结合现代…...
《P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题》
题目描述 输入两个正整数 x0,y0,求出满足下列条件的 P,Q 的个数: P,Q 是正整数。 要求 P,Q 以 x0 为最大公约数,以 y0 为最小公倍数。 试求:满足条件的所有可能的 P,Q 的个数。 输入格式 一行两个正整数 x0,y0。…...
【力扣hot100题】(052)课程表
什么人一学期要上2000节课啊jpg 看了非常久都没思路,主要是数据结构还没复习到图论,根本没思路怎么储存一个图…… 唯一记得的就是两种存储方法,一种是二维数组法,记录每一条边的有无,一种是只记录有的边,…...
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, …...
【备考高项】附录:合同法全文(428条全)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 第一章 一般规定第二章 合同的订立第三章 合同的效力第四章 合同的履行第五章 合同的变更和转让第六章 合同的权利义务终止第七章 违约责任第八章 其他规定第九章 买卖合同第十章 供用电、水、气、热力合同第十…...
Ubuntu安装Podman教程
1、先修改apt源为阿里源加速 备份原文件: sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 修改源配置: vim sources.list删除里面全部内容后,粘贴阿里源: deb http://mirrors.aliyun.com/ubuntu/ focal main re…...
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…...
查询当前用户的购物车和清空购物车
业务需求: 在小程序用户端购物车页面能查到当前用户的所有菜品或者套餐 代码实现 controller层 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…...
八、重学C++—动态多态(运行期)
上一章节: 七、重学C—静态多态(编译期)-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146999362?spm1001.2014.3001.5502 本章节代码: cpp/dynamicPolymorphic.cpp CuiQingCheng/cppstudy - 码云 - 开源中…...
react redux的学习,多个reducer
redux系列文章目录 第一章 简单学习redux,单个reducer 前言 前面我们学习到的是单reducer的使用;要知道redux是个很强大的状态存储库,可以支持多个reducer的使用。 combineReducers combineReducers是Redux中的一个辅助函数,主要用于…...
饮食助力进行性核上性麻痹患者,提升生活质量
进行性核上性麻痹是一种少见的神经系统变性疾病,患者会出现姿势不稳、眼球运动障碍等症状。合理的饮食对于维持患者身体机能、延缓病情发展有重要意义。 高蛋白质食物是饮食结构的重要部分。像瘦肉、去皮禽肉、鱼类、豆类及其制品,还有低脂奶制品等&…...
leetcode117 填充每个节点的下一个右侧节点指针2
LeetCode 116 和 117 都是关于填充二叉树节点的 next 指针的问题,但它们的区别在于 树的类型 不同,117与 116 题类似,但给定的树是 普通二叉树(不一定完全填充),即某些节点可能缺少左或右子节点。 树的结构…...
bun 版本管理工具 bum 安装与使用
在使用 node 的过程中,我们可能会因为版本更新或者不同项目的要求而频繁切换 node 版本,或者是希望使用更简单的方式安装不同版本的 node,这个时候我们一般会用到 nvm 或者类似的工具。 在我尝试使用 bun 的时候,安装前第一个想到…...
使用RKNN进行yolo11-cls部署
文章目录 概要制作数据集模型训练onnx导出rknn导出概要 YOLO(You Only Look Once)是一系列高效的目标检测算法,其核心思想是将目标检测任务转化为一个回归问题,通过单个神经网络直接在图像上预测边界框和类别概率。当将其用于分类任务时,会去除目标检测相关的边界框预测部…...
木马学习记录
一句话木马是什么 一句话木马就是仅需要一行代码的木马,很简短且简单,木马的函数将会执行我们发送的命令 如何发送命令&发送的命令如何执行? 有三种方式:GET,POST,COOKIE,一句话木马中用$_G…...
C#编程基础知识点介绍
以下是 C# 中常见元素(属性、方法、枚举、函数等)的详细定义及示例: 1. 类(Class) 类是 C# 中最基本的类型,它是对象的蓝图,封装了数据和行为。 // 定义一个名为Person的类 public class Per…...
决策树实战:用Python实现智能分类与预测
目录 一、环境准备 二、数据加载与探索 三、数据预处理 四、决策树模型构建 五、模型可视化(生成决策树结构图) 六、模型预测与评估 七、超参数调优(网格搜索) 八、关键知识点解析 九、完整项目开发流程 十、常见问题解…...
Crond任务调度
今天我们来看看任务调度,假如我们正在睡觉,突然有个半夜两点的任务要你备份一下数据库,你怎么办?难道从被窝中爬起来吗?显然不合理,此时就需要我们定时任务调度程序了. 原理图: 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
在上一篇,我们安装好xtquant,qmt以及python后,这一章,我们学习如何使用xtquant 本章学习,如何获取账号的资金使用状况。 首先,打开qmt,输入账号密码,选择独立交易。 进入交易界面&…...
每日一个小病毒(C++)EnumChildWindows+shellcode
这里写目录标题 1. `EnumChildWindows` 的基本用法2. 如何利用 `EnumChildWindows` 执行 Shellcode?关键点:完整 Shellcode 执行示例3. 为什么 `EnumChildWindows` 能执行 Shellcode?4. 防御方法5. 总结EnumChildWindows 是 Windows API 中的一个函数,通常用于枚举所有子窗…...
使用minio客户端mc工具迁移指定文件到本地
如果需要筛选MinIO桶中的特定文件进行迁移,可以使用MinIO Client(mc)工具结合一些命令行技巧来实现。以下是具体步骤: 1、安装 MinIO Client(mc) wget https://dl.min.io/client/mc/release/linux-amd64/…...
