惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
有赞技术团队
有赞技术团队
L
LangChain Blog
C
Check Point Blog
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
美团技术团队
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏
S
SegmentFault 最新的问题
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
腾讯CDC
B
Blog
G
Google Developers Blog
The Cloudflare Blog
P
Proofpoint News Feed

博客园 - 悉野

go编译期接口断言 / 编译期接口检查(compile-time interface assertion / compile-time interface check) Go 的类型断言 ssh连结vmware中ubuntu的共享文件夹 spring加载冲突问题 spring一个错误修正 抓安卓日记到文件 注册表删除桌面顽固图标 github买的账号无法拉取代码的解决方法 apk常用命令 ES6 学习难度分层 promise原理 材质, 纹理, shader之间的关系 TCP与UDP区别 javascript中=>与function的区别 javascript中函数解析过程 cocos使用fgui 几种服务注册与发现的区别 mybatis测试 向量点乘与叉乘 unity画布3种渲染模式 go学习笔记10(HTTP) go学习笔记9(TCP) go学习笔记8(反射) c++简单的线程池 operator new 是 C++ 动态内存分配的核心函数,负责分配原始内存,不调用构造函数 C++的定位放置new(Placement new) go学习笔记7(泛型,文件读写,测试) go学习笔记6(协程与channel,select使用,线程安全,异常处理) go学习笔记5(函数,结构体,自定义类型和类别名,接口) go学习笔记4(数组与切片,map,if,switch,for循环)
java服务器异常处理
悉野 · 2026-05-14 · via 博客园 - 悉野

java游戏服务端, 内存泄露怎么查看, 如果是线上的话怎么处理, 线上cpu 100%处理.

使用 jmap 手动 dump(最常用)
jmap -dump:live,format=b,file=heap.bin <pid>

live:只导出存活对象(强烈建议)
dump 文件一般很大(几个 G)

分析工具(重点)
MAT(Memory Analyzer Tool,首选)

jstat(看趋势)
jstat -gcutil <pid> 1000

image

1. 内存区域(单位:KB)

  • S0:Survivor 0 区使用率 年轻代的两个幸存者区之一,存放存活的小对象
  • S1:Survivor 1 区使用率 和 S0 交替使用,同一时间只有一个区有数据
  • E:Eden 区使用率 新对象创建的地方,满了就触发年轻代 GC(YGC)
  • O:Old 老年代使用率 存活时间长的对象、大对象存放区,满了触发FullGC(FGC)
  • M:Metaspace 元空间使用率 存放类信息、方法、常量,JDK8 替代永久代
  • CCS:Compressed Class Space 压缩类空间使用率 元空间的一部分,专门存放压缩后的类元数据

2. GC 次数 & 耗时(核心性能指标)

  • YGC:Young GC 次数 年轻代垃圾回收的总次数
  • YGCT:Young GC 总耗时(单位:秒) 所有年轻代 GC 加起来的总时间
  • FGC:Full GC 次数 全堆垃圾回收(非常昂贵,越少越好)
  • FGCT:Full GC 总耗时(秒) 所有 FullGC 的总时间
  • GCT:GC 总耗时(秒) YGCT + FGCT,所有 GC 的总耗时

快速判断 JVM 健康状态(实用口诀)

  1. FGC 多、FGCT 大 → 严重问题(内存泄漏、堆太小、大对象过多)
  2. O 区持续上涨不下降 → 大概率内存泄漏
  3. M 区满 → 类加载太多,需要调大元空间


关注:
O(Old 区)是否接近 100%
FGC 次数是否持续增长

jstack(看线程)
jstack <pid> > stack.txt
用于排查:
死循环
线程阻塞导致对象无法释放

jprofiler


线上可以使用
kill -15 来重启, 不是-9, -9为强杀, -15为优雅退出
保留日志
保留 gc.log

会触发 Full GC
大堆可能停顿数秒 ~ 数十秒
👉 非核心服 / 低峰期才做


开启 OOM 自动 dump
-XX:+HeapDumpOnOutOfMemoryError

jmap -histo(只统计数量,不 dump)
jmap -histo:live <pid>

image

cpu 100%
抓线程栈
jstack <pid> > jstack.txt
抓 3~5 次,间隔 5~10 秒

top -H -p <pid>
抓 CPU 占用最高的线程
top -H -p <pid>
你会看到类似:
tid 14023 99.9%
把 tid 转成 16 进制:
printf "%x\n" 14023
然后在 jstack.txt里搜:
nid=0x36f7
👉 直接定位到“罪魁祸首代码行”


1. top 确认 Java 进程
2. top -H -p <pid> 找最忙线程
3. jstack 抓栈(多次)
4. 转 tid 为 nid
5. 定位 RUNNABLE 代码
6. 看是否是循环 / 高频逻辑
7. 本地复现
8. 修复 + 压测
9. 灰度上线


top
top -H -p <pid>
jstack <pid> > jstack.txt 打印某个线程的堆
printf "%x\n" <tid>
grep -R "nid=0x<hex>" jstack.txt
jstat JVM Statistics Monitoring Tool,  JDK 自带的、用来实时监控 Java 程序运行状态的命令行工具, 内存使用、垃圾回收(GC)、类加载, 用来查内存溢出.

jmap JVM Memory Map 查  JDK 自带的堆内存分析工具,专门用来导出内存快照、查看堆里有什么对象、排查内存泄漏. 看每种类型对象占用空间

jstack = JVM Stack Trace, 打印所有线程的调用栈, 定位死锁

  • jstat:看内存、GC实时数据(动态监控)
  • jmap:抓堆内存快照,查对象、OOM(内存问题)
  • jstack:抓线程快照,查死锁、CPU 高、卡住(线程问题)