JVM面试题笔记

521. Java如何实现跨平台的? Java编译生成的是字节码文件.class文件,而不是特定于某个操作系统的机器码。 不同操作系统上都有各自实现的JVM,负责将字节码翻译成特定平台的机器代码并执行。使得JAVA文件可以被不同操作系统上的JVM运行。包装了一层。 9807. JVM的组成部分 主要组成部分: 编译好的JAVA字节码(.class文件)准备就绪。 类加载器子系统:将class文件加载到内存中(运行时的数据区)。 运行时数据区。 执行引擎(命令解释器):将字节码文件翻译成机器码,并交给CPU执行; 本地方法接口:过程中会调用不同语言提供的接口,比如驱动和..,调用本地方法接口,例如操作系统级别的功能或者高性能库。 522. 编译执行和解释执行 编译执行:先将源代码编译为机器代码,再在CPU上运行。例如:C,C++; ​ 啊 优点:编译后运行速度快,并且运行时,不需要再进行翻译。 解释执行:运行时,解释器逐行翻译并执行例如Python。 跨平台性好, 每个代码都是在每个平台上通过相应平台的解释器运行。 速度慢,每次执行都需要动态翻译。 => Java采样编译执行和解释执行相结合的方式: 解释执行:JVM将.JAVA文件=>.class字节码。 有助于程序的跨平台性; 即时编译:将经常执行的代码编译为本地机器码,避免反复解释 523. JVM的内存区域如何划分的❗? JVM运行时的数据区分为:1. 方法区 2. 堆 3. 虚拟机栈 4. 本地方法栈 5. 程序计数器。 方法区 - 存储类&共享信息 存储类信息、常量、静态变量 这些信息属于线程共享区域 Java堆 - 与JVM共存亡 存放所有线程共享的对象实例 和 数组 (垃圾回收主要战地) 虚拟机栈 每个线程创建一个栈:用来保存局部变量、操作数栈、方法出口信息。 局部变量:基本数据类型;以及对象引用; 栈与线程共存亡 本地方法栈 为本地方法服务。。。 程序计数器 保存当前线程执行的字节码指令地址或行号。 总结:Java程序与线程在JVM内存中的流程 程序启动:JVM初始化内存区域,加载类信息到方法区。 线程创建:为线程分配程序计数器、Java虚拟机栈和本地方法栈。 方法调用:线程执行方法时,创建栈帧并压入Java虚拟机栈。 对象创建:对象实例存储在Java堆中,元数据存储在方法区。 垃圾回收:JVM清理不再使用的对象和类信息。 线程结束:线程的栈和程序计数器被销毁。 程序结束:JVM释放所有内存区域并退出。 524. JVM中堆和栈的区别是什么? 栈:主要用于存储局部变量(基本类型+对象引用)和方法的调用信息(返回地址、参数等)。线程执行时,会创建该线程的栈帧,被压入Java虚拟机栈中。 执行结束,线程栈帧被弹出(销毁) ...

March 8, 2025 · 1 min · 163 words · LongWei