【面试题】JVM面试题及答案总结

JVM(Java虚拟机)是Java技术体系的核心,面试中经常会被问到与JVM相关的问题,

以下是一些典型的JVM面试题及答案概要:

JVM的主要组成部分有哪些?

  • 类加载器(ClassLoader):负责从文件系统或网络等位置加载.class文件,并将这些字节码转换成方法区的运行时数据结构。
  • 运行时数据区(Runtime Data Area):
    • 程序计数器(Program Counter Register):线程私有,存储当前正在执行的指令地址。
    • 虚拟机栈(Java Virtual Machine Stacks):线程私有,每个方法在执行时会创建一个栈帧(Stack Frame),用于存放局部变量表、操作数栈、动态链接和方法出口信息等。
    • 本地方法栈(Native Method Stack):与虚拟机栈类似,为虚拟机使用到的Native方法服务。
    • 堆(Heap):所有线程共享,存放对象实例以及数组。
    • 方法区(Method Area):所有线程共享,存储已被加载的类的信息、常量池、静态变量、即时编译器编译后的代码等数据
  • 执行引擎(Execution Engine):负责执行字节码,包括解释执行和通过JIT(Just-In-Time)编译器进行的热点代码优化编译执行。
  • 本地库接口(Native Interface):允许Java代码调用底层操作系统或硬件的接口。

Java内存溢出错误主要有哪些类型?

  • Java heap space out of memory error:堆空间不足,通常由于对象过多或者单个对象过大导致。
  • PermGen space out of memory error (或Metaspace for Java 8以上版本):方法区空间不足,常见于大量类的动态加载或者反射生成大量类信息时。
  • StackOverflowError:虚拟机栈或本地方法栈深度过深,如递归调用层次太深且未及时返回导致栈空间耗尽。
  • DirectBuffer分配内存溢出:直接内存(Direct Memory)超过其上限。

什么是垃圾收集(GC)?GC算法有哪些?

垃圾收集是JVM用来自动回收不再使用的对象所占用的内存的过程。常见的垃圾收集算法包括:

  • 标记-清除(Mark-Sweep):先标记出所有活动对象,然后清除未被标记的对象。
  • 复制(Copying):将内存划分为两块,只有一块用于分配对象,当这块内存满了之后,就将存活的对象复制到另一块上,然后清空已使用的那块区域。
  • 标记-压缩(Mark-Compact):结合了标记-清除和复制的思想,标记阶段找出所有活动对象后,压缩它们到内存的一端,消除碎片。
  • 分代收集(Generational Collection):基于年轻代(Eden, Survivor Space)和老年代(Tenured Generation)的不同特性,采用不同的收集策略,如新生代的Copying算法(如Parallel Scavenge)、老年代的Mark-Sweep-Compact算法(如Serial Old、Parallel Old)等。

什么是类加载机制,类加载过程包含哪几个步骤?

类加载机制是JVM实现把.class文件中的二进制数据转换为方法区中运行时数据结构的过程。类加载过程包括以下几个阶段:

  • 加载(Load):通过类的全限定名找到对应的.class文件并读入内存,创建一个代表该类的Class对象。
  • 验证(Verification):确保被加载类的正确性,例如检查类文件格式、元数据、字节码验证等。
  • 准备(Preparation):给类的静态变量分配内存,并初始化为默认值。
  • 解析(Resolution):将符号引用转换为直接引用,如将字符串常量池中的字符串引用解析为实际的内存地址。
  • 初始化(Initialization):执行类构造器方法,对静态变量进行初始化赋值。

JVM中的双亲委派模型是什么?

双亲委派模型是Java类加载器的一种工作模式。当一个类加载器收到类加载请求时,首先不会自己尝试加载,而是将这个请求委派给父加载器去完成。每一层次的类加载器都是如此,因此所有的加载请求最终都会传送到顶层的启动类加载器。只有当父加载器无法完成类加载(即找不到指定类)时,子加载器才会尝试自己去加载。

这样做的好处在于保证了Java应用的各个类库版本的一致性,避免了由于类重复加载而导致的安全性和稳定性问题。

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

