JVM虚拟机学习 - JVM类加载,JVM内存模型,JVM性能分析工具
JVM虚拟机 二
JVM类加载
类的生命周期
加载:
加载class文件到二进制字节流,然后再将二进制字节流转化为方法区的运行时数据结构,生成一个对应的Class对象作为类各种数据的访问入口。
链接:
-
验证:确保被加载类的正确性,验证字节流是否符合class文件规范,例如魔数以及版本号等。
-
准备:为类的静态变量分配内存并设置变量初始值等。
-
解析:解析出常量池数据和属性表信息
初始化:为标记常量值的字段赋值,执行()方法。
使用:程序代码执行使用的阶段
卸载:程序代码退出,异常,结束等。
JVM内存模型
JDK1.6,JDK1.7,JDK1.8内存模型演变
JDK1.6 常量池存在方法区;JDK1.7细化了常量池,将字符串常量池放到堆中,运行时常量池,类常量池存放在方法区中;JDK1.8中去掉了方法区,设置了元数据区,将运行时常量池和类常量池存放在元数据区。元数据区也放到了直接内存中,不会特定规划JVM的内存。
内存模型各区域介绍
- 程序计数器
较小的内存空间,线程私有,记录当前线程执行的字节码行号。
如果执行Java方法,计数器记录虚拟机字节码当前指令的地址,本地方法则为空。
这一块区域不会出现任何OOM
- Java虚拟机栈
-
每个方法在执行的同时,都会创建一个栈帧,用于存放局部变量表,操作数栈,动态链接,方法出口,线程等信息。
-
方法从调用到执行完成,都对应着栈帧从虚拟机中入栈和出栈的过程。
-
栈帧随着方法创建到结束而创建而销毁。
- 本地方法栈
- 功能类似Java虚拟机栈,本地方法栈执行的是native方法,JVM虚拟机栈执行的是Java服务。
- 可能会抛出stack overflow error或OOM异常。
- 1.8之后虚拟机把本地方法栈和虚拟机栈合二为一。
- 堆和元空间
- JVM内存空间占据最大的一块区域。
- 年轻代和老年代;大小是1:2
- 年轻代:Eden,From Survivor , To Survivor;大小比为8:1:1
- 常量池
- 运行时常量池和类常量池。
- 字符串常量池存放在堆内存区域中。
- 元数据区
元数据区:虚拟内存区域,其实就是直接内存区域。存放运行时常量池和类常量池,以及较大的对象。
JVM故障处理工具
基础故障处理工具
1.jps虚拟机进程状况
功能与ps命令类似,列出正在运行的虚拟机进程,并且显示虚拟机执行主类名称,以及进程的本地虚拟机唯一ID。
jps -q :只列出进程id
jps -L :输出当前运行类全称
jps -m :列出传给main函数的参数
jps -v:输出虚拟机进程启动时JVM参数
jps -lv 127.0.0.1:输出远程机器信息
2.jcmd 虚拟机诊断命令
用来导出堆和线程信息,查看Java进程,执行GC,还可以进行采样分析。但是只能在JVM同台的sever上,并具有相同的用户和组。
jcmd pid VM.flags: 查看JVM启动参数
jcmd pid VM.uptime: 查看JVM运行时长
jcmd pid PerfCounter.print: 查看JVM性能相关参数
jcmd pid GC.class_histogram: 查看系统中类的统计信息
jcmd pid Thread.print: 查看线程堆栈信息
jcmd pid VM.system_properties 查看JVM系统参数
jcmd pid GC.heap__dump 路径 : 导出heap hump 文件
jcmd pid help : 列出可执行操作
jcmd pid help JFR.stop 查看命令使用
3.jinfo Java配置信息工具
jps -v可以把虚拟机启动时显式的参数列表打印,如果想更清晰看具体一个参数或是未被显式指定的参数可以通过jinfo -flag来查询。
4.jstat 收集虚拟机运行数据
jstat:用于监视虚拟机各种运行状态信息。可以查看本地或是远程虚拟机进程中类加载,内存,垃圾收集,即时编译等运行时数据。
jstat -class pid : 类加载统计
jstat -compiler pid : 编译统计
jstat -gc pid : 垃圾回收统计
jstat -gccapacity pid : 对内存统计
jstat -gcnewcapacity pid : 新生代内存统计
jstat -gcnew pid : 新生代垃圾回收统计
jstat -gcold pid : 老年代垃圾回收统计
jstat -gcoldcapacity pid : 老年代内存统计
jstat -gcmetacapacity pid : 元空间内存统计
jstat -gcutil pid: 垃圾回收统计
jstat -printcompilation pid: jvm编译方法统计
5.jmap 内存映射工具
用于生成堆存储快照文件(heapdump文件)。还能查询finalize执行队列,Java堆和方法区的信息。
jmap pid: 打印共享对象映射
jmap -heap pid : 堆详细信息
jmap -clstats pid :打印加载类,需要配置 -XX:+UnlockDiagnosticVMOptions
jmap -dump pid: 堆转存快照文件
6.jhat heapdump快照分析工具
分析jmap生成堆的快照;但是用的不多,基本上都是用第三方工具。
JDK再后边删除这个程序
jhat -port 8090 D:/dump/dump_01
在浏览器上访问localhost:8090即可。
7.jstack: Java堆栈跟踪工具
生成当前时刻线程的快照。这快照记录了当前执行方法堆栈的集合;可以定位线程出现长时间停顿的原因,比如:线程死锁,死循环,请求外部资源耗时较长导致的挂起。
jstack pid
可视化故障处理工具
1.jconsole,Java监视与管理控制台
对系统进行收集和参数调整,可以在虚拟机本身管理还可以在开发软件上,开放服务,有相应的代码API调用。
2.VisualVM 多合故障处理工具
功能最强大的运行监视和故障处理工具之一。
运行监视,故障处理,性能分析等工作。这个工具性能强,对应用程序影响比较小,可以直接接入到生产环境中。
使用:在Java的bin目录下有相关程序,打开即可。可以监视本地,也可以监视远程。手动加载程序,也可以装入dump文件。
总结
类的生命周期:加载 链接(验证,准备,解析) 初始化 使用 卸载
JVM的内存区域:堆,栈,程序计数器,元空间
JVM性能分析与错误排查:java自带的命令工具以及可视化的程序。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报