JVM
2020-03-24 12:02:14 1 举报
AI智能生成
jvm知识体系思维导图,阐述了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
G1日志
G1调优
官网建议
最佳指南
C1 client,编译速度快,优化比较保守
C2 server,编译速度慢,优化比较激进
C1+C2 分层编译,jdk1.8前默认关闭
HotSpot编译
基于采样方式探测
基于计数器的热点探测
热点检测
-XX:InitialCodeCacheSize 初始大小
-XX:ReservedCodeCacheSize 最大大小
CodeCache
-XX:+EliminateLocks 同步消除
-XX:+EliminateAllocations 标量替换
栈上分配
逃逸分析
client 默认1500
server 默认10000
编译阀值
栈上替换
编译优化
JIT
参考文章
高并发场景分析
优化指南
发现问题
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架构图
JDK8架构图
JVM官方文档
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
Length:数组对象特有
4字节
实例数据:包含了对象的所有成员变量
大小由变量类型决定
对其补充
为了保证对象的大小为8字节的整数倍
内存溢出
堆内存溢出
方法区内存溢出
栈溢出
0 条评论
回复 删除
下一页