Java对象在以下条件满足时可以被垃圾回收:

  • 对象不再有任何引用指向它,无论是强引用、软引用、弱引用还是虚引用。
  • 对象是可达的,但其关联的引用类型已经进入相应的引用队列。
    具体来说,当一个对象没有任何途径再被程序访问到,也就是不可达时,将会被视为可回收的对象。垃圾收集器会在合适的时机进行回收操作。

请解释一下Minor GC和Full GC的区别?

Minor GC:发生在年轻代(Young Generation)的垃圾回收。年轻代包括Eden区和两个Survivor区,当年轻代空间不足时会触发Minor GC。 Minor GC相对频繁且速度较快,因为年轻代的对象生命周期通常较短,大部分对象会被回收。

Full GC:发生在整个堆内存中,包括年轻代和老年代(Tenured Generation)以及方法区(对于HotSpot虚拟机还包括元空间Metaspace)。Full GC一般发生在老年代空间不足,或者System.gc()显式调用,或者CMS并发清理失败等情况。Full GC比Minor GC更耗费时间,因为它涉及的对象范围更广,影响更大。


介绍一下JVM调优工具JConsole和VisualVM的作用?

JConsole:Java自带的一个GUI监控工具,用于对本地或远程Java应用程序进行性能监控和故障排查。它可以显示线程、内存、类加载、CPU使用率等信息,并支持动态查看MBean属性和执行MBean操作。

VisualVM:是一个功能更加强大的JDK工具套件,提供了更全面的应用程序分析功能,包括内存分析、线程分析、CPU分析、类加载分析等。VisualVM还支持插件扩展,可以安装如Memory Sampler、Thread Dump Analyzer等高级功能模块,帮助开发者深入了解JVM运行状态,进行性能瓶颈定位和JVM参数调优。


说说你了解的几种常用的JVM参数及其作用?

-Xms 和 -Xmx:分别设置Java进程初始堆大小和最大堆大小,例如 -Xms2g -Xmx4g 表示初始堆为2GB,最大堆为4GB。
-XX:NewRatio:设置年轻代与老年代的比例,默认值根据平台不同而不同,例如 -XX:NewRatio=3 表示年轻代与老年代的内存比例为1:3。
-XX:MaxTenuringThreshold:设置对象晋升到老年代的年龄阈值,默认值是15。年轻代中经历多次Minor GC后依然存活的对象将会晋升至老年代。
-XX:+UseConcMarkSweepGC 或 -XX:+UseG1GC 等:选择不同的垃圾收集器,比如CMS垃圾收集器或G1垃圾收集器。
-XX:PermSize 和 -XX:MaxPermSize(Java 8之前有效):设置永久代的初始大小和最大大小,但在Java 8及以后版本,永久代已被元空间(Metaspace)取代,相应参数为 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize。


什么是Java内存模型(JMM)?

Java内存模型(Java Memory Model, JMM)是一种规范,它定义了Java虚拟机如何与计算机硬件内存进行交互以及在多线程环境下如何同步和通信。JMM确保了并发编程中的原子性、可见性和有序性。它解决了由于处理器重排序、缓存一致性等问题可能带来的并发编程中的数据不一致问题。


解释一下JVM中的HotSpot及其优化策略?

HotSpot是Oracle JDK中使用的一种高性能的JVM实现,它采用了多种优化技术,包括:

**即时编译器(JIT):**HotSpot JVM包含多个即时编译器(C1、C2),将热点代码从字节码转换为机器码,通过方法内联、循环展开等优化提高执行效率。

**动态编译优化:**根据运行时数据对热点代码进行持续优化,例如分支预测、逃逸分析、栈上替换(On-Stack Replacement, OSR)等。

**垃圾收集优化:**提供不同的垃圾回收器如Serial GC、Parallel GC、CMS GC、G1 GC、ZGC和Shenandoah GC,并支持各种调优参数以适应不同应用的需求。


什么是类卸载机制?类何时会被卸载?

类卸载是指JVM从方法区中移除不再使用的类的信息,释放其占用的内存空间。类被卸载需要满足以下条件:

  • 类的所有实例都已被回收。
  • 加载该类的类加载器已经被回收。
  • 该类的Class对象没有在任何地方被引用,即不可达。

类卸载由系统自动进行,无需开发者显式操作,但需要注意的是,如果应用程序设计不当,可能会导致类永不卸载,从而引发长期运行的应用程序内存泄漏问题。


如何避免死锁的发生,尤其是在JVM中?

在JVM环境中避免死锁通常需要遵循以下原则:

  • 避免一个线程同时占有两个以上的资源而不释放已占有的资源。
  • 使用资源请求时设置超时时间,超时后主动释放持有的资源并重新尝试。
  • 按照既定的全局顺序申请资源,避免循环等待。
  • 尽量减少同步区域,只在必要的时候持有锁。
  • 使用高级并发工具,如java.util.concurrent包提供的锁、信号量和队列等,它们提供了更细粒度的控制和更高的容错性。

Java中有哪些常见的内存泄漏类型,并给出相应的解决方案?

常见的Java内存泄漏类型包括:

  • 静态集合类引起的内存泄漏:静态集合类会一直存活到应用程序结束,若其中存储的对象不再使用,也会无法被回收。解决方案是定期清理无用对象或在不再使用时手动从集合中移除。
  • 长生命周期对象持有短生命周期对象引用:当长生命周期的对象持有短生命周期对象的引用,而短生命周期对象不再使用时,由于强引用的存在,垃圾回收器无法回收这些对象。解决办法是适时断开不必要的引用,比如使用弱引用或软引用。
  • 监听器/回调函数未注销:注册到某个服务或者框架中的监听器或回调函数,如果没有正确地反注册,可能会导致对象不能被回收。应确保在组件不再使用时及时取消注册。

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

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

相关文章

尚硅谷JavaScript高级学习笔记

01 准备 JavaScript中函数是对象。我们后续描述构造函数的内存模型时,会将构造函数称为构造函数对象。 02 数据类型 typeof 运算符来查看值的类型,它返回的是类型的字符串值 会做数据转换 03 相关问题 04数据_变量_内存 05相关问题1 06相关问题2 …

Typescript 哲学 morn on funtion

函数重载 overload 有一些编程语言(eg:java)允许不同的函数参数,对应不同的函数实现。但是,JavaScript 函数只能有一个实现,必须在这个实现当中,处理不同的参数。因此,函数体内部就…

2024蓝桥杯每日一题(前缀和)

