一,jvm类加载机制
1.1 什么是类加载机制
java代码编译后就会生成JVM能够识别的二进制字节流文件*.class文件,将class文件加载到内存,最终成为可以被JVM直接使用的Java类型,这个过程叫做JVM的类加载机制。
1.2 类加载过程
class文件中的“类”从加载到JVM内存中,到卸载出内存过程有七个生命周期阶段:

2026/9/27大约 18 分钟
java代码编译后就会生成JVM能够识别的二进制字节流文件*.class文件,将class文件加载到内存,最终成为可以被JVM直接使用的Java类型,这个过程叫做JVM的类加载机制。
class文件中的“类”从加载到JVM内存中,到卸载出内存过程有七个生命周期阶段:

top查询各个进程cup占用率的,找到占用高的进程的pid,top -H -p 进程pid 查看进程中cpu占用率高的线程id,这里看的线程id是十进制printf "%x\n" 线程id十进制 将进程id是十进制转为十六进制。jstack 进程pid > thread_dump.log获取进程中所有线程快照文件hread_dump.log,然后查询hread_dump.log文件中grep -A 20 线程id的十六进制 thread_dump.log 线程的日志信息 。jstack 进程pid | grep 线程id的十六进制 -A 50 打印的日志信息就能查到是那段代码。
线程共享区:
线程独占区:
IDEA 控制台输出JVM的GC日志,在 VM options 添加
-XX:+PrintGCDetails即可
在每个对象都维护着一个内存字段来统计它被多少”部分”使用—引用计数器,每当有一个新的引用指向该对象时,引用计数器就+1 ,每当指向该引用对象失效时该计数器就-1 ,当引用数量为0的时候,则说明对象没有被任何引用指向,可以认定是”垃圾”对象.
七款经典的垃圾收集器:
| 收集器 | 串行、并行or并发 | 新生代/老年代 | 算法 | 目标 | 适用场景 |
|---|---|---|---|---|---|
| Serial | 串行 | 新生代 | 复制算法 | 响应速度优先 | 单CPU环境下的Client模式 |
| Serial Old | 串行 | 老年代 | 标记-整理 | 响应速度优先 | 单CPU环境下的Client模式、CMS的后备预案 |
| ParNew | 并行 | 新生代 | 复制算法 | 响应速度优先 | 多CPU环境时在Server模式下与CMS配合 |
| Parallel Scavenge | 并行 | 新生代 | 复制算法 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 |
| Parallel Old | 并行 | 老年代 | 标记-整理 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 |
| CMS | 并发 | 老年代 | 标记-清除 | 响应速度优先 | 集中在互联网站或B/S系统服务端上的Java应用 |
| G1 | 并发 | both | 标记-整理+复制算法 | 响应速度优先 | 面向服务端应用,将来替换CMS |
HotSpot虚拟机的对象头主要包括两部分信息markword和klass,如果是数组实例还会包含数组长度。
第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit,官方称它为“MarkWord”。
| 概念 | 定义 | 后果 |
|---|---|---|
| 漏标 | 并发标记时,黑色对象(已扫描)新引用了白色对象(未扫描),且这个引用关系没有被记录下来。 | 致命错误:白色对象会被 GC 当作垃圾回收,但应用线程实际还在使用它,导致程序崩溃。 |
| 浮动垃圾 | 并发标记时,某个对象被标记为黑色(存活),但在标记完成后、实际清理前,应用线程断开了对该对象的引用。 | 可接受:这个对象本应被回收,但本次 GC 会放过它,留到下一次 GC 才清理,只是降低了回收效率。 |