JVM内存 面试题汇总



1. **JVM内存模型的基本组成部分有哪些?**
   - **程序计数器(Program Counter Register)**:记录当前线程执行的字节码指令地址。
   - **Java虚拟机栈(Java Virtual Machine Stack)**:线程私有,存储方法调用时的局部变量表、操作数栈、动态链接、方法出口等信息。
   - **本地方法栈(Native Method Stack)**:与虚拟机栈类似,但服务于本地(native)方法。
   - **堆(Heap)**:所有线程共享,存放几乎所有的对象实例和数组。
   - **方法区(Method Area)/元空间(Metaspace)**(Java 8以后):存储类的元数据信息、常量池、静态变量、即时编译后的代码等。
   
2. **程序计数器的作用是什么?为什么它是线程私有的?**
   - 程序计数器用于记录当前线程执行的字节码位置,是线程私有的因为每个线程都有独立的执行序列,互不影响。

3. **Java虚拟机栈会发生哪些异常?**
   - 主要是`StackOverflowError`(栈溢出,当递归过深或方法调用层级过多时发生)和`OutOfMemoryError`(栈内存耗尽时)。

4. **堆内存分为哪几个区域?**
   - 新生代(Young Generation):包括 Eden 区、两个Survivor区(From和To),主要用于新创建的对象。
   - 老年代(Old/Tenured Generation):用于存放经过多次垃圾回收仍然存活的对象。

5. **什么是Minor GC和Major GC/Full GC?**
   - **Minor GC**:发生在新生代的垃圾收集,清理年轻代的空间。
   - **Major GC** 或 **Full GC**:清理整个堆内存,包括老年代和部分方法区,通常比Minor GC更消耗资源。

6. **为什么Java 8将永久代(PermGen)替换为元空间(Metaspace)?**
   - 解决了永久代容易出现的内存泄漏问题,因为类元数据大小不再受JVM堆大小限制。
   - 元空间使用的是本机内存,避免了Java堆和永久代争抢固定的内存空间。

7. **JVM如何进行内存管理?**
   - 自动内存管理,包括垃圾回收(GC)机制,用于回收不再使用的对象所占的内存空间。
   - 分代收集算法,根据对象生命周期的不同将内存分为不同区域,采用适合的回收策略。

8. **解释垃圾回收算法(如标记-清除、复制、标记-整理)及其优缺点。**
   - **标记-清除**:先标记所有需要回收的对象,再统一回收。优点是简单,缺点是效率低,会产生内存碎片。
   - **复制**:将可用内存分为两份,每次只使用其中一份,当这一份满时,将存活对象复制到另一份,然后清空使用过的那份。优点是效率高,无碎片,缺点是内存利用率低。
   - **标记-整理**(或标记-压缩):首先标记所有活动对象,然后将它们向一端移动,最后清理掉边界以外的内存。优点是解决了内存碎片问题,缺点是需要移动对象,开销较大。

9. **如何监控和调整JVM内存设置?**
   - 使用JVM参数(如-Xms、-Xmx调整堆大小,-XX:MetaspaceSize、-XX:MaxMetaspaceSize调整元空间大小)。
   - 利用工具(如VisualVM、JConsole、Java Mission Control)监控内存使用情况。

10. **JVM如何实现类加载的双亲委派模型?**
    - 当一个类加载器收到类加载请求时,首先尝试委托给父类加载器去加载,如果父类加载器无法加载,则自己尝试加载。这保证了类的唯一性和安全性。


全部评论

相关推荐

2 6 评论
分享
牛客网
牛客企业服务