JVM面试必备
目录
JVM三大问题
一、JVM内存区域划分
编辑
二、JVM类加载机制
双亲委派模型(常考)
类加载的格式,类卸载
三、垃圾回收(GC)
具体垃圾回收GC步骤
1.判定对象是否为垃圾
方案1:引用计数
方案2:可达性分析
2.释放对象的内存
1.标记-清除(直接释放)
2.复制算法
3.标记整理
4.JVM的垃圾回收机制
JVM三大问题
一、JVM内存区域划分
首先来到第一个问题:什么是JVM呢?
JVM可以说是java的虚拟机,也可以叫做java的一个进程,每一个java进程都是JVM实例
堆,栈,方法区,程序计数器
成员变量->堆
局部变量,(引用类型也包括)->栈
静态变量->方法区
一个进程的运行过程中,就要从操作系统这里申请一些内存资源,JVM也是如此,搞了一大块内存供java代码执行的时候使用,JVM吧这一块内存,又划分出几个区域,作为不同用途。
二、JVM类加载机制
把类从硬盘文件加载到内存中
JAVA程序,最开始是写.java文件,编译成.class文件(字节码),运行java程序,JVM就会读取.class文件,把文件的内容放到内存中,并且构造成.class对象(类对象)
1.加载
找到.class文件,打开文件,读取文件内容,并且尝试解析格式
在JAVA代码中是直接的使用类
2.验证
验证当前.class文件是否符合要求
介绍一下上面的字段意思:
access_flags(相当于是不是public)
attribute注解
minor_version:小版本号
constant-pool:常量池
java文件里写的信息有什么,.class文件有所体现。
3.准备
给类对象分配内存,最终的目标就是构建出完整的类对象,分配内存+初始化。
4.解析
主要是初始化类对象涉及到一些字符串常量,其实字符串常量在.class文件就有了,直接读到内存中就行了。
常量池内符号引用,替换为直接引用的过程。(相对位置,经过偏移换到真实的内存地址)
相对位置是什么意思:我们去看电影,我知道电影的位置吗,不知道,因为我不知道他那个厅是怎么样的,但是我知道我坐在小美的旁边。
5.初始化
对类对象进行更具体的初始化操作,初始化静态成员,初始化静态代码块,加载父类
双亲委派模型(常考)
描述在类加载过程中,如何寻找.class文件。java圈子喜欢高大上的名字,比如自动装箱拆箱(其实不过也只是一个类型转换),
JVM加载.class文件的时候需要用到类加载器模块,JVM带了三个类加载器
Bootstrap ClassLoader
负责加载标准库的类,JAVA有标准文档,描述了都要提供哪些类,
Extension ClassLoader
负责加载JVM扩展的库,除了标准库之外,实现JVM厂商,还会添加一些类
Application ClassLoader
负责加载第三方库,像之前用到的mysql,jdbc,servlet(自己代码中写的类)
此处父子,不是父类子类,继承,而是对象有一个parent引用,指向父类类加载器实例
1. 从Application ClassLoader开始,但是他并不会立即搜索第三方库的目录,而是把加载任务委派给父亲,让父亲先加载
2.到了Extension ClassLoader,也不会立即搜索扩展库目录,也是把加载任务委派给父亲,也让父亲先尝试加载。
3.到了Bootstrap ClassLoader,也不想理机搜索标准库,而是也想把任务给父亲,但是他没有父亲,只能自己动手来搜索了
如果找到了这个类,会进行后续的加载(也就和Application和Extension没关系了)没找到,则把任务还给孩子,给Extension完成
4.任务再次回到Extension ClassLoader手上,他就要搜索扩展库的目录,看没有匹配的,.class文件找到,走,没找到就给他的孩子
5.任务回到了Application ClassLoader,就要搜索第三方库的目录(往往是你的项目目录,以及和jvm一些配置项有关-classpath有关系 找到了,就进行后续的加载,找不到,就要抛异常)
类加载中,更重要,更关键的是针对.class文件的解析校验。
类加载的格式,类卸载
一个类,什么时候会被加载呢?(懒汉模式 当我用到了才会加载)
1.构造类的实例
2.使用了类的静态方法/静态属性
3.子类的加载会触发父类
类加载后,后续就不必加载了
类卸载(把类对象干掉)
属于是特殊情况
一般来说
一般来说类加载过后就不必考虑卸载。一直保存到程序运行结束
但是有的特殊场景可能用到卸载操作
有的服务器需要打,“热补丁”
代码有bug,正常操作是修改代码,重新编译,用新的版本来去代替旧版本,重启服务器,有些特殊情况,服务器不方便重启,可以通过打补丁的方式,通过一些特殊手段,把需要替换的类给卸载掉,直接用加载好的类去替换(新版代码)
有些情况不方便去重启服务器,就可以通过“打补丁”的方式把需要替换的类替换掉,直接用加载好的类卸载掉,直接用加载好的新的类替换(新版代码)
热“并不需要重启,也不需要重新编译”
冷“不需要重新编译,但是需要重启“
JAVA这里用的补丁较少,游戏可能会多一点,比如不停服更新
三、垃圾回收(GC)
于是JAVA引入了垃圾回收机制,自动去判定,某个内存是否会被继续使用(如果不会就把这个内存当成垃圾)
JVM有好多内存分区,那么GC回收的是哪里的对象呢?
栈首先不需要GC去回收,栈里面包含很多栈帧
栈不需要GC回收吗,栈里包含很多”栈帧“,一个栈帧对应一个方法,该方法执行结束,此时这个栈帧就销毁了,栈帧上的局部变量啥的自然销毁。
程序计数器同理,线程销毁,自然也跟着销毁
方法区,类对象,很少会涉及到对象的卸载
堆才是GC的主要战场
具体垃圾回收GC步骤
1.判定对象是否为垃圾
判定对象是否是垃圾的方式->看是否有引用指向他
方案1:引用计数
给这个对象安排一个计数器,每次有引用指向他它,就把计数器+1,每次引用被销毁,计数器-1,当计数器为0的时候,意味着该对象就是垃圾了。
下列代码是对应的过程。
引用计数的两个明显的缺陷:
1.空间利用率比较低,浪费更多的内存空间
如果给引用计数分配了两个字节,对象本体才四个字节的话,引用计数就浪费了50%的空间,如果代码中都是这些小对象,并且数量众多,此时浪费非常明显了就。
2.可能存在循环引用的问题,导致对象不能被正确识为垃圾
如下图,类似于死锁这种
方案2:可达性分析
JVM首先会从现有代码中能直接访问到的引用出发,尝试访问遍历所有能访问的对象,只要对象能访问到,都可以标记成可达。完成遍历之后,可达之外的东西,也就是不可达,可就是垃圾咯
更多的是看能不能到达,不能到达,就给你置空
2.释放对象的内存
1.标记-清除(直接释放)
这种问题,假如不去处理,还是挺严重的,内存碎片随着程序的运行越来越多,越来越碎,内存越来越难申请。
2.复制算法
复制算法,通过冗余的内存空间,把有效的对象复制到另一部分空间,来避免内存碎片
把一个内存,分成两份,用一份,丢一份,把左侧区域中,有效的对象,复制到右侧,接下来就可以使用右侧区域了,用了一段时间之后,也会有很多对象,也是相同的道理,把有效对象复制到左边,把右侧区域统一释放
3.标记整理
顺序表删除元素:搬运
实际有用的只有1,3,5
把没用的都迁移到后面,然后后面的元素进行删除。
4.JVM的垃圾回收机制
于是,设计JVM的大佬研究出了一个方法,集百家之长

