八股战神-JVM知识速查

1.JVM组成

JVM由那些部分组成,运行流程是什么?

JVM是Java程序的运行环境

组成部分:

类加载器:加载字节码文件到内存

运行时数据区:包括方法区,堆,栈,程序计数器,本地方法栈

执行引擎:执行字节码,优化代码

垃圾回收器:管理堆内存

运行流程:

加载字节码,准备运行环境,执行字节码,垃圾回收,程序结束

什么是程序计数器

用于记录每个线程正在执行的字节码指令的地址,用于保存字节码行号。当一个线程执行一段字节码到某个位置时,CUP使用权被另一个线程夺走,当前执行的地址会记录下来,当执行权回到当前线程时,会接着上次记录的位置继续执行

介绍Java堆

堆是一个线程共享的区域,主要用于保存对象实例,数组等,堆中内存不够会抛出OOM异常

堆区分为年轻代和老年代,年轻代被化为三部分,一个Eden区和两个S区,一个对象创建后会先到Eden区,如果对象被垃圾回收后还能存活就移动到S0或S1,再经过几次垃圾回收后还能存活则移动到老年代区中,老年代中存的是生命周期比较长的对象,

JDK1.7和1.8堆的区别

1.7中有一个永久代,存类信息,静态变量,常量,编译后代码,1.8移除了永久代,将数据存到本地内存中的元空间区,防止内存溢出

什么是虚拟机栈

每个线程运行时所需要的内存称为虚拟机栈,是一个先进后出结构,每个栈由多个栈帧组成,每个对应着每次方法调用时所占用的内存和数据,每个线程只能有一个活动栈帧,对应了当前正在执行的方法

垃圾回收是否设计栈内存

垃圾回收主要指堆内存,当栈帧弹栈以后,内存就会释放

栈内存分配越大越好吗

未必,默认的栈内存通常为1024k,栈帧过大会导致线程数减少

方法内的局部变量是否线程安全

如果方法内局部变量没有逃离方法的作用范围,那就是线程安全的,变量的创建和销毁都是在当前线程的虚拟机栈中完成的

如果局部变量引用了其他对象并逃离的方法的作用范围,那就要考虑线程安全

栈内存溢出情况

栈帧过多导致内存溢出,如递归调用

栈帧过大导致内存溢出

堆和栈的区别

栈内存一般用来存储局部变量和方法调用,堆用来存储Java对象和数组,堆会用垃圾回收,栈不会

栈内存时线程私有的,堆内存是线程共享的

异常错误不同,内存不足时,栈报StackOverFlow,堆报OutOfMemory

解释方法区

方法区主要存类的信息,运行时常量池,是各个线程共享的内存区域,在虚拟机启动时创建,虚拟机关闭时销毁

方法区在JDK 1.7时在堆区的永久代中,JDK1.8后取消了永久代,单独存在元空间中,避免了在堆区的OOM

解释一下运行时常量池

常量池可以看作一张表,虚拟机指令可以根据这张表找到要执行的类名,方法名,参数类型等信息

当类被加载时,常量池的信息就会放入运行时常量池,并把符号地址转为真实地址

直接内存

不属于JVM的内存结构,是虚拟机的系统内存,常见于NIO操作,用于数据缓冲区,直接内存相当于一块操作系统和Java代码都可以访问到的共享区域,比如我们在文件IO操作中,使用传统的BIO,需要调用操作系统的文件API,涉及到CPU用户态和内核态的切换,资源开销很大,引入直接内存之后,可以通过直接内存建立起系统内存和Java内存的交互传输

 

2.类加载器

什么是类加载器

类加载器的作用是将字节码文件加载到JVM中,从而使Java程序能够运行起来

类加载器有哪些:

启动类加载器,扩展类加载器,应用类加载器(用户自己编写的Java类),自定义类加载器

 

什么是双亲委派机制

加载一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则继续向上委托,如果委托上级都没有加载,则子加载器尝试加载该类

JVM为什么采用双亲委派机制

可以避免一个类被重复加载,当父类加载后则无需重复加载,保证唯一性

为了安全,保证类库API不会被修改

类装载的执行过程

加载:根据类的全名获取类的字节码文件,将其转换为方法区内的运行时数据结构

验证:对字节码进行校验,确保符合JVM规范

准备:为类的静态变量分配内存,设置默认初始值

静态变量是final修饰的基本类型或字符串常量,赋值在准备阶段完成

静态变量是final修饰的引用类型,复制也初始化阶段完成

解析:将符号引用转为直接引用,即将类,方法,字段等解析为内存地址

