赞
踩
JVM(Java虚拟机)是Java技术体系的核心,面试中经常会被问到与JVM相关的问题,
以下是一些典型的JVM面试题及答案概要:
垃圾收集是JVM用来自动回收不再使用的对象所占用的内存的过程。常见的垃圾收集算法包括:
类加载机制是JVM实现把.class文件中的二进制数据转换为方法区中运行时数据结构的过程。类加载过程包括以下几个阶段:
双亲委派模型是Java类加载器的一种工作模式。当一个类加载器收到类加载请求时,首先不会自己尝试加载,而是将这个请求委派给父加载器去完成。每一层次的类加载器都是如此,因此所有的加载请求最终都会传送到顶层的启动类加载器。只有当父加载器无法完成类加载(即找不到指定类)时,子加载器才会尝试自己去加载。
Java对象在以下条件满足时可以被垃圾回收:
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更耗费时间,因为它涉及的对象范围更广,影响更大。
JConsole:Java自带的一个GUI监控工具,用于对本地或远程Java应用程序进行性能监控和故障排查。它可以显示线程、内存、类加载、CPU使用率等信息,并支持动态查看MBean属性和执行MBean操作。
VisualVM:是一个功能更加强大的JDK工具套件,提供了更全面的应用程序分析功能,包括内存分析、线程分析、CPU分析、类加载分析等。VisualVM还支持插件扩展,可以安装如Memory Sampler、Thread Dump Analyzer等高级功能模块,帮助开发者深入了解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内存模型(Java Memory Model, JMM)是一种规范,它定义了Java虚拟机如何与计算机硬件内存进行交互以及在多线程环境下如何同步和通信。JMM确保了并发编程中的原子性、可见性和有序性。它解决了由于处理器重排序、缓存一致性等问题可能带来的并发编程中的数据不一致问题。
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从方法区中移除不再使用的类的信息,释放其占用的内存空间。类被卸载需要满足以下条件:
类卸载由系统自动进行,无需开发者显式操作,但需要注意的是,如果应用程序设计不当,可能会导致类永不卸载,从而引发长期运行的应用程序内存泄漏问题。
在JVM环境中避免死锁通常需要遵循以下原则:
常见的Java内存泄漏类型包括:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。