JVM虚拟机学习 - JVM类加载,JVM内存模型,JVM性能分析工具

JVM虚拟机 二

JVM类加载
类的生命周期

加载:

​ 加载class文件到二进制字节流,然后再将二进制字节流转化为方法区的运行时数据结构,生成一个对应的Class对象作为类各种数据的访问入口。

链接:

  • 验证:确保被加载类的正确性,验证字节流是否符合class文件规范,例如魔数以及版本号等。

  • 准备:为类的静态变量分配内存并设置变量初始值等。

  • 解析:解析出常量池数据和属性表信息

初始化:为标记常量值的字段赋值,执行()方法。

使用:程序代码执行使用的阶段

卸载:程序代码退出,异常,结束等。

JVM内存模型
JDK1.6,JDK1.7,JDK1.8内存模型演变

JDK1.6 常量池存在方法区;JDK1.7细化了常量池,将字符串常量池放到堆中,运行时常量池,类常量池存放在方法区中;JDK1.8中去掉了方法区,设置了元数据区,将运行时常量池和类常量池存放在元数据区。元数据区也放到了直接内存中,不会特定规划JVM的内存。

内存模型各区域介绍
  1. 程序计数器

较小的内存空间,线程私有,记录当前线程执行的字节码行号。

如果执行Java方法,计数器记录虚拟机字节码当前指令的地址,本地方法则为空。

这一块区域不会出现任何OOM

  1. Java虚拟机栈
  • 每个方法在执行的同时,都会创建一个栈帧,用于存放局部变量表,操作数栈,动态链接,方法出口,线程等信息。

  • 方法从调用到执行完成,都对应着栈帧从虚拟机中入栈和出栈的过程。

  • 栈帧随着方法创建到结束而创建而销毁。

  1. 本地方法栈
  • 功能类似Java虚拟机栈,本地方法栈执行的是native方法,JVM虚拟机栈执行的是Java服务。
  • 可能会抛出stack overflow error或OOM异常。
  • 1.8之后虚拟机把本地方法栈和虚拟机栈合二为一。
  1. 堆和元空间
  • JVM内存空间占据最大的一块区域。
  • 年轻代和老年代;大小是1:2
  • 年轻代:Eden,From Survivor , To Survivor;大小比为8:1:1
  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自带的命令工具以及可视化的程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值