JVM常见面试题3

8. 什么是逃逸分析和逃逸分析应用场景?

答案:
逃逸分析是指虚拟机分析对象是否会在方法返回后依然存活(逃出方法体)的技术。如果一个对象没有逃出方法体,那么它在方法执行完成后就会随着栈帧的消失而被回收;反之,如果对象在方法中创建完毕后逃出了方法体,那么它就需要在堆中分配内存。逃逸分析应用场景在某些情况下可以优化性能,比如对象不在方法体内逃逸时,可以使用栈上分配优化减少内存分配的开销。

9. Java的内存泄漏有哪些常见场景?

答案:
Java内存泄漏常见场景包括但不限于:

  • 静态变量引用了生成的对象,但对象不再需要,导致无法被回收;
  • 隐式引用,例如Thread类的匿名内部类实例持有外部实例,但外部实例不再存续;
  • 全局变量未正确定位,被永久的实例保持引用;
  • 监听器事件或其他回调保持对对象的永久引用,外部未取消绑定。

10. Java虚拟机的参数管理有哪些常用工具?

答案:

  • JConsole:提供了Java性能和内存监控工具。
  • JVisualVM:可视化的JVM管理工具,可以监控各种性能指标和堆内存中的对象。
  • JMC (Java Mission Control):更加先进的JVM诊断和监控工具,可以进行更深入的分析。
  • JProfiler:专业的Java性能分析工具,提供全面的性能监测和分析能力。
  • Java Mission Control (JMC) 或 Java Flight Recorder (JFR):Java平台提供了新的监控工具,包括对Java程序的实时监控、问题诊断和性能分析,以及对JVM本身的性能监控。

11. Java中如何进行堆内存的监控和分析?

答案:

  • JConsole 和 JVisualVM:提供基本的堆内存使用情况的监控,以及堆内存的使用和分析功能。
  • jmap:可以查看Java进程的堆内存使用信息,并且可以将堆内存中的内容转储到一个文件中。
  • jhat:用于分析上一步中生成的转储文件中的对象实例信息。
  • VisualVM/JMC:可以对转储文件进行更直观的分析和查看。

12. Java虚拟机的垃圾回收算法有哪些?它们的工作原理是怎样的?

答案:
Java虚拟机的垃圾回收算法主要有以下几种:

  • 标记-清除(Mark-Sweep): marking phase 和 sweeping phase,先标记存活的对象,然后将未被标记的对象的占用的空间清除掉。
  • 标记-压缩(Mark-Compact):和Mark-Sweep类似,但是清除过程通过移动存活对象使得它们紧密排列,可以减少进一步分配时的碎片化问题。
  • 复制算法(Copying):也称为“可达性分析”,通常用于年轻代GC。新生对象先被分配到半区的“From”空间,存活到一定时间后移动到另一半区的“To”空间,“From”空间被清空并成为新的“To”空间,原来的“To”空间成为新的“From”空间。对于存活时间很长的对象会Advance到老年代。
  • 分代收集(Generational Garbage Collection):根据对象生命周期的特点,将堆分成不同的代(如年轻代、老年代),有针对性地应用不同的垃圾回收算法。

13. 什么是JIT(即时编译器)?JIT编译器有哪些常见的类型?

答案:
JIT(Just-In-Time)编译器是Java虚拟机的一部分,它将字节码即时编译为本地机器码,以提高程序的执行效率。常见的JIT编译器类型有:

  • 传统的JIT(又名内联缓存编译):其主要目标是热点代码的优化,适用于高频被调用的方法。
  • 分层编译(Tiered Compilation):是一种现代JIT编译技术,它将代码编译分为多个层次来提升性能,先以解释模式执行,中间可以切换为C1编译、C2编译,最终达到最优的性能。
  • 达尔文编译(Continuous Profiling and Adaptive Optimization):一种新的编译技术,会持续监控应用程序的行为,并动态优化代码。

14. Java虚拟机中的类加载过程是怎样的?

答案:
Java虚拟机的类加载过程通常包括以下几个步骤:

  1. 加载(Loading):通过类的全限定名查找并加载类的二进制数据。
  2. 连接(Linking)
    • 验证(Verification):确保加载的类符合Java虚拟机规范。
    • 准备(Preparation):为类的静态变量分配内存空间,并设置初始值。
    • 解析(Resolution):将符号引用转换为直接引用。
  3. 初始化(Initialization):执行类的初始化代码,包括静态变量赋值和静态代码块等。

15. 什么是运行时数据区?Java虚拟机的运行时数据区包括哪些部分?

答案:
运行时数据区是Java虚拟机中用于存储数据和执行程序的区域。主要包括以下几个部分:

  • 程序计数器(Program Counter Register):当前线程执行的字节码行号指示器。
  • Java虚拟机栈(Java Virtual Machine Stacks):存放线程的方法栈、局部变量表、操作数栈等信息。
  • 本地方法栈(Native Method Stack):为本地方法服务。
  • 堆(Heap):存放对象实例。
  • 方法区(Method Area):用于存储类的元数据、静态变量、字节码等信息。

16. 什么是即时编译(Just-In-Time Compilation,JIT)?

答案:
即时编译是指在运行时将某段代码(如字节码)动态编译成本地机器代码的过程。JIT编译的目的是为了提高程序执行速度,因为本地机器代码的执行速度通常比解释执行代码快。

17. Java虚拟机中常用的垃圾回收算法有哪些?

答案:
Java虚拟机中常见的垃圾回收算法包括:

  • 新生代收集器:常用的有Serial收集器、ParNew收集器、Parallel Scavenge收集器等。
  • 老年代收集器:主要的有Serial Old收集器、CMS收集器、G1收集器等。
  • 整堆收集器:主要的有Serial收集器、Parallel收集器、CMS收集器、G1收集器等。

18. Java虚拟机中的堆和栈有什么区别?

答案:

  • 堆(Heap):用于存放对象实例和数组,被所有线程共享。由垃圾回收器管理,包括新生代、老年代等。
  • 栈(Stack):每个线程都有自己的栈,用于存放方法调用的局部变量、操作数栈、方法出口等信息。栈中的数据仅在当前线程可见。

19. Java中的方法区(Method Area)和栈(Stack)区别是什么?

答案:

  • 方法区(Method Area):用于存储类的结构信息、运行时常量池、静态变量、方法字节码等,被所有线程共享。
  • 栈(Stack):每个线程都有自己的栈,用于存储方法调用的局部变量、操作数栈、方法出口地址等信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值