JVM篇-JVM主要组成部分
JVM主要由类加载子系统,运行时数据区,执行引擎,本地方法接口,,本地库组成
1.类加载子系统
负责加载、链接和初始化类文件(.class)。类加载过程分为三步:
加载:查找并读取字节码文件到内存。
链接:验证字节码、分配静态变量内存、解析符号引用。
初始化:执行静态代码块和静态变量赋值。
2.运行时数据区
方法区:
存储类元数据、常量池等,JDK1.7之前通过永久代实现,JDK1.8之后通过元空间来实现.
堆:
存放对象实例和数组(线程共享)
虚拟机栈:
存储栈帧(局部变量、操作数栈等),每个线程独占。
本地方法栈:
支持本地方法(如C/C++代码)调用。
程序计数器:
记录当前线程执行的字节码指令地址。
3.执行引擎
解释或编译字节码为机器码并执行
解释器:
逐行解释字节码,启动速度快但效率低。
即时编译器:
将热点代码编译为本地机器码(如HotSpot的C1/C2编译器)。
垃圾回收器:
自动回收堆内存中的无用对象(如Serial、G1、ZGC等算法)。
4.本地方法接口
提供调用非Java代码(如C/C++库)的能力,通过native关键字声明方法。
5.本地库
JVM依赖的底层系统库(如文件操作、线程管理等),通过JNI与操作系统交互。
补充:
1.对于局部变量,栈帧这些变量无需考虑线程安全问题,对于对象实例和数组则需考虑线程安全问题
2.栈的内存溢出分为栈帧过多(无递归出口或递归次数过多)和栈帧过大来两种情况,其中第一种情况较为常见
3.jvm相关的指令
jmap(Java Memory Map)是JDK提供的一个命令行工具,主要用于生成Java堆内存的详细信息。它可以帮助开发者分析内存使用情况、对象分布以及内存泄漏问题。
jmap(Java Memory Map)是JDK提供的一个命令行工具,主要用于生成Java堆内存的详细信息。它可以帮助开发者分析内存使用情况、对象分布以及内存泄漏问题。
jstack 是 JDK 自带的命令行工具,主要用于生成 Java 虚拟机(JVM)中线程的快照(Thread Dump),帮助开发者分析线程状态、定位死锁、线程阻塞等问题。
javap是 JDK 自带的命令行工具,用于反编译 Java 类文件,显示类的成员、方法签名、字节码等信息。它通常用于调试、分析类文件结构或理解编译后的代码行为。基本语法为javap [options] <classname>
JVisualVM 是 Java 虚拟机(JVM)监控和性能分析工具,集成在 JDK 中,支持本地和远程 JVM 监控。它提供内存、线程、CPU 分析等功能,适用于开发和生产环境的问题诊断。
