JVM
JVM分为内存模型,加载,常用的JVM配置参数,垃圾回收算法,垃圾回收器,常用的内存排查工具,OutOfMemeory和StackOverFlow等问题,FullGC的排查思路
JVM初识
jvm有很多的种类, 比如IBM的,Oracle的,Sun的。因此,Oracle收购了Sun公司,进行了整合。现在最流行的JVM是hotspot。
JVM内存模型
jvm的内存模型有:堆,栈,常量池,方法区,本地方法栈,程序计数器。可以参考如下的图片
JVM整体流程
.class文件->加载->连接(包含验证,准备,解析)->初始化->使用->卸载(使用垃圾回收算法)
加载
加载过程中,要验证class文件的内容。 .class文件包含魔法数,主版本号,副版本号,方法,字段,常量池
- 魔法数:16进制的数
- 主版本号: 52表示jdk8
- 副版本号: 0 开始
- 方法:类中的方法数量
- 字段:类变量的数量
- 常量池:
连接
验证
验证是否符合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:直方图,直接引用,被引用
内存排查思路
- top命令查看占用进程,top -p 查看对应的线程
- jstack 线程id 查看对应的堆栈信息
- jdump 备份对应的信息
- scp 或者wget获取对应的信息。
- 利用MAT,Arthas查看对应的信息。
- 找到占用内存最多的对象。# JVM
JVM分为内存模型,加载,常用的JVM配置参数,垃圾回收算法,垃圾回收器,常用的内存排查工具,OutOfMemeory和StackOverFlow等问题,FullGC的排查思路
JVM初识
jvm有很多的种类, 比如IBM的,Oracle的,Sun的。因此,Oracle收购了Sun公司,进行了整合。现在最流行的JVM是hotspot。
JVM内存模型
jvm的内存模型有:堆,栈,常量池,方法区,本地方法栈,程序计数器。可以参考如下的图片
JVM整体流程
.class文件->加载->连接(包含验证,准备,解析)->初始化->使用->卸载(使用垃圾回收算法)
加载
加载过程中,要验证class文件的内容。 .class文件包含魔法数,主版本号,副版本号,方法,字段,常量池
- 魔法数:16进制的数
- 主版本号: 52表示jdk8
- 副版本号: 0 开始
- 方法:类中的方法数量
- 字段:类变量的数量
- 常量池:
连接
验证
验证是否符合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:直方图,直接引用,被引用
内存排查思路
- top命令查看占用进程,top -p 查看对应的线程
- jstack 线程id 查看对应的堆栈信息
- jdump 备份对应的信息
- scp 或者wget获取对应的信息。
- 利用MAT,Arthas查看对应的信息。
- 找到占用内存最多的对象。