ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

JVM 学习

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-Xmx4G

5、方法区

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

使用

返回列表