按照对象的年龄,来制定不同的回收策略
GC是周期性进行扫描,每个对象没经过一轮GC,就称为涨了一岁。

新生代的扫描频次是比较高的,老年代的扫描频率就降低了
但是上述情况中,还有一个特殊的情况“如果这个对象的体积特别的大”会直接进入老年代(大的对象不适合复制算法)
相关文章:
JVM面试必备
目录 JVM三大问题 一、JVM内存区域划分 编辑 二、JVM类加载机制 双亲委派模型(常考) 类加载的格式,类卸载 三、垃圾回收(GC) 具体垃圾回收GC步骤 1.判定对象是否为垃圾 方案1:引用计数 方案2:可达性分析 2.释放对象的…...
战神传奇【我本沉默精修版】win服务端+双端+充值后台+架设教程
搭建资源下载:战神传奇【我本沉默精修版】win服务端双端充值后台架设教程-海盗空间...
安卓手机投屏到电视,跨品牌、跨地域同样可以实现!
在手机网页上看到的视频,也可以投屏到电视上看! 长时间使用手机,难免脖子会酸。这时候,如果你将手机屏幕投屏到大电视屏幕,可以减缓脖子的压力,而且大屏的视觉体验更爽。 假设你有一台安卓手机,…...
python变量名解析总结
1 python变量名解析总结 点号和无点号变量名,用不同的处理方式。 (1) 无点号的变量名,比如X,使用的是作用域。 (2) 有点号的变量名,比如obj.X,使用对象的命名空间。 …...
端口号大揭秘:网络世界的“门牌号”有多牛?
大家好,今天我们来聊一聊网络中的端口号。如果你以为端口号只是冷冰冰的数字,那你就大错特错了。端口号,这些看似枯燥的数字背后,隐藏着一个个生动的故事。 目录 大家好,今天我们来聊一聊网络中的端口号。如果你以为端…...
vue解除数据双向绑定
let obj JSON.parse(JSON.stringify(data));例如,table列表中,点击编辑时,可对val进行如上操作来解除双向绑定...
组件插槽,生命周期,轮播图组件的封装,自定义指令的封装等详解以及axios的卖座案例
3.组件插槽 3-1组件插槽 注意 插槽内容可以访问到父组件的数据作用域,因为插槽内容本身就是在父组件模版中定义的 插槽内容无法访问子组件的数据.vue模版中的表达式只能访问其定义时所处的作用域,这和JavaScript的词法作用域是一致的,换言之: 父组件模版的表达式只能访问父组…...
小美的树上染色
美团2024届秋招笔试第一场编程真题 先提一个小知识:题目中凡是提到树结构都要使用图的存储方式,只有二叉树例外。 分析:在树结构中,孩子和父节点是相邻节点,而父节点可能有多个孩子节点。在染色的过程中,…...
1.rk3588的yolov5运行:pt_onnx_rknn转换及rknn在rk3588系统python运行
自己有点笨,查资料查了一周才完美的实现了yolov5在rk3588环境下的运行,在这里写具体步骤希望大家少走弯路。具体步骤如下: 一、yolov5的原代码下载及pt文件转换为onnx文件 1.yolov5的原代码下载及环境搭建 在这里一定要下载正确版本的源代码…...
适用于全部安卓手机的 5 大免费 Android 数据恢复
您是否面临这样一种情况,即在Android设备上丢失了一些重要文件,但不知道应该选择哪种Android数据恢复来取回它们? 如果您以前从未备份过Android数据,则很难解决问题。 本文将介绍排名前5位的免费Android数据恢复软件。 您可以获…...
【案例分享】BenchmarkSQL 5.0 压测 openGauss 5.0.0
一、前言 本次BenchmarkSQL 压测openGauss仅作为学习使用压测工具测试tpcc为目的,并不代表数据库性能如本次压测所得数据。实际生产性能压测,还需结合服务器软硬件配置、数据库性能参数调优、BenchmarkSQL 配置文件参数相结合,是一个复杂的过…...
Linux之 4 种休眠模式
目录 1. Linux之 4 种休眠模式 1. Linux之 4 种休眠模式 # echo standby >/sys/power/state //CPU和RAM在运行 # echo mem > /sys/power/state //挂起到内存(待机),关闭硬 盘、外设等设备 # echo disk > /sys/power/state //挂起到硬盘(休眠),关闭硬盘、外设等设备&…...
homeassiant主题
下载主题 https://github.com/maartenpaauw/home-assistant-community-themes.git 使用file editor到homeassiant路径下,新建文件夹themes文件夹,用terminal新建也可以。 使用file editor上传文件 使用Terminal解压 mkdir themes unzip home-assistan…...
《2020年最新面经》—字节跳动Java社招面试题
文章目录 前言:一面:01、Java基础知识答疑,简单概述一下?02、倒排索引了解吗?使用Java语言怎么实现倒排?03、详细讲解一下redis里面的哈希表,常用的Redis哈希表命名有哪些,举例说明其…...
2.3IP详解及配置
2.3IP详解及配置 一、ip地址组成 IP地址由4部分数字组成,每部分数字对应于8位二进制数字,各部分之间用小数点分开 这是点分 2进制 如果换算为10进制我们称为点分10进制. 每个ip地址由两部分组成网络地址(NetID)和主z机地址(HostID).网络地址表示其属于…...
Python程序打包指南:手把手教你一步步完成
最近感兴趣想将开发的项目转成Package,研究了一下相关文章,并且自己跑通了,走了一下弯路,这里记录一下如何打包一个简单的Python项目,展示如何添加必要的文件和结构来创建包,如何构建包,以及如何…...
Linux yum 使用时提示 获取 GPG 密钥失败Couldn‘t open file RPM-GPG-KEY-EPEL-7
资料 错误提示: no crontab for root - using an empty one 888 原因剖析: 第一次使用crontab -e 命令时会让我们选择编辑器,很多人会不小心选择默认的nano(不好用),或则提示no crontab for root - usin…...
OpenGL_Learn13(材质)
1. 材质 cube.vs #version 330 core layout (location 0) in vec3 aPos; layout (location 0 ) in vec3 aNormal;out vec3 FragPos; out vec3 Normal;uniform mat4 model; uniform mat4 view; uniform mat4 projection;void main() {FragPosvec3(model*vec4(aPos,1.0));Norma…...
buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮
buildAdmin 的表头上添加一些按钮,并实现功能 添加按钮 <template><!-- buttons 属性定义了 TableHeader 本身支持的顶部按钮,仅需传递按钮名即可 --><!-- 这里的框架自带的 顶部按钮 分别有 刷新 , 添加, 编辑&…...
MySQL 定时计划任务 事件的使用
目录 查看事件是否开启 开启事件 1)通过设置全局参数修改 2)更改配置文件 MySQL如何创建并执行事件? 例 1 MySQL查看事件状态信息 MySQL修改和删除事件 例 1 例 2 删除事件 例 3 在数据库管理中,经常要周期性的执行某…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
【导读】 本文针对无人机(UAV)视频中目标尺寸小、运动快导致的多目标跟踪难题,提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪(贴合无人机场景特性),并改进传统外观匹配算法以关联此类检测…...
【Go语言基础【6】】字符串格式化说明
文章目录 零、格式化常用场景一、Go 字符串格式化核心概念二、常用格式化占位符1. 整数类型2. 浮点数类型3. 字符串与布尔类型4. 指针与通用类型 三、宽度与精度控制1. 宽度控制2. 精度控制(浮点数/字符串) 零、格式化常用场景 数值转字符串:…...













引用计数的两个明显的缺陷:




