版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JVM高频面试题及详细答案(实战版)一、JVM基础核心1、什么是JVM?它的作用是什么?JVM即Java虚拟机,是运行Java字节码的虚拟计算机,也是Java实现跨平台的核心。核心作用:屏蔽操作系统、硬件差异,实现一次编译,到处运行加载、校验、执行class字节码文件管理内存、垃圾回收、线程调度、即时编译等底层机制提供安全校验、异常处理等运行时保障2、JDK、JRE、JVM的区别与关系?JVM:Java虚拟机,只负责运行Java程序,是Java程序运行的核心载体,无编译能力。JRE:Java运行环境,包含JVM+Java核心类库,只用于运行Java程序,不能开发。JDK:Java开发工具包,包含JRE+编译工具、调试工具、打包工具等,是开发和运行Java程序的完整环境。层级关系:JDK⊃JRE⊃JVM3、Java程序的运行流程是什么?开发者编写.java源代码文件通过javac编译器编译,生成跨平台的.class字节码文件JVM的类加载器加载class文件到内存字节码校验器校验代码安全性、规范性解释器逐行解释执行字节码,热点代码会被即时编译器编译为本地机器码程序运行结束,JVM回收资源、退出进程二、JVM内存结构(运行时数据区)1、JVM运行时数据区包含哪些区域?哪些是线程私有?哪些是线程共享?线程私有(随线程创建、销毁):程序计数器、虚拟机栈、本地方法栈线程共享(随JVM启动、关闭):堆、方法区(元空间)各区域核心作用:程序计数器:记录当前线程执行的字节码行号,是唯一一个无OOM的内存区域,用于线程切换后恢复执行位置虚拟机栈:存储方法栈帧(局部变量表、操作数栈、动态链接、方法出口),方法调用即入栈,执行结束即出栈本地方法栈:专门用于执行native本地方法,底层由C/C++实现堆:存放所有对象实例和数组,是垃圾回收的核心区域,也是最容易发生OOM的区域方法区/元空间:存储类的结构信息、常量、静态变量、即时编译代码等,JDK8后移除永久代,使用元空间,直接使用本地内存2、虚拟机栈栈帧包含哪些组成部分?每个方法执行都会创建一个栈帧,核心包含5部分:局部变量表:存放方法局部变量、方法参数,基本数据类型直接存储,引用类型存储对象地址操作数栈:基于栈的指令执行载体,用于运算、赋值、方法调用等操作动态链接:将运行时常量池的符号引用,解析为直接内存地址引用方法返回地址:记录方法执行完毕后,回到上层调用方法的执行位置附加信息:部分虚拟机包含异常表、锁信息等扩展内容3、JDK7和JDK8方法区的区别?JDK1.6及之前:使用永久代,属于JVM堆内存的一部分,有固定大小限制,容易出现永久代OOMJDK1.7:逐步去永久代,将字符串常量池、静态变量移出永久代,移至堆内存JDK1.8+:彻底废弃永久代,使用元空间(Metaspace),直接使用操作系统本地内存,默认无固定大小限制,仅受系统内存约束,大幅减少了类加载导致的OOM4、常见的OOM场景有哪些?Javaheapspace:堆内存不足,对象创建过多、大对象、内存泄漏导致Metaspace:元空间不足,动态生成大量类、频繁热部署、反射加载大量类导致StackOverflowError:虚拟机栈溢出,方法递归深度过大、死递归导致unabletocreatenewnativethread:本地线程数超限,创建大量非守护线程导致三、类加载机制1、类的完整加载过程分为哪几个阶段?整体分为加载、链接、初始化三大阶段,链接又包含验证、准备、解析三步。加载:读取class字节码文件,将二进制数据加载到内存,在方法区创建类的元数据对象,生成Class实例验证:校验字节码合法性、安全性、规范性,避免恶意、非法代码破坏JVM运行准备:为类静态变量分配内存,并赋予默认初始值(int=0、boolean=false、引用=null),静态常量直接赋值字面量解析:将代码中的符号引用替换为直接内存地址引用初始化:执行静态代码块、静态变量赋值,是类加载的最后一步,主动触发时才会执行2、类的初始化触发条件有哪些?(主动引用)只有主动引用会触发类初始化,被动引用不会触发:使用new实例化对象调用类的静态方法、静态变量使用Class.forName()反射加载类初始化子类时,会优先初始化父类程序启动的主类(包含main方法的类)被动引用场景(不初始化):通过子类引用父类静态变量、定义数组、引用常量等。3、双亲委派模型是什么?工作流程和意义?定义:类加载器的层级加载机制,子加载器收到加载请求,优先委托父加载器处理,层层向上,顶层加载器无法加载时,再由子加载器自行加载。加载器层级(从上到下):启动类加载器(Bootstrap)→扩展类加载器(Extension)→应用类加载器(App)→自定义类加载器工作流程:自定义类加载器接收加载请求,委托给父加载器逐级向上委托,最终到启动类加载器父加载器无法加载(无对应class文件),向下交由子加载器加载核心意义:保证核心类安全,防止开发者自定义篡改核心类(如String、Object)避免类重复加载,保证全局类的唯一性4、能不能打破双亲委派模型?有哪些场景?可以打破,核心是重写类加载器的loadClass方法,放弃向上委托逻辑。常见打破场景:Tomcat等容器:自定义类加载器,优先加载应用自身class,实现应用类隔离、热部署SPI机制:线程上下文类加载器打破双亲委派,实现父加载器调用子加载器的资源框架热部署、动态加载类场景四、垃圾回收GC核心1、JVM哪些内存区域会进行垃圾回收?主要回收堆内存和元空间/方法区,虚拟机栈、本地方法栈、程序计数器随线程销毁自动释放,无需GC。2、对象存活的判定方式?(1)引用计数法给对象添加引用计数器,引用+1,失效-1,计数器为0则判定为垃圾。缺点:无法解决循环引用问题,JVM未采用。(2)可达性分析算法(JVM主流)以GCRoots为起始节点,遍历内存引用链,无法遍历到的对象判定为可回收垃圾。常见GCRoots:虚拟机栈中局部变量引用的对象本地方法栈JNI引用的对象方法区静态变量、常量引用的对象活跃线程持有的对象3、Java中的引用类型有哪些?区别是什么?强引用:默认引用,只要有强引用,对象永远不会被回收,容易造成内存泄漏软引用(SoftReference):内存充足不回收,内存不足触发GC回收,适合缓存场景弱引用(WeakReference):只要触发GC,无论内存是否充足,都会被回收,适合临时关联对象虚引用(PhantomReference):无任何引用效果,仅用于跟踪对象回收状态,用于堆外内存释放4、垃圾回收的四大算法及优缺点?(1)标记清除算法先标记垃圾对象,统一清除。优点:简单高效;缺点:产生大量内存碎片,分配大对象容易OOM。(2)复制算法将内存分为两块,存活对象复制到空闲区域,清空原区域。优点:无内存碎片、效率高;缺点:内存利用率低,浪费一半空间。新生代主流使用。(3)标记整理算法标记垃圾后,将存活对象向内存一端移动,清空末端垃圾。优点:无内存碎片;缺点:移动对象成本高,效率低。老年代主流使用。(4)分代收集算法基于对象存活周期差异化回收:新生代对象存活短、回收频繁,用复制算法;老年代对象存活久、回收少,用标记清除/标记整理算法。是当前JVM默认回收算法。5、新生代、老年代的特点及回收机制?新生代(Eden+Survivor0+Survivor1)默认比例8:1:1,对象优先在Eden区分配。MinorGC:Eden区满触发,频率高、速度快,采用复制算法。存活对象移入空闲Survivor区,存活次数达标(默认15次)晋升老年代。老年代存放长期存活对象、大对象。MajorGC/FullGC:老年代空间不足触发,速度慢、耗时久,会暂停用户线程,尽量避免频繁触发。采用标记整理算法。6、什么是MinorGC、MajorGC、FullGC?区别?MinorGC:只回收新生代,触发频繁,STW时间短,开销小MajorGC:主要回收老年代,通常伴随MinorGC,开销较大FullGC:回收整个堆、方法区,暂停所有用户线程,STW时间最长,严重影响系统性能,生产环境需严格规避7、常见垃圾收集器及适用场景?(重点G1、ZGC)(1)Serial/SerialOld单线程收集器,回收时暂停所有用户线程,适合客户端、小型单机程序,服务端基本不用。(2)ParallelScavenge/ParallelOld多线程并行收集器,主打高吞吐量,适合后台批量处理、对延迟不敏感的业务,JDK8默认收集器。(3)CMS收集器并发标记清除收集器,主打低延迟,用户线程与GC线程并发执行。缺点:内存碎片多、无法处理浮动垃圾,JDK9开始废弃,JDK14彻底移除。(4)G1收集器(JDK9+默认)分区式收集器,将堆内存划分为多个大小相等的Region,可单独回收新生代、老年代。兼顾吞吐量和低延迟,支持可控的停顿时间,适合中大型应用、对延迟有一定要求的服务。(5)ZGC收集器(JDK11+正式)超低延迟并发收集器,停顿时间控制在毫秒级,支持TB级堆内存,几乎不影响业务吞吐量,适合高并发、低延迟核心业务系统。8、STW是什么?为什么会产生STW?STW即Stop-The-World,指GC执行期间暂停所有用户业务线程,只保留GC线程工作。产生原因:保证GC标记、复制、整理过程中,对象引用状态不会被业务线程修改,避免标记错乱、数据异常。所有GC都会产生STW,区别只在于停顿时间长短。五、JVM调优与实战问题1、生产环境JVM核心参数有哪些?-Xms:堆初始内存-Xmx:堆最大内存(生产建议Xms=Xmx,避免扩容开销)-Xss:线程栈大小-XX:MetaspaceSize:元空间初始大小-XX:MaxMetaspaceSize:元空间最大大小-XX:+UseG1GC:启用G1收集器-XX:MaxGCPauseMillis:G1最大停顿时间-XX:+PrintGCDetails:打印GC详细日志-XX:+HeapDumpOnOutOfMemoryError:OOM时自动导出堆快照2、内存泄漏和内存溢出的区别?内存泄漏:程序持有无效对象引用,导致GC无法回收,无用对象持续占用内存,属于过程问题。常见场景:静态集合持有对象、未关闭流/连接、匿名内部类持有外部引用。内存溢出(OOM):内存空间不足,无法创建新对象,程序直接报错崩溃,属于结果问题。多数OOM由长期内存泄漏导致。3、线上频繁FullGC如何排查?查看GC日志,确认FullGC频率、耗时,区分是内存不足还是元空间溢出导出堆dump文件,通过MAT、JProfiler分析大对象、常驻对象排查是否存在内存泄漏:集合未清理、静态变量累积、循环引用检查是否有大量大对象直接进入老年代,触发老年代GC查看系统线程状态,排查线程堆积、死循环导致的对象创建过多调整JVM参数,优化堆比例、晋升阈值,更换适配的垃圾收集器六、字节码与编译机制1、解释编译和即时编译(JIT)的区别?解释执行:JVM解释器逐
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医疗器械法律法规相关知识培训试题及答案(必考)
- 2025年医师定期考核口腔科考核题库完整版888题(含答案)
- 2025年异常血压考试题及答案
- 2025年预防与控制医院感染试题与答案
- 2025年云计算技术与应用专升本试卷高频考点
- 2025年政府采购履约验收业务考试真题及答案
- 2025年主治医师(内科)考试真题卷
- 2025食品安全抽查考试试题及答案
- 2026年部编版六年级语文下册第3单元测试卷及答案
- 湖南省工业产品设计数字化加工模拟试卷及答案
- DB14∕T 1570-2018 地理标志产品 芮城屯屯枣
- 中古时期的亚洲课件
- 《煤矿防治水细则》全文
- 2024年江苏省无人机应用技术职业技能竞赛(无人机测绘操控)试题库(含答案)
- GB/T 44311-2024适老环境评估导则
- 收费站春运保通保畅工作方案
- 高斯求和1课件
- 五年级道德与法治上册教师教师用书
- 硫磺安全技术说明书MSDS
- 70周岁以上的老年人三力测试题库
- 尾矿库工程施工组织设计方案
评论
0/150
提交评论