JVM入门笔记
# 字节码内容
# 内存结构
# 程序计数器
程序计数器,英文名是 Program Counter Register,是线程私有内存,基于寄存器实现,主要作用是记录下一个要执行的 JVM 指令,具体体现为:
- 当线程执行过程中 CPU 离开后重新调度时,能够接着上次执行的位置继续向下执行
- 当方法 a 调用方法 b 时,b 方法执行结束后能回到调度的位置,继续向下执行
# 虚拟机栈
栈内存,又被称为虚拟机栈,英文名是 JVM Stacks,为线程工作提供运行空间是线程私有内存
- 栈内存中主要用来存储栈帧,例如方法调用为
a→b→c
每个方法对应一个栈帧,三个栈帧依次入栈,先进后出 - 栈帧中存储方法运行中产生的一些数据,例如局部变量
- 方法嵌套调用过多或者错误的递归调用容易导致
Stack Overflow
栈内存溢出 - 栈内存大小默认为1MB,可以通过 Xss 设置栈内存大小,例如
-Xss2048k
,需要注意的是物理机内存是有容量限制的,栈内存分配的空间越大那么可创建的线程数量就越少,分配内存前须谨慎考虑
CPU高占用检测方案
- 使用
top
命令查看 Java 项目对应的 PID - 使用
ps H -eo pid,tid,%CPU,%MEM | grep PID
查看该进程的所有线程 ID - 将线程ID(TID)转十六进制后,使用
jstack
命令查看线程信息
# 本地方法栈
本地方法栈,英文名是 Native Method Stacks,为本地方法提供运行空间是线程私有内存
本地方法栈的作用与虚拟机栈类似,不同的是本地方法栈为本地方法工作,指的是 Java 源码中常见的使用native
关键字的代码,JVM 通过本地方法实现执行 C/C++ 的代码
# 堆
堆内存,英文名是 Heap,是线程共享内存,通过 new 关键字创建的对象都使用堆内存,有垃圾回收机制不定期清理内存
- 堆内存没有默认大小,可以通过
-Xms
设置堆初始内存大小,-Xmx
设置堆最大内存大小
堆内存诊断工具
jmap -heap PID
jconsole
可视化工具,通过PID连接进程进行监控jvisualvm
可视化工具,通过PID连接进程进行监控
# 方法区
方法区,英文名Method Area
,是线程共享内存,主要存储类的结构信息,例如变量,方法以及构造等信息
上次更新: 2024-09-24, 19:37:16