一、第一题:壁画 解题思路:前缀和贪心枚举 仔细思考可以发现B值最大的情况是一段连续的长度为n/2上取整的序列的累加和 【Python程序代码】 import math T int(input()) for _ in range(1,1T):n int(input())s input()l math.ceil(len(s)/…

人工智能在日常生活中的应用

在我们的日常生活中,人工智能已经成为一种无处不在的力量,从智能家居到在线助手,再到高度个性化的服务和推荐,它无声地改变着我们的生活方式和习惯。随着技术的不断进步和普及,人工智能正以前所未有的速度和规模渗透到…

JVM-垃圾收集器G1

G1垃圾回收器 概述: 是一款面向服务器的垃圾收集器,主要针对配备多个处理器及大容量内存的机器. 以极高效率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.G1保留了年轻代和老年代的概念,但不再是物理隔阂了,它们都是(可以不连…

群晖:Docker中用CentOS安装宝塔面板

群晖:Docker中用CentOS安装宝塔面板 步骤: https://post.smzdm.com/p/ad2rqg4z/ 其他: 安装失败报错: Failed to download metadata for repo ‘appstream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist 解决…

在别的地方下载的二次封装Windows镜像怎么安装?GHO镜像详细安装教程

前言 在系统之家或者其他地方下载的镜像文件怎么装到电脑上? 首先要知道系统之家下载的Windows镜像文件基本上都是.iso结尾的,要进入到对应镜像包才能看出系统镜像是什么格式。 如何分辨镜像的格式 选择对应的.iso镜像,点击【鼠标右键】-【装…

《UE5_C++多人TPS完整教程》学习笔记26 ——《P27 在线会话测试(Testing An Online Session)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P27 在线会话测试(Testing An Online Session)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主&#xff0…

谈谈我对Java平台的理解

谈谈我对Java平台的理解 Java,这个诞生于1995年的编程语言,至今仍然是全球最受欢迎的编程语言之一。它不仅是一种语言,更是一个完整的平台,为企业级应用、移动应用、嵌入式系统、大数据处理、科学计算等众多领域提供了强大的支持…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.09-03.15 #13场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2024-03-09(周六) #6场比赛2024-03-10…

Python笔记|基础算数运算+数字类型(1)

重新整理记录一下python的基础知识 基础运算符 、-、*、/ ;括号 ()用来分组。 >>>2 2 4 >>>50 - 5*6 20 >>>(50 - 5*6) / 4 5.0 >>>8 / 5 1.6向下取整除法:向下舍入到最接近的整数的数学除法。运算符是 //。比如1…

Vue3中的ref和reactive

今天在写前端, 用的是Vue3, 其实之前也有写过一些前端, 但是涉及不深, 差不多是基础的水平, 然后现在想跟进下Vue3, 就有点吃力得紧, 就单单一个变量的引用, 就折腾得不轻,调试的时候, 取值都是各种undefined, 然后就特地找了下相关的资料, 这才明白ref和reactive的…

【趣味项目】2048 简单实现

【趣味项目】2048 简单实现 算法原理 假设用一个二维矩阵表示 2048 页面,操作是左滑 const matrix [[2, 2, 4, 0],[0, 2, 4, 0],[0, 2, 2, 0],[2, 4, 4, 8] ];将所有非空的数字向左移动 matrix [[2, 2, 4, 0],[2, 4, 0, 0],[2, 2, 0, 0],[2, 4, 4, 8] ]将相邻的…

DeepSpeed在windows下构建失败的问题

使用pip install deepspeed无法安装,看教程说是可以自己安装。 ## Windows Windows support is partially supported with DeepSpeed. On Windows you can build wheel with following steps, currently only inference mode is supported. 1. Install pytorch, su…

java实现大文件的分割与合并

最近遇到一个问题,某网盘上传文件时,文件大小超过了4个G ,不能上传,所以就想到了利用的java的IO流,将文件分割成多个小文件,上传到网盘上,等到需要用的时候,下载下来然后再进行文件的…

自动化工程师涨薪难,原因出在这里

大家好,今天说说真实的工控行业,摒弃虚无的鸡汤,聊点实在的。 举个例子,某工做销售,卖电控器件,眼见PLC收入可观,开始感到压力。于是,他下定决心学PLC,报了培训班。毕业后…

手写简易操作系统(一)--环境配置

本专栏是我新开设的一个学术专栏,旨在全面介绍手写操作系统的相关内容。其中包括实模式向保护模式的过渡、锁机制、信号量操作、内存分配、硬盘驱动、文件系统、简单shell和管道等操作系统核心知识。该专栏旨在为有意开发自己操作系统的研究人员提供指导与帮助。作为…

昏暗场景增强-低照度增强-弱光增强(附代码)

引言 随着现代科技的发展,图像采集设备已经渗透到生活的方方面面,然而在昏暗场景、低照度或弱光条件下,图像的质量往往受到严重影响,表现为亮度不足、对比度低下、色彩失真以及细节丢失等问题。这类图像对于人眼识别和计算机视觉…

【NR技术】 3GPP支持无人机的关键技术以及场景

1 背景 人们对使用蜂窝连接来支持无人机系统(UAS)的兴趣浓厚,3GPP生态系统为UAS的运行提供了极好的好处。无处不在的覆盖范围、高可靠性和QoS、强大的安全性和无缝移动性是支持UAS指挥和控制功能的关键因素。与此同时,监管机构正在调查安全和性能标准以及…

oracle配置开机自启动

Oracle在$ORACLE_HOME/bin下提供许多对数据库进行操作的脚本,其中dbstart和dbshut可分别用来启动和关闭数据库。注意,这两个脚本已包含监听器的启动或关闭,但并未对EM进行相关的操作。使用如下命令: /oracle/product/11.2.0/db_1…