初始化:执行类的初始化代码,包括静态变量赋值和静态代码块的执行

使用:JVM开始从入口方法执行用户的程序代码,如调用静态类的成员信息,使用new关键字创建对象实例

卸载:当用户程序代码执行完毕后,JVM开始销毁创建的Class对象

3.垃圾回收

简述垃圾回收机制

在Java语言中,有自动的垃圾回收机制,开发者只需要关注内存的申请,内存的释放由系统自动识别完成,不同的对象引用会有不同的回收机制

 

对象什么时候可以被垃圾回收器回收

如果一个对象或多个对象没有任何引用指向它了,那么这个对象现在就是垃圾,就有可能被GC回收

垃圾定位方法

引用计数法:一个对象被引用一次,则在当前对象头上递增一次引用次数,如果引用次数为0,则代表该对象可回收,如果出现循环引用的画计数法就会失效

可达性分析算法:会存在一个根节点,其引用指向下一个节点,依次向下类推,直到所有节点遍历完毕

判断如果某对象和根对象无直接或间接引用则可以被垃圾回收

 

JVM垃圾回收算法

标记清除算法:分标记和清除两个阶段,根据可达性算法通过GCRoot得出垃圾并进行标记,对这些标记为可回收的内容进行垃圾回收,效率高,有磁盘碎片,内存不连续

标记整理算法:标记清除的过程一样,但是会将清理后存活的对象都向内存的一端移动,然后清理边界之外的垃圾,无内存碎片,对象需要移动,效率低

复制算法:将原有的空间一分为二,每次只用其中一块,垃圾回收时,将正在使用的对象复制到另一块内存空间中,然后将当前空间清空,交换两块内存的角色,完成垃圾回收,无碎片,内存使用率低

 

JVM的分代回收

堆被分成两份,新生代和老年代(比例为1:2),对于新生代内部又分Eden区,两个幸存区:From,to

新创建的对象首先被分到Eden区,当Eden区内存不足时,标记Eden区和From区的存活对象并将其复制到to区中,复制完成后,Eden和from中的内存被释放,经过一段时间Eden区内存又不足,标记Eden和to区存活的对象,将存活的对象复制到from区,当幸存区对象熬过几次回收就会晋升到老年代

MinorGC、 Mixed GC 、 FullGC的区别是什么

MinorGC发生在新生代的垃圾回收,暂停时间短

MixedGC发生在新生代和部分老年代区域的垃圾回收。G1收集器持有

FullGC发生在新生代和老年代的完整垃圾回收,暂停时间长,应尽量避免

 

JVM有哪些垃圾回收器

串行垃圾回收器:垃圾回收时,只有一个线程在工作,其他线程都要阻塞等待垃圾回收完成。Serial作用于新生代,采用复制算法,Serial作用于老年代,采用标记整理算法

并行垃圾回收器:多个线程完成垃圾回收工作,其他线程同样阻塞,Parallel New用于新生代,采用复制算法,Parallel Old作用老年代,采用标记整理算法

CMS(并发)垃圾回收器:针对老年代进行垃圾回收,不会造成线程阻塞,会追踪标记整个GCRoot,将其直接关联和间接关联的对象

G1垃圾回收器,作用于新生代和老年代

 

详细聊一下G1垃圾回收器

用于新生代和老年代的垃圾回收,在JDK9后JVM默认用的G1垃圾回收,采用的回收算法是复制算法,分为三个阶段

首先G1将内存划分为多个区域,每个区域都可以充当Elen区,幸存者区。jumongous等

新生代回收:

初始时,所有区域处于空闲状态,创建了一些对象,挑出一部分空闲区左Eden区存储这些对象,当Eden区需要垃圾回收时,挑一个空闲区域做幸存区,用复制算法复制存活对象,需要暂停用户线程,再往后,Eden区内存又不足了,将Eden区以及幸存区的存活对象复制到新的幸存区,将较老的对象晋升至老年代

并发标记:

当老年代占用内存超过阈值(默认45%)后,触发并发标记,无需暂停用户线程,并发标记后会冲标解决漏标问题(此时需要暂停线程),这些都完成后就知道了老年代有哪些存活对象,之后进入混合手机阶段,此时不会堆老年代区域进行回收,而是根据暂停时间目标优先回收价值高的区域

混合收集:

复制完成,内存释放,进入下一轮垃圾回收,如果对象非常大,会开出Jupmgous区存储巨型对象

 

强引用,弱引用,软引用,虚引用

强引用:只要所有的GCRoots能找到,就不会被回收

软引用:需要配合SoftReference使用,当垃圾多次回收,内存依然不够用时会回收软引用对象

