4-JVM
2023-03-28 15:37:36 0 举报
AI智能生成
JVM学习笔记
作者其他创作
大纲/内容
线程数据缓存一致性
CPU层次<br>
CPU缓存结构图<br>
方式1:总线锁BusLock
方式2:实现各种各样的缓存一致性协议+总线锁<br>
MESI协议
图示<br>
缓存行
伪共享问题
缓存行填充
指令重排序
问题
乱序执行
合并写技术 WriteCombineBuffer<br>
CPU方案
内存屏障 Store Load<br>
Lock指令
JVM层级
内存屏障<br>
javaAgent
premain方法<br>
打包<br>
启动<br>
基础知识<br>
JVM的具体实现
Hotspot
TaobaoVM<br>
LiQuidVM<br>
azul zing<br>
JVM的编译模式
混合模式:-Xmixed
纯解释 -Xint
纯编译 -Xcomp
Class文件格式
minor_version
major_version
ConstantPool<br>
Method Code<br>
<clinit>
<init>
_store_x
_load_x<br>
invoke_xxx
invokeStatic
invokeVirtual<br>
invokeSpecial<br>
invokeInterface<br>
invokeDynamic
一段代码<br>
字节码解释
类的加载三大过程
Loading
ClassLoader 双亲委派机制<br>
分层加载
BootStrap<br>
Extension
App
Custom
继承ClassLoader 重写 findClass 方法<br>
继承ClassLoader 重写 loadClass 方法
获取某个类的加载器<br>
Lingking
verification
prepare
solution<br>
Initializing<br>
JVM的Runtime Data Area<br>
MethodArea <br>
Heap
PC
Stack
栈帧 frame
local variables<br>
Operand Stack<br>
Dynamic Linking<br>
Return Address<br>
NativeMethodStack
结构图
JVM中的对象
对象创建的步骤
Loading Linking Initializing<br>
申请一块内存空间<br>
成员变量赋默认值
执行构造函数<br>
成员变量赋初始值
执行构造函数语句
对象在内存中的结构<br>
指针压缩模式
结构
markword<br>
标记描述,包括hashcode信息,锁信息,GC标记。(属于对象头信息 默认8字节)<br>
子主题
class pointer<br>
指向 类.class 的地址。 记录这个对象属于哪个class。(属于对象头信息 默认4字节)<br>
instance data<br>
记录成员变量的地址。如果有一个int类型成员变量,占4字节<br>
padding<br>
对齐8字节。64位系统,整个类的所占字节数需要被8字节整除<br>
结构图
获取对象的大小
JOL工具
子主题
子主题
Garbage Collection<br>
对象的内存分配<br>
1 尝试栈存储<br>
2 大对象直接分配到老年代<br>
2 线程本地区域分配 TLAB
eden区存储<br>
垃圾回收年龄不够到 survivor 区<br>
垃圾回收年龄到达 进入老年代<br>
图示
堆内存的划分
MinorGC或者叫YGC<br>
年轻代 Yong<br>
eden区
survivor 1,2区<br>
MajorGC或者FullGC
老年代 Old<br>
GC 算法思路<br>
找到垃圾
方式1 refrence_count 对象头记录被引用次数。<br>
方式2 rooting search 跟可达算法<br>
清理垃圾
1. Mark-Sweep 标记清除 <br>
2. Mark-Compress 标记压缩<br>
3. Copying 复制算法<br>
常用的垃圾收集器组合
单线程串行回收 Serial+SerialOld <br>
Serial Copy算法<br>
SerialOld MC算法<br>
-XX:+UseSerialGC。<br>
多线程并行回收 PS+PO<br>
ParallbelScavenge Copy算法<br>
ParallbelOld MC算法
-XX:+UseParallelGC 和 -XX:+UseParallelOldGC
-XX:PretenureSizeThreshold
并发清理 ParNew+CMS+SerialOld<br>
ParNew
ConcurrentMapSweep
四个阶段
初始标记 initial mark
并发标记 concurrent mark:<br>
重新标记 remark
并发清理 concurrent sweep
问题
碎片问题
浮动垃圾问题
SerialOld
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
G1收集器 逻辑分代<br>
基本概念<br>
region
图示
Rset(Remember Set)
CSet(Collection Set)<br>
Card Table
三色标记法<br>
黑,灰,白
解决漏标问题<br>
方法1(CMS使用):Incremental update
方法2(G1使用):SATB snapshot at a begining。<br>
-XX:+UseG1GC<br>
调优参数<br>
-XX:InitiatingHeapOccupancyPercent=45
-XX:+G1HeapRegionSize<br>
ZGC
颜色指针<br>
STW(Stop The World )
JVM调优和分析
JVM参数
日志参数
-XX:+PrintFlagsFinal 打印最终系统参数列表<br>
-Xms -Xms 最小堆和最大堆,建议设置为同样的值
其他
调优大方向
无压测不调优
预调优
案例1
案例2
常规操作
垃圾收集器的选定
堆大小设置
GC日志信息配置<br>
优化JVM慢,卡顿
案例1
案例2 CPU飙高<br>
案例3 内存飙高<br>
OOM<br>
优化步骤
top命令查看占资源的进程<br>
top -Hp 【24108】 查看该进程下的子线程<br>
jps 列出java相关进程<br>
jinfo[pid] 查看配置参数<br>
jstack 【24108】 打印线程栈信息。<br>
jmap, jmap -histo 3898 |head -20 观察堆内存中的 类的对象数量,和大小。<br>
java -XX:+HeapDumpOnOutOfMemoryError<br>
监测工具<br>
jprofiler 收费工具<br>
Arthas 免费工具<br>
JVisualVM JDK自带 分析java -XX:+HeapDumpOnOutOfMemoryError文件<br>
JConsole JDK自带 分析java -XX:+HeapDumpOnOutOfMemoryError文件
0 条评论
下一页