OOM问题排查+Jvm优化

OOM问题排查:

java 复制代码
1、top命令:查看cpu和内存的使用情况。
2、jstat命令:查看YGC和FGC情况,一般都是老年代不够用。导致OOM
3、jmap命令: 查看哪个类的实例过多,以每个类占用多少了内存。

4、jstack  查看线程与线程之间的阻塞状态。dump文件也是通过这个命令。这是参数不一样。

JVM调优的出发点:

java 复制代码
1、观察YGC的频率和耗时
频率过高:可能是E和S的容量不够,

2、观察FGC的频率和耗时
频率过高:说明老年代的对象得不到回收。
是不是有内存泄露:Gc后老年代没有变化
老年代的内存空间不够大:查看每次回收后老年代的空间变化。
老年代大对象的【担保策略】:担保策略就是指下面4个点。

备注:Java对象进入老年代的四种方式
1、minor gc之后,survivor区空间不能容量存活对象
2、对象达到年龄阈值进入老年代
3、大对象进入老年代
4、动态年龄判断

担保策略:4种分派方式跳转

一、什么是TLAB

java 复制代码
TLAB:用来解决内容分派的问题
1、指针碰撞,一半是已分派,一半是未分派,缺点:产生很多碎片。产生很多不连续的空闲空间。
2、空闲列表机制:在碰撞的基础上,将不连续的空间,通过一个空间列表记录起来。每次分派对象时,优先遍历空闲列表,来
分配合适的对象。
3、高并发下,需要用到互斥锁,这就大大折扣了,空闲列表的分派速度。为了解决内容分配效率问题,引入了TLAB的概念
4、TLAB是Thread Local Allocate buffer的缩写,结合EMA期望算法,

TLAB 是线程私有的,线程初始化的时候,会创建并初始化 TLAB

缺点:TLAB 要解决的问题很明显,尽量避免从堆上直接分配内存从而避免频繁的锁争用。引入 TLAB 后,会有内
存孔隙问题,还可能影响 GC 扫描性能
总结:开发中能使用局部变量的,就不要使用在方法外定义。
相关推荐
码熔burning4 小时前
JVM 对象创建的核心流程!
java·jvm
我是廖志伟7 小时前
JVM新生代Eden区域深度解析
java·jvm·memory management
花城飞猪10 小时前
Android系统框架知识系列(二十):专题延伸:JVM vs ART/Dalvik - Android运行时演进深度解析
android·jvm·dalvik
Mr.朱鹏10 小时前
ShardingJDBC实战指南
java·jvm·数据库·spring·分库分表·shardingjdbc·shardingshere
星梦清河10 小时前
宋红康 JVM 笔记 Day16|垃圾回收相关概念
java·jvm·笔记
哈基米喜欢哈哈哈1 天前
ThreadLocal 内存泄露风险解析
java·jvm·面试
星梦清河1 天前
宋红康 JVM 笔记 Day15|垃圾回收相关算法
jvm·笔记·算法
BillKu1 天前
Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)
java·jvm·jdk·java ee·jre·java se·jakarta ee
DKPT2 天前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
三毛20042 天前
玳瑁的嵌入式日记D33-0908(SQL数据库)
jvm·数据库·sql