JVM内存模型及性能调优

参考: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日志打印

 

  1. 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

代码交流 2021