JVM原理和工具
2020-07-13 15:38:49 0 举报
AI智能生成
另类总结JVM
作者其他创作
大纲/内容
拾遗
shutdownhook
优雅停止服务
Runtime.getRuntime().addShutdownHook()
场景
程序正常退出
Ctrl + C
System.exit()
kill $pid
系统关闭
锁
多工具
jps
jinfo
jmap
jmap -heap $pid
jmap -histo:live $pid|head -n 20
jmap -dump:format=b,file=filename.dump $pid
jstat
jstat -gcutil $pid 1s
jstack
jstack -l $pid
jconsole
visual vm
java mission control
四程(动态过程)
编译过程
源码—>字节码
词法分析
TOKEN流
语法分析
抽象语法树
语义分析
标注语法树
插入式注解处理器
字节码生成
JVM字节码
字节码—>机器码
解释器
即时编译 JIT
逃逸分析
方法内联
方法访问
循环回边
锁消除
提前编译 AOT
类加载过程
加载
双亲委派
链接
验证
准备
解析
初始化
对象分配和回收过程
对象创建
栈上分配
线程本地分配缓存 TLAB
Eden
老年代
垃圾回收
GcRoots
两静
静态属性
常量
两栈
虚拟机栈
本地方法栈
两内
内部引用:基本类型Class、常驻异常、类加载器
内部状态:JMX、JVMTI、本地代码缓存等
一锁:锁对象
四种引用
强Strongly
软Soft
弱Weak
虚Phantom
分代假说
弱分代:朝生夕灭
强分代:强者恒强
跨代:井水不犯河水
回收算法
标记-清除
标记-复制
标记-整理
技术实现
安全点、安全区域
记忆集、卡表
三色标记
垃圾回收器
新生代
Serail、ParNew、Parallel
老年代
SerailOld、ParallelOld、CMS
全堆
G1
低延迟
ZCG、Shenandoah
线程状态转换过程
New
Runnable
Waiting
Timed Waiting
Blocked
Terminated
一令:字节码指令
字节码指令
栈指令
加载、存储
iload、istore、iconst等
运算
iadd、isub、imul、idiv、irem、ior、iand、iinc、dcmpg等
栈操作
pop、dup、swap等
语言特性
对象创建与访问
new、newarray、getfield、instanceof、checkcast等
类型转换
long、float、double
方法调用与返回
invokevitual、invokeinterface、invokespecial、invokestatic、invokedynamic
控制
ifeq、goto、lookupswitch等
异常
jsr、ret等,现在已改为使用异常表来完成
同步
monitorenter、monitorexit
字节码黑科技
两种Agent
Native Agent
通过JVMTI,订阅感兴趣的JVM事件
应用:JProfile、JRebel
Java Instrumentation
premain
javaagent:/path/agent.jar MF文件Premain-Class配置
agentmain
应用:AspectJ、Jacoco、SpringLoaded、btrace
两种Attach
VM attach
通过Unix Domain Socket 与目标JVM的Attach Listener线程进行交互
应用:jcmd、jmap -dump、jmap -histo、jstack
SA: Serviceability Agent
停顿JVM,比VM attach慢
主要调用ptrace实现
应用:jstack、jmap -F 强制模式
问题:非正常退出时,会导致目标JVM一直挂起(kill -18激活)
两种Data
PerfData
实现:/tmp/hsperfdata_$username/$pid
应用:jps、jstat
JMX
二规
Java语言规范
词法
语法
数据类型
方法
JVM规范
虚拟机内部结构
虚拟机执行的字节码类型和功能
class文件结构
类加载、链接、初始化
三“街”(静态结构)
class文件结构
魔数
版本号:小版本、大版本
常量池个数、常量池
访问标志、类名、父类名
接口个数、接口
字段个数、字段
方法个数、方法
属性个数、属性
对象结构
对象头
markword
hashcode
gc年龄
锁标志、偏向锁线程ID、时间戳
类型指针
(数组长度)
实例数据
(对齐)
运行时内存结构
线程共享
方法区
永久代(JDK7)
-XX:MaxPermSize
元数据区(JDK8)
-XX:MaxMetaspaceSize
堆[-Xms, -Xmx]
新生代 -Xmn、-XX:SurvivorRatio
Eden
S0
S1
老年代 -XX:NewRatio
PC计数器
线程独享
虚拟机栈 -Xss
栈帧
局部变量表
返回地址
动态链接
指向所属方法的引用
操作数栈
附加信息
调试
性能
本地方法栈
直接内存 -XX:MaxDirectMemorySize
0 条评论
下一页