JVM
2020-03-24 12:02:14 1 举报
AI智能生成
jvm知识体系思维导图,阐述了jvm的基础知识和性能优化
作者其他创作
大纲/内容
4-垃圾回收
垃圾对象识别
引用计数法
可达性分析
GCRoot
虚拟机栈中的本地变量
static成员
常量引用
本地方法栈中的变量
类加载器
Thread
垃圾收集算法
标记-清除
空间碎片,内存不连续
标记和清除都比较耗时,效率低
复制
弊端
空间浪费
优势
空间连续
标记-整理
分代收集算法
新生代
复制算法,适用于少量对象存活的场景
老年代
标记/清除或标记/整理
垃圾收集器
考量
吞吐量
停顿时间
收集器
串行收集器
Serial
Serial Old
并行收集器 吞吐量优先
ParNew
Paraller Scavenge
Paraller Old
并发收集器 停顿时间优先
CMS
G1
如何选择
官方指导策略
G1收集器使用
开启需要的垃圾收集器
5-JVM参数
参数分类
标准参数
-X参数
-Xx参数
Boolean类型
非Boolean类型
其他参数
查看参数
设置参数
开发工具中设施
运行jar: java -XX:+UseG1GC xxx.jar
web容器,比如Tomcat,在启动脚本中
jinfo实时调整某个java进程的参数
常用参数
实用参数文章
JVM参数生成
7-JVM工具
常用命令
查看Java进程:jps
jinfo
实时查看jvm参数
实时调整jvm参数
查看虚拟机性能统计信息:jstat
查看线程堆栈信息:jstack
生成堆快照:jmap
打印堆内存信息
查看堆上对象分布情况
dump出堆内存相关信息
堆内存溢出时自动dump
常用工具
jconsole
jvisualvm
arthas
java堆分析器:MAT
GC日志分析
gceasy
GC日志打印
GCViewer
8-JVM性能优化
GC优化
引发GC的情况
Eden区或S区不够用
old区不够用
方法区空间不够用
System.gc
GC日志分析
G1日志
G1调优
官网建议
最佳指南
JIT
HotSpot编译
C1 client,编译速度快,优化比较保守
C2 server,编译速度慢,优化比较激进
C1+C2 分层编译,jdk1.8前默认关闭
热点检测
基于采样方式探测
基于计数器的热点探测
编译优化
CodeCache
-XX:InitialCodeCacheSize 初始大小
-XX:ReservedCodeCacheSize 最大大小
逃逸分析
-XX:+EliminateLocks 同步消除
-XX:+EliminateAllocations 标量替换
栈上分配
编译阀值
client 默认1500
server 默认10000
栈上替换
高并发场景分析
优化指南
发现问题
GC频繁
死锁
OOM
线程池不够用
CPU负载过高
排查问题
打印GC日志,查看minor gc和major gc
jstack查看线程堆栈信息
dump出堆文件,使用MAT分析
合理使用jconsole\jvisualvm\arthas等工具实时查看jvm状态
灵活应用jps\jinfo\jstat\jmap等命令
解决方案
适当增加堆内存/选择合适的垃圾收集器
使用zk、redis等实现分布式锁
设置本地、nginx缓存减少对后端服务的访问
后端代码优化及时释放资源、合理设置线程池的参数
集群部署,减少单点压力
利用一些消息中间件实现异步消息
其他问题补充
内存泄漏与内存溢出
major gc与full gc
G1和CMS区别
不可达的对象一定会被回收吗?
方法区中的无用类回收
不同的引用
STAB与Incremental Update
1-JVM位置
JDK架构图
JVM官方文档
2-源码编译
编译过程
编译原理
源文件编译为类文件过程
类文件
16进制文件
字节码文件
反编译字节码指令解释
3-类加载
类加载机制
装载
通过一个类的全限定名获取定义此类的二进制字节流
将这个字节流代表的静态存储结构转化为方法区的运行时数据结构
在堆中生成一个代表这个类的对象,作为对方法区中这些数据的访问入口
链接
验证
文件格式验证
元数据验证
字节码验证
符号引用验证
准备
为类的静态变量分配内存,并将其初始化为默认值
解析
将类中的符号引用转换为直接引用
初始化
对类的静态变量、静态代码块执行初始化操作
类装载器
分类
BootStrap ClassLoader
Extension ClassLoader
App ClassLoader
自定义ClassLoader
双亲委派机制
4-运行时数据区
方法区
堆
old区
young区
Survivor (s0+s1 或者From+To)
Eden
堆上对象生命过程
虚拟机栈
栈
通过堆栈指针移动进行快速有效的分配存储,仅次于寄存器
存在栈中的数据大小和生命周期必须是确定的
栈数据可以在栈内共享(字面值引用)
栈桢
局部变量表
操作数栈
动态链接
方法出口
本地方法栈
程序计数器
其他补充
栈指向堆
局部变量 Object obj=new Object()
方法区指向堆
静态变量 private static Object obj=new Object()
堆指向方法区
java对象头中的Class Pointer
Java对象内存布局
对象头
Mark Word
8字节
Class Pointer
8字节
Length:数组对象特有
4字节
实例数据:包含了对象的所有成员变量
大小由变量类型决定
对其补充
为了保证对象的大小为8字节的整数倍
内存溢出
堆内存溢出
方法区内存溢出
栈溢出
0 条评论
下一页