弱引用:需要配合WeakReference使用,只要进行垃圾回收,就会把弱引用回收

虚引用:必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方法释放内存

 

4.JVM实践

JVM调优参数设置

war包部署在tomcat中设置

jar包部署在启动参数中设置

设置堆空间:-XMS(初始) -XMX(最大)

最大大小为默认物理内存的四分之一,初始大小时物理内存的六十四分之一

堆太小,会导致频繁的年轻代和老年代和垃圾回收,产生stw,用户线程阻塞,太大,可能会导致FullGC,会扫描整个堆空间,暂停用户线程的时间长

虚拟机栈设置:-XSS 每个线程默认1M

新生代中Eden区和两个幸存区的大小比例:默认8:1:1 -XXSus**=9 设置比例

年轻代晋升老年代的阈值: 默认为15,范围0-15

设置垃圾回收期

 

JVM调优工具

命令:

jps:查看进程状态信息

jstack:查看进程内线程堆栈信息

jmap:查询堆栈信息

jhatL堆转存快照工具

jstat:JVM统计监测工具

可视化工具:jconsole:JVM内存,线程,类监控 VisualVM:监控线程,内存情况

 

Java内存泄漏排查思路

使用jmap查询堆栈信息,生成dump文件

通过VisualVM,加载dump文件分析堆栈信息定位到代码排查

 

CPU跑到百分之百,解决思路是啥

通过top命令,定位到占用CPU高的线程

ps -T -p 进程ID找到进程中占比较高的线程

通过jstask查询线程的堆栈信息去定位代码

 

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

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

相关文章

Maven:在原了解基础上对pom.xml文件进行详细解读

一、pom.xml文件 就像项目管理软件 Make 的 MakeFile、Ant 的 build.xml 一样,Maven 项目的核心是 pom.xml。POM( Project Object Model,项目对象模型 ) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等…

Spring Cloud项目登录认证从JWT切换到Redis + UUID Token方案

背景介绍 在传统的Spring Boot项目中,用户登录认证常见的方案是使用JWT(JSON Web Token)来实现无状态的身份验证。JWT凭借自包含用户信息、方便前后端分离、性能较好等优势被广泛采用。 然而,在实际项目中,JWT也有一…

MongoDB 快速整合 SpringBoot 示例

1.添加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

Flyweight(享元)设计模式 软考 享元 和 代理属于结构型设计模式

1.目的&#xff1a;运用共享技术有效地支持大量细粒度的对象 Flyweight&#xff08;享元&#xff09;设计模式 是一种结构型设计模式&#xff0c;它的核心目的是通过共享对象来减少内存消耗&#xff0c;特别是在需要大量相似对象的场景中。Flyweight 模式通过将对象的共享细节与…

002大模型-提示词工程,少样本提示,角色扮演,思维链

一、提示词工程 二、少样本提示 三、角色扮演 四、思维链

