JVM 学习
基础篇
Java 支持跨平台
字节码文件详解
1、 应用场景
版本冲突、系统升级
2、字节码 文件的组成
3、 打开 class字节码文件
4、 基础信息
解决版本不兼容
52-44=8 —>>>JDK8
RandomStringUtils 该字节码文件版本:1.8
运行时环境:JDK6 1.6
5、常量池
6、方法
7、 查看字节码 工具
8、arthas
类加载
1、类的生命周期— 应用场景
2、 加载阶段
3、连接阶段
验证
准备
final 修饰的变量
初始化
类加载器
双亲委派机制
运行时 数据区
1、应用场景
2、pc 程序计数器
3、栈
栈内存 也会溢出,stack over flow
4、堆内存
-Xms4G-Xmx4G5、方法区
6、直接内存区域
总结:
字符串常量池
垃圾回收
1、引用计数法
2、可达性 分析法
** GC Root 对象**
查看GC Root
3、对象引用
四种引用:强弱软虚
强引用:永远不回收、
只有弱引用,没有其他 引用 指向该弱引用对象:GC触发就会回收,不管内存够不够
软引用:GC内存 不足时回收
ThreadLocal为啥是弱引用
** 手动调用 remove() 方法进行回收,防止 内存泄露 ~~~~~**
垃圾回收算法
分代回收
垃圾回收器
Parallel
ParNew +CMS
总结
JDK默认垃圾回收器
垃圾回收器选择
G1
介绍
过程
打开G1 垃圾回收器
G1如何实现可停顿预测
G1应用场景
大内存应用
// 内存密集型应用publicclassCacheServer{// 超过4GB的堆内存privateMap<String,byte[]>cache=newConcurrentHashMap<>();publicvoidinit(){// G1能很好地管理大堆// 增量回收,避免长时间停顿for(inti=0;i<100000;i++){cache.put("key"+i,newbyte[1024*100]);// 100KB each}}}推荐: 堆内存超过4GB
响应时间敏感应用
// 实时交易系统publicclassTradingSystem{publicResponseprocessTrade(TradeRequestrequest){// 要求99.9%的请求在100ms内响应// G1可以控制GC停顿在几十毫秒内// 保证交易不超时Orderorder=validateAndCreateOrder(request);returnexecuteTrade(order);}}推荐: Web应用、在线服务、实时系统
动态内存需求场景
// 波动负载的应用publicclassElasticApplication{publicvoidhandleLoad(intrequestCount){// 高峰期:大量对象分配// 低峰期:内存释放// G1能自适应调整各代大小// 高效应对负载变化for(inti=0;i<requestCount;i++){processRequest();}}}推荐: 负载波动大的应用
要求可预测性的场景
// SLA要求严格的服务publicclassSLAService{// SLA要求:99%请求<200ms, 99.9%请求<500ms// G1配置:-XX:MaxGCPauseMillis=100// 确保GC停顿不超过100ms// 帮助满足SLA要求}G1优化实践
关键参数调优
# 基础配置-XX:+UseG1GC# 启用G1-Xms8g-Xmx8g# 固定堆大小,避免动态扩展# 停顿时间目标-XX:MaxGCPauseMillis=200# 目标最大停顿200ms(默认200)# Region大小(1-32MB,必须是2的幂)-XX:G1HeapRegionSize=16m# 较大Region适合大对象多的场景# 并发GC触发阈值-XX:InitiatingHeapOccupancyPercent=45# 堆占用45%时启动并发标记# 年轻代大小范围-XX:G1NewSizePercent=5# 新生代最小占比5%-XX:G1MaxNewSizePercent=60# 新生代最大占比60%# Mixed GC相关-XX:G1MixedGCCountTarget=8# Mixed GC回收老年代的目标次数-XX:G1OldCSetRegionThresholdPercent=10# 老年代Region回收比例监控关键指标
使用GC日志监控G1性能:
# 启用详细GC日志(JDK 8)-XX:+PrintGCDetails-XX:+PrintGCDateStamps-Xloggc:gc.log# JDK 9+使用新的日志格式-Xlog:gc*:file=gc.log:time,level,tags调整 内存区域大小
对象在堆上的存储
JIT 即时编译器
ZGC
使用
