当前位置: 首页 > article >正文

面试-JVM:JVM的组成及作用

JVM包含两个子系统和两个组件:

两个子系统:

类加载子系统(ClassLoader Subsystem)

  • 作用:根据给定的全限定类名(如:java.long.Object)来装载class文件至运行时数据区的方法区。

  • 核心机制

    • 双亲委派模型:避免重复加载,确保核心类库安全(如防止自定义java.lang.String覆盖JDK类)。

    • 热替换实现:通过自定义类加载器实现模块热部署(如OSGi、Tomcat的Web应用隔离)。

  • 开发影响:类冲突排查、动态代理技术(如Spring AOP)均依赖类加载机制。

执行引擎(Execution Engine)

 解释器(Interpreter)
  • 作用:逐行解释字节码,启动速度快,但执行效率低。

  • 混合模式:JVM默认采用解释器+JIT编译器(如HotSpot的C1/C2编译器)协同工作。

 即时编译器(JIT Compiler)
  • 优化机制

    • 热点代码探测:通过计数器识别频繁执行的代码(方法调用、循环)。

    • 编译优化:内联优化、逃逸分析、锁消除等(可通过-XX:+PrintCompilation监控)。

  • 性能影响:JIT是Java接近C++性能的关键(如服务端长期运行后性能提升)。

 垃圾回收器(Garbage Collector)
  • 核心算法:标记-清除、复制、标记-整理,不同GC器(如ZGC/Shenandoah)针对低延迟或高吞吐场景。

  • 调优经验:根据应用特点选择GC策略(如电商系统关注低延迟,批处理系统关注吞吐量)。

两个组件:

本地方法接口(JNI)与本地库

  • 作用:整合C/C++库(如加密算法、硬件操作),与native libraries交互,是其他编程语言交互的接口

  • 开发注意点:JNI错误可能导致JVM崩溃(需严格内存管理和异常处理)。

运行时数据区(Runtime data area)

程序计数器(Program Counter Register)
  • 作用:记录当前线程执行位置(字节码行号或native方法地址)。

  • 线程私有性:确保线程切换后能恢复执行流。

Java虚拟机栈(Java Stack)
  • 作用:存储方法调用的栈帧(局部变量表、操作数栈、动态链接、方法出口)。

  • 栈深度问题StackOverflowError常见于递归调用未收敛或循环依赖。

  • 线程隔离性:每个线程独享栈,栈大小通过-Xss配置。

本地方法接口(JNI)与本地库
  • 作用:整合C/C++库(如加密算法、硬件操作)。

  • 开发注意点:JNI错误可能导致JVM崩溃(需严格内存管理和异常处理)。

堆(Heap)
  • 作用:存储对象实例和数组(所有线程共享)。

  • 关键设计

    • 分代模型:新生代(Eden/Survivor)、老年代,配合不同GC算法(如ParNew/CMS/G1)。

    • OOM问题定位OutOfMemoryError时需分析堆转储(Heap Dump)中的对象分布。

  • 调优实践:通过-Xmx/-Xms调整堆大小,避免频繁Full GC。

方法区(Method Area)/元空间(Metaspace)
  • 作用:存储类元数据,即类信息(JDK8后由元空间实现,替代永久代),常量、静态变量、即时编译后的代码等数据

  • 演进意义:元空间使用本地内存,避免PermGen OOM,支持动态扩展。

  • 开发影响:反射、动态生成类(如CGLib)会显著增加元空间占用。

作用及流程:

        首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内。而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

                       

 


http://www.kler.cn/a/562355.html

相关文章:

  • 三品PDM管理系统:企业产品数据管理的“智慧大脑”,如何破解安全隐私难题?
  • 微信小程序开发中CSS书写常见问题及最佳实践
  • Node.js 内置模块简介(带示例)
  • 《零基础学会!如何用 sql+Python 绘制柱状图和折线图,数据可视化一看就懂》
  • Vue 异步组件的加载策略
  • 故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断
  • 22、《Spring Boot消息队列:RabbitMQ延迟队列与死信队列深度解析》
  • AcWing 蓝桥杯集训·每日一题2025
  • Part-DB部署
  • redis检测大key
  • 【够用就好006】-PC桌面管理ECS服务器的实操步骤
  • 【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道
  • FastAPI高级特性(二):错误处理、中间件与应用生命周期
  • Redis-列表结构实操
  • Python 环境管理介绍
  • Kafka客户端连接服务端异常 Can‘t resolve address: VM-12-16-centos:9092
  • QSNCTF-WEB做题记录(2)
  • 【STL】4.<list>
  • 车载诊断架构 --- LIN节点路由转发注意事项
  • smolagents学习笔记系列(六)Secure code execution