关于JVM最全的知识点
2022-02-21 18:21:50 0 举报
AI智能生成
关于JVM最全的知识点
作者其他创作
大纲/内容
OOM 类别
OutOfMemoryError:Java heap space
导致原因
超出预期的访问量或者数据量
内存泄漏
OOM unable to create native thred
导致原因
Java应用程序已达到其可以启动线程数的限制。与操作系统有关
OutOfMemoryError: PermGen space
导致原因
永久区中装入了太多的类或太大的类
OutOfMemoryError: Metaspace error
导致原因
JDK 1.8 以后去除了永久代,将类信息放入到了元空间中
而默认情况下元空间使用的本地内存,所以在JVM 启动参数中如果
设置了 -XX:MaxMetaspaceSize参数就会限定元空间的
大小,从而导致错误的产生
而默认情况下元空间使用的本地内存,所以在JVM 启动参数中如果
设置了 -XX:MaxMetaspaceSize参数就会限定元空间的
大小,从而导致错误的产生
类加载机制
什么是类加载
类的.class文件中的二进制数据读入到
内存中,将其放在运行时数据区的方法区
中,然后在堆中创建一个 java.lang.Class
对象,用来封装类在方法区内的数据结构。
类的加载的最终产品是位于堆中的 Class 对象
Class 对象封装了类在方法区内的数据结构,
并向 Java 程序员提供了访问方法区内的数据结构
的接口
内存中,将其放在运行时数据区的方法区
中,然后在堆中创建一个 java.lang.Class
对象,用来封装类在方法区内的数据结构。
类的加载的最终产品是位于堆中的 Class 对象
Class 对象封装了类在方法区内的数据结构,
并向 Java 程序员提供了访问方法区内的数据结构
的接口
类加载的过程
加载
通过类的全限定名来获取定义此类的二进制字节流
从 ZIP 包中读取,最终发展成日后的 JAR、EAR、WAR 格式的基础
从网络中获取
运行时计算生成,动态代理技术
其他文件生成,JSP 应用,由 JSP 文件生成对应的 Class 类
从数据库中读取
将此字节流所代表的的静态存储结构转化为方法区的运行时数据结构
在内存中生成一个代表这个类的 java.lang.Class对象,作为这个类的各种数据的访问入口
验证
文件格式的验证
元数据的验证
字节码的验证
符号引用的验证
准备
为类变量分配内存并设置类变量初始值的阶段
解析
将常量池内的符号引用替换为直接引用的过程
初始化
类加载器
启动类加载器(Bootstrap)
负责加载<JAVA_HOME>/lib目录下
扩展类加载器(Extension)
负责加载<JAVA_HOME>/lib/ext目录下
应用程序类加载器(Application)
负责加载用户类路径 ClassPath 下的类
自定义类加载器
类加载机制
全盘负责
当一个类加载器加载一个类时,该类所依赖的其他类也会被这个类加载器加载到内存中
双亲委派机制
如果一个类加载器收到一个类加载的过程,它首先不会自己去加载这个类
而是会先将这个请求委派给父类加载器去完成,只有父类加载器无法完成
这个加载请求时(它的搜索范围没有这个类),子加载器才会自己去加载
而是会先将这个请求委派给父类加载器去完成,只有父类加载器无法完成
这个加载请求时(它的搜索范围没有这个类),子加载器才会自己去加载
缓存机制
有的Class对象都会被缓存,当程序需要使用某个Class时,类加载器先从缓存中查找,找不到
才从class文件中读取数据,转化成Class对象,存入缓存中
才从class文件中读取数据,转化成Class对象,存入缓存中
JVM 内存结构
共享内存
方法区
加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
堆
几乎所有的对象实例
线程私有
程序计数器
当前线程所执行的字节码的行号指示器
Java 栈
存储局部变量表、操作栈、动态链接、方法出口等信息
本地方法栈
虚拟机使用到的 Native 方法服务
GC算法
对象存活判断
引用计数器
可达性分析
GC 算法
标记-清除算法
复制算法
标记压缩算法
分代收集算法
垃圾回收器
Serial 收集器
ParNew 收集器
Parallel 收集器
Parallel Old 收集器
CMS 收集器
G1 收集器
GC 分析
获取 GC 日志
命令动态查看
jstat -gc pid
设置相关参数打印 GC 日志
-XX:+PrintGC 输出 GC 日志
-XX:+PrintGCDetails输出 GC 的详细日志
-XX:+PrintGCTimeStamps输出 GC 的时间戳间的形式
-XX:+PrintHeapAtGC在进行 GC 前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
分析工具
GChisto
GC Easy
地址:http://gceasy.io
JVM调优-命令篇
jps
显示进程
jstat
虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等
运行数据
运行数据
jstat -class pid
jstat -compiler pid
jstat -gc pid
返回值说明
S0C:survivor0区的总容量
S1C:survivor1区的总容量
S0U:survivor0区已使用的容量
S1C:survivor1区已使用的容量
EC:Eden区的总容量
OC:Old区的总容量
OU:Old区的总容量
PC:当前 Pern 的容量(KB)
PU:Perm的使用(KB)
YGC:新生代垃圾回收次数
YGCT:新生代垃圾回收时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收时间
GCT:垃圾回收总消耗时间
jstat -gccapacity pid
返回值说明
NGCMN:新生代占用的最小空间
NGCMX:新生代占用的最大空间
OGCMN:老年代占用的最小空间
OGCMX:老年代占用的最大空间
OGC:当前老年代的容量(KB)
OC:当前老年代的空间(KB)
PGCMN:perm占用的最小空间
PGCMX:perm占用的最大空间
jmap
生成heap dump 文件
-heap pid
heap的概要信息,GC 使用的算法,heap的配置及
wise heap 的使用情况
wise heap 的使用情况
-histo:live pid | more
打印堆的对象统计,包括对象数,内存大小等等
jhat
分析 jamp 生成的 dump
jstack
当前时刻的线程快照
jstack -l tid | more
定位线程出现长时间停顿的原因,如线程死锁、死循环、
请求外部资源导致的长时间等待等等
请求外部资源导致的长时间等待等等
jinfo
实时查看和调整虚拟机运行参数
jinfo - flag pid
JVM调优-工具篇
jconsole
jvisualvm
第三方 MAT
0 条评论
下一页