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相关的指令jmapJava Memory Map是JDK提供的一个命令行工具主要用于生成Java堆内存的详细信息。它可以帮助开发者分析内存使用情况、对象分布以及内存泄漏问题。jmapJava Memory Map是JDK提供的一个命令行工具主要用于生成Java堆内存的详细信息。它可以帮助开发者分析内存使用情况、对象分布以及内存泄漏问题。jstack 是 JDK 自带的命令行工具主要用于生成 Java 虚拟机JVM中线程的快照Thread Dump帮助开发者分析线程状态、定位死锁、线程阻塞等问题。javap是 JDK 自带的命令行工具用于反编译 Java 类文件显示类的成员、方法签名、字节码等信息。它通常用于调试、分析类文件结构或理解编译后的代码行为。基本语法为javap [options] classnameJVisualVM 是 Java 虚拟机JVM监控和性能分析工具集成在 JDK 中支持本地和远程 JVM 监控。它提供内存、线程、CPU 分析等功能适用于开发和生产环境的问题诊断。4.对于jdk1.6之前和jdk1.6之后有一个区别,那就是串池中存储的对象发生变化,1.6之前存字符串的副本,1.6之后存字符串的引用