参考:https://www.bilibili.com/video/av71330748/?p=7
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
1.jvm 组成结构如下图所示
(1) 堆,虚拟机所管理内存中最大的一块,线程共享,在虚拟机启动时创建,生命周期同JVM相同,存储对象信息。
(2) 方法区,方法区是一块线程共享的内存区域,存储类加载信息、保存常量、静态常量、类元信息等。
(3) 线程栈,线程私有,生命周期同线程相同。启动一个线程,程序调用函数,栈帧被压入栈中,函数调用结束,相应栈帧出栈。栈帧:由局部变量表,操作数栈,动态链接,方法出口组成。
(4)本地方法栈,本地方法是由C语言编写的,java 通过本地方法调用系统底层函数。
(5) 程序计数(PC):前线程所执行的字节码的行号指示器.
(6) 直接内存: 不属于java 虚拟机中的内存区域,例如NIO 使用native函数库直接分配堆外内存,受总内存影响,根据实际情况设置参数-Xmx信息。
详细扩展
基础插件:jvisual vm,Gc 可视化插件 Visual Gc ,Jdk 命令,Gc日志打印
- GC打印参数: -XX:+PrintGCDetails
(1)jps 查看JVM 进程。
(2)jstack 观察JVM所有线程运行情况和当前状态。
(3) jstat 常用查看堆内存各个部分的使用情况、以及加载类的数量。
类加载统计:
类编译统计:
垃圾回收统计:
堆内存统计:
新生代垃圾回收统计
新生代内存统计
老年代垃圾回收统计
老年代内存统计
元数据空间统计
总结垃圾回收统计
jstat -gcutil pid interval 数值显示占百分比,jstat -gc pid 打印大小。
(4)jconsole 图形化查看内存线程等信息,集成了jstat、jstack。
(5)jmap,dump java进程的内存状态,jmap -dump:file=xxx pid , jmap -head pid 打印堆内存使用详细信息,
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录} 进行dump 内存使用情况文件。
GC 分类
https://blog.csdn.net/qq_33915826/article/details/79672772