JVM

95 阅读4分钟

JVM

JVM分为内存模型,加载,常用的JVM配置参数,垃圾回收算法,垃圾回收器,常用的内存排查工具,OutOfMemeory和StackOverFlow等问题,FullGC的排查思路

JVM初识

jvm有很多的种类, 比如IBM的,Oracle的,Sun的。因此,Oracle收购了Sun公司,进行了整合。现在最流行的JVM是hotspot。

JVM内存模型

jvm的内存模型有:堆,栈,常量池,方法区,本地方法栈,程序计数器。可以参考如下的图片

image.png

JVM整体流程

.class文件->加载->连接(包含验证,准备,解析)->初始化->使用->卸载(使用垃圾回收算法)

加载

加载过程中,要验证class文件的内容。 .class文件包含魔法数,主版本号,副版本号,方法,字段,常量池

  1. 魔法数:16进制的数
  2. 主版本号: 52表示jdk8
  3. 副版本号: 0 开始
  4. 方法:类中的方法数量
  5. 字段:类变量的数量
  6. 常量池:

连接

验证

验证是否符合java虚拟机规范,

准备

对类的静态变量进行赋初始值,符号引用

解析

符号引用编程直接引用

初始化

对类中的基本变量,引用变量进行赋值。(方法中的变量不在这里赋值)

使用

正常使用

卸载

利用垃圾回收算法进行回收,其中,标记清除,标记整理,复制整理,三色标记清除等垃圾回收算法

常用的垃圾回收器:CMS,G1

JVM常用参数

jvm常用的参数有:

  • -Xms:最小内存
  • -Xmx:最大内存
  • -Xmm:默认内存(一般保持和最大内存一致)
  • -XprintOutOfMemoryGCLog:打印OOM日志
  • -XDumpPath: dump的日志

JVM常用垃圾回收算法

  • 利用原理:引用 和可达性分析算法
  • 常用的算法:标记清除, 标记整理,复制整理,

JVM常用的垃圾回收器

堆分为新生代,老年代。 新生代又分为伊甸园,生存区; eden与survivor的比例为1:8

  • 最老的:
  • CMS
  • G1

常用的排查工具

  • Arthas:
  • ClassLib
  • jad反编译
  • jdk自带: jdump,jstack,jconsole,jps
  • Profiler:
  • MAT:直方图,直接引用,被引用

内存排查思路

  1. top命令查看占用进程,top -p 查看对应的线程
  2. jstack 线程id 查看对应的堆栈信息
  3. jdump 备份对应的信息
  4. scp 或者wget获取对应的信息。
  5. 利用MAT,Arthas查看对应的信息。
  6. 找到占用内存最多的对象。# JVM

JVM分为内存模型,加载,常用的JVM配置参数,垃圾回收算法,垃圾回收器,常用的内存排查工具,OutOfMemeory和StackOverFlow等问题,FullGC的排查思路

JVM初识

​ jvm有很多的种类, 比如IBM的,Oracle的,Sun的。因此,Oracle收购了Sun公司,进行了整合。现在最流行的JVM是hotspot。

JVM内存模型

​ jvm的内存模型有:堆,栈,常量池,方法区,本地方法栈,程序计数器。可以参考如下的图片

image-20240102230248581

JVM整体流程

​ .class文件->加载->连接(包含验证,准备,解析)->初始化->使用->卸载(使用垃圾回收算法)

加载

​ 加载过程中,要验证class文件的内容。 .class文件包含魔法数,主版本号,副版本号,方法,字段,常量池

  1. 魔法数:16进制的数
  2. 主版本号: 52表示jdk8
  3. 副版本号: 0 开始
  4. 方法:类中的方法数量
  5. 字段:类变量的数量
  6. 常量池:

连接

验证

​ 验证是否符合java虚拟机规范,

准备

​ 对类的静态变量进行赋初始值,符号引用

解析

​ 符号引用编程直接引用

初始化

​ 对类中的基本变量,引用变量进行赋值。(方法中的变量不在这里赋值)

使用

​ 正常使用

卸载

​ 利用垃圾回收算法进行回收,其中,标记清除,标记整理,复制整理,三色标记清除等垃圾回收算法

​ 常用的垃圾回收器:CMS,G1

JVM常用参数

​ jvm常用的参数有:

  • -Xms:最小内存
  • -Xmx:最大内存
  • -Xmm:默认内存(一般保持和最大内存一致)
  • -XprintOutOfMemoryGCLog:打印OOM日志
  • -XDumpPath: dump的日志

JVM常用垃圾回收算法

  • 利用原理:引用 和可达性分析算法
  • 常用的算法:标记清除, 标记整理,复制整理,

JVM常用的垃圾回收器

堆分为新生代,老年代。 新生代又分为伊甸园,生存区; eden与survivor的比例为1:8

  • 最老的:
  • CMS
  • G1

常用的排查工具

  • Arthas:
  • ClassLib
  • jad反编译
  • jdk自带: jdump,jstack,jconsole,jps
  • Profiler:
  • MAT:直方图,直接引用,被引用

内存排查思路

  1. top命令查看占用进程,top -p 查看对应的线程
  2. jstack 线程id 查看对应的堆栈信息
  3. jdump 备份对应的信息
  4. scp 或者wget获取对应的信息。
  5. 利用MAT,Arthas查看对应的信息。
  6. 找到占用内存最多的对象。