华为OD机试真题——传递悄悄话(二叉树最长路径问题)(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

「读书报告」Spark实时大数据分析

这本书是清华大学出版社2018年出版的&#xff0c;我是2020年读的&#xff0c;说真的的&#xff0c;不怎么喜欢这本书&#xff0c;所以作者我都不想提。有的人可能会奇怪&#xff0c;ailx10&#xff0c;你一个搞网络安全的&#xff0c;怎么会去读大数据相关的书&#xff0c;哎&a…

2025 河北ICPC( D. 金泰园(二分)-- C.年少的誓约(公式转化))

文章目录 2025 河北ICPCD. 金泰园&#xff08;二分&#xff09;C.年少的誓约(公式转化)总结 2025 河北ICPC 题目链接&#xff1a; Attachments - The 9th Hebei Collegiate Programming Contest - Codeforces sdccpc20250522 - Virtual Judge 赛时&#xff1a;5道 D. 金泰…

QT学习一

对于选择qmake还是cmake&#xff0c;现在写的暂时先用qmake 1.命名规范和快捷键 2.按钮控件常用API //创建第一个按钮QPushButton * btn new QPushButton;//让btn对象 依赖在mywidget窗口中btn->setParent(this);//显示文本btn->setText("第一个按钮");//创建…

【Elasticsearch】给所索引创建多个别名

Elasticsearch 是可以给索引创建多个别名的。 为什么可以创建多个别名 1. 灵活性 - 别名可以为索引提供一个更易于理解的名称&#xff0c;方便用户根据不同的业务场景或用途来引用同一个索引。例如&#xff0c;一个索引可能同时服务于多个不同的应用程序或服务&#xff0c;通…

使用 OpenCV 实现哈哈镜效果

在计算机视觉和图像处理领域&#xff0c;OpenCV 提供了非常强大的图像几何变换能力&#xff0c;不仅可以用于纠正图像&#xff0c;还能制造各种“有趣”的视觉效果。今天&#xff0c;我们就来实现一个经典的“哈哈镜”效果&#xff0c;让图像像在游乐园里一样被拉伸、压缩、扭曲…

AI|Java开发 IntelliJ IDEA中接入本地部署的deepseek方法

目录 连接本地部署的deepseek&#xff1a; IntelliJ IDEA中使用deepseek等AI&#xff1a; 用法一&#xff1a;让AI写代码 用法二&#xff1a;选中这段代码&#xff0c;右键&#xff0c;可以让其解释这段代码的含义。这时显示的解释是英文的。 连接本地部署的deepseek&#…

如何使用两块硬盘作为 Ubuntu24 的系统盘,实现坏掉一块不影响系统运行。

最近我想使用Ubuntu组一个NAS系统&#xff0c;想实现系统盘冗余&#xff0c;各位大佬可以给点建议吗。 Deep Seek 为了实现两块硬盘作为 Ubuntu 24 系统盘的冗余配置&#xff08;RAID 1&#xff09;&#xff0c;确保一块硬盘损坏时系统仍可运行&#xff0c;以下是详细步骤&am…

【2025最新】虚拟机安装macos,VMware在Windows11上安装macOS 15完整图文教程 - 新手也能轻松上手

引言 想体验苹果系统但不想买Mac电脑&#xff1f;别担心&#xff01;本教程将手把手教你如何在Windows11环境下&#xff0c;通过VMware虚拟机安装macOS Sequoia15系统。即使你是零基础小白&#xff0c;按照这个步骤操作&#xff0c;也能轻松搞定&#xff01; 准备工作 在开始…

论文阅读笔记——Emerging Properties in Unified Multimodal Pretraining

BAGEL 论文 商业闭源系统与学术/开源模型的差距很大&#xff0c;BAGEL 旨在通过开源统一架构大规模交错数据主要解决&#xff1a; 架构割裂&#xff1a;理解/生成分属两条网络&#xff0c;信息被压缩在少量条件 token 中&#xff0c;长上下文推理受限。数据贫乏&#xff1a;主…

Go 语言基础1 Slice,map,string

更多个人笔记见&#xff1a; github个人笔记仓库 gitee 个人笔记仓库 个人学习&#xff0c;学习过程中还会不断补充&#xff5e; &#xff08;后续会更新在github上&#xff09; 文章目录 stirng 字符串区分 rune&#xff0c;byte&#xff0c;string字符串操作strings 库相关 f…

C# AI(Trae工具+claude3.5-sonnet) 写前后端

这是一个AI 写的前后端分离项目,通过AI编程&#xff0c;开发电商管理系统&#xff08;登陆、注册&#xff09; 使用的AI工具为 Trae工具(字节国际版)claude3.5-sonnet(目前代码最强模型) 前端为 vue3Bootstrap 后端为 C# net5.0(因为我电脑里面已经安装了这个新版更好) do…

10G/25G PCS only mode for CoaXPress Over Fiber

背景 在CoaXPress Over Fiber的需求中, 需要利用XGMII的PCS 实现25G 数据速率的稳定传输&#xff0c;也就是不需要其MAC层&#xff0c;只保留PMA PCS层&#xff0c;借用其物理端口 线缆&#xff0c;实现其它协议的数据传输。 25G PCS 25GMII 的 TX/RX 时钟频率在 DDR&#xff…

掌握聚合函数:COUNT,MAX,MIN,SUM,AVG,GROUP BY和HAVING子句的用法,Where和HAVING的区别

对于Java后端开发来说&#xff0c;必须要掌握常用的聚合函数&#xff1a;COUNT&#xff0c;MAX&#xff0c;MIN&#xff0c;SUM&#xff0c;AVG&#xff0c;掌握GROUP BY和HAVING子句的用法&#xff0c;掌握Where和HAVING的区别&#xff1a; ✅ 一、常用聚合函数&#xff08;聚…

无人机飞行间隔安全智能评估、安全风险评估

无人机空中安全飞行评估需结合改进碰撞模型、蒙特卡洛仿真、安全间隔反推及动态避障策略&#xff0c;通过多机型分类与实时数据融合&#xff0c;实现从理论建模到实际部署的全流程管控&#xff0c;为城市低空密集飞行提供安全保障。 需求 无人机飞行间隔安全智能评估 无人机…