前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java内存问题分析与定位

Java内存问题分析与定位

作者头像
Vincent-yuan
发布于 2022-05-06 10:29:24
发布于 2022-05-06 10:29:24
8490
举报
文章被收录于专栏:Vincent-yuanVincent-yuan

简介

  •  JNI方法申请的native 内存,通常是在JDK库里;本地 C++ 方法直接通过 malloc申请的内存,不受JVM管控。
  • 堆内内存: 指Java堆,GC算法管理的内存区域。
  • 堆外内存: Java堆外的内存都叫堆外。可以细分为JVM内部,Metaspace, JNI方法申请的native内存三部分。通常说的直接内存 DirectBuffer , 会记录在Internal区。

JNI申请的native内存不受JVM管控。

GC算法和日志解读

  • Java堆进一步划分,Eden, s0, s1, 老年代。
  • 不同GC算法对存活对象的扫描和清理方式不一样,对业务代码的运行影响不一样,因此,不同的业务场景,选合适的GC算法和GC参数。

一般建议 parallel scavenge (JDK8默认GC),适用大部分场景。

 GC日志组成: GC时间, GC原因, GC位置(年轻代, 老年代, 元空间), 释放内存大小, 持续时间。

原则上, 优先看Full GC的频率, 其次查看日志STW阶段(比如G1里标记了pause, CMS里mark和remark)阶段消耗时间,

最后查看内存收缩情况。

用JMap工具可以转储Java堆到快照文件,然后用MAT工具分析,只要是堆内问题,就用MAT工具。

  • 可以详细查看Java堆内java对象占比
  • 可多维度分析堆内对象分布,查找可疑的内存最大占比的对象。
  • 可分析对象的依赖路径,查找为是否原因。

GC异常分析与定位

现象:

  • 业务偶尔出现超时现象
  • cpu负载很高

分析与解决:

  1. 超时或负载高很可能是GC异常表象,此时需要查看GC日志,结合实际业务,分析GC行为,找到GC异常根因。
  2. GC频繁,STW时间长,可能原因有:存活对象多,堆大小或堆各子区域大小划分不合理。
  3. 存活对象多,则可能存在内存泄漏,可能是代码逻辑问题,进一步可用MAT工具分析Java对象。

 OOM问题分析与定位

1. 根据OOM错误提示,由于配置原因导致Java堆或者Metaspace区域oom,

判断标准之一是程序是否稳定运行,实际内存占用有升有降。

2. Metaspace本身没有限制,如果设置了MaxMetaspaceSize,则受限这个配置。

3.如果内存持续增长超出业务实际可能使用的内存量,则可能存在内存泄漏。

内存泄漏位置判断

1. 通过异常日志提示,

eg, Java.lang.OutOfMemoryError: Java heap space,

Java.lang.OutOfMemoryError: metadata space,

Java.lang.OutOfMemoryError: Direct buffer space,

2. 开启NMT(启动参数上加上 -XX: NativeMemoryTracking=detail), 可帮助判断那块内存区域内存泄漏。

  • Java堆,即Java Heap
  • Metaspace, 即class区域
  • JVM内部
  • JNI申请的native内存

堆内内存泄漏排查

1. 只要是Java堆或Metaspace区域内存泄漏,都可以转储Java堆快照文件,用MAT工具分析。

2. 多维度分析堆内对象分布,查找可疑内存最大占比的对象。

3.分析对象依赖路径,查找未释放原因。

堆外内存泄漏排查

1. 首先通过上文手段判断内存泄漏位置。

2.根据位置对应的功能,进一步查找具体的异常代码。

3. JNI申请的native内存本身已超出JVM控制范围,没办法用JVM工具排查。

借助操作系统工具pmap排查,可查看进程内存映射,查找可疑内存。

案例分析

例一.

某业务发现cpu值偶尔飙升,排查发现GC停顿较长。

进一步发现大量存活对象有些异常,怀疑内存泄漏。

最后heap dump 后使用MAT分析,发现一全局HashMap持有了大量重复对象,

业务代码里移除操作由问题,实际未移除,修复后问题解决。

例二.

某业务线迁移OSGI框架后,JVM无法响应外部

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
排查Java的内存问题
核心要点 排查Java的内存问题可能会非常困难,但是正确的方法和适当的工具能够极大地简化这一过程; Java HotSpot JVM会报告各种OutOfMemoryError信息,清晰地理解这些错误信息非常重要,在我们的工具箱中有各种诊断和排查问题的工具,它们能够帮助我们诊断并找到这些问题的根本原因; 在本文中,我们会介绍各种诊断工具,在解决内存问题的时候,它们是非常有用的,包括: HeapDumpOnOutOfMemoryError和PrintClassHistogram JVM选项 Eclipse MA
用户1263954
2018/04/08
2.9K0
排查Java的内存问题
Java 内存溢出(OOM)异常完全指南
Java 应用程序在启动时会指定所需要的内存大小,它被分割成两个不同的区域:Heap space(堆空间)和Permgen(永久代):
CG国斌
2020/05/15
4.8K0
前京东陌陌高级架构师的直播笔记分享(Java 内存问题排查和解决:内存概览,内存问题出现的原因,问题代码,案例分析)
上一周我有幸观看了高级架构师李国讲师的直播,内容是关于 Java 内存问题排查和解决。
RendaZhang
2020/09/08
1.5K0
前京东陌陌高级架构师的直播笔记分享(Java 内存问题排查和解决:内存概览,内存问题出现的原因,问题代码,案例分析)
流计算 Oceanus | Flink JVM 内存超限的分析方法总结
作者:董伟柯,腾讯 CSIG 高级工程师 问题背景 前段时间,某客户线上运行的大作业(并行度 200 左右)遇到了 TaskManager JVM 内存超限问题(实际内存用量 4.1G > 容器设定的最大阈值 4.0G),被 YARN 的 pmem-check 机制检测到并发送了 SIGTERM(kill)信号终止该 container,最终导致作业出现崩溃。这个问题近期出现了好几次,客户希望能找到解决方案,避免国庆期间线上业务受到影响。 在 Flink 配置项中,提供了很多内存参数设定。我们逐一检查了客户
腾讯云大数据
2022/01/21
1.3K0
教你分析9种 OOM 常见原因及解决方案
专栏地址:https://github.com/StabilityMan/StabilityGuide
用户5927304
2019/08/06
13.4K0
教你分析9种 OOM 常见原因及解决方案
一次通过dump文件分析OutOfMemoryError异常代码定位过程
OutOfMemoryError是Java程序中常见的异常,通常出现在内存不足时,导致程序无法运行。
codetrend
2024/05/06
4400
一次通过dump文件分析OutOfMemoryError异常代码定位过程
Flink JVM 内存超限的分析方法总结
前段时间,某客户的大作业(并行度 200 左右)遇到了 TaskManager JVM 内存超限(实际内存用量 4.1G > 容器设定的最大阈值 4.0G),被 YARN 的 pmem-check 机制检测到并发送了 SIGTERM(kill)信号终止,最终导致作业出现崩溃。这个问题近期出现了好几次,客户希望能找到解决方案,避免国庆期间线上业务受到影响。
KyleMeow
2021/09/29
7.3K6
常见java OOM异常分析排查思路分析
Java 虚拟机(JVM)发生 OutOfMemoryError(OOM)异常时,表示 JVM 在尝试分配内存时无法找到足够的内存资源。以下是几种常见的导致 OOM 异常的情况:
闻说社
2024/09/11
2230
常见java OOM异常分析排查思路分析
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
开篇,先推荐一篇实用的文章《Java EasyExcel导出报表内存溢出全解析》,作者是【bug菌】。
拉丁解牛说技术
2024/11/15
2810
常见的 OOM 异常分析(硬核干货)
在《Java虚拟机规范》的规定里,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError 异常的可能。
Java3y
2020/07/09
2K0
常见的 OOM 异常分析(硬核干货)
Java程序员必备:常见OOM异常分析
放假这几天,温习了深入理解Java虚拟机的第二章, 整理了JVM发生OOM异常的几种情况,并分析原因以及解决方案,希望对大家有帮助。
捡田螺的小男孩
2020/04/14
1.4K0
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day25】—— JVM1
  本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux操作技巧等。
陈哈哈
2021/12/31
3480
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day25】—— JVM1
你知道 OOM 常见原因吗?有什么好的解决方法?
当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误。本文总结了常见的 OOM 原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。
用户1516716
2019/07/30
1.7K0
你知道 OOM 常见原因吗?有什么好的解决方法?
Java 内存泄漏分析和对内存设置
为了判断 Java 中是否有内存泄漏,我们首先必须了解 Java 是如何管理内存的。下面我们先给出一个简单的内存泄漏的例子,在这个例子中我们循环申请 Object 对象,并将所申请的对象放入一个 HashMap 中,如果我们仅仅释放引用本身,那么 HashMap 仍然引用该对象,所以这个对象对 GC 来说是不可回收的。
烂猪皮
2018/08/03
1.8K0
Java 内存泄漏分析和对内存设置
后浪,谈谈你对jvm性能调优的理解
在我们日常的研发工作中, 经常会遇到系统的性能问题,这时我们必须进行系统的性能调优。系统调优分好多种,比如架构和代码优化、jvm调优、操作系统调优、数据库调优、tomcat调优、网络调优等。架构和代码优化是效率最高的调优手段,但是并不能解决所有的性能问题。今天我们要回顾的是一个老生常谈的话题,jvm调优。
jinjunzhu
2020/08/20
8170
如何排查Java内存泄漏?看完我给跪了!
没有经验的程序员经常认为Java的自动垃圾回收完全使他们免于担心内存管理。这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重破坏内存泄漏的牺牲品。让我解释一下。
乱敲代码
2019/07/24
1.8K0
常见java OOM异常分析排查思路分析
Java 虚拟机(JVM)发生 OutOfMemoryError(OOM)异常时,表示 JVM 在尝试分配内存时无法找到足够的内存资源。以下是几种常见的导致 OOM 异常的情况:
阿珍
2024/09/06
1670
常见java OOM异常分析排查思路分析
高手总结的9种 OOM 常见原因及解决方案
当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误。本文总结了常见的 OOM 原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。
JAVA葵花宝典
2019/08/23
3.5K0
高手总结的9种 OOM 常见原因及解决方案
解读 Java 云原生实践中的内存问题(必看)
Java 凭借着自身活跃的开源社区和完善的生态优势,在过去的二十几年一直是最受欢迎的编程语言之一。步入云原生时代,蓬勃发展的云原生技术释放云计算红利,推动业务进行云原生化改造,加速企业数字化转型。
用户1107783
2023/12/11
5340
解读 Java 云原生实践中的内存问题(必看)
垃圾回收-实战篇
上文 GC 理论颇受大家好评,学习了之后,相信大家对 GC 的工作原理有了比较深刻的认识,这一篇我们继续趁热打铁,来学习下 GC 的实战内容,主要包括以下几点
kunge
2020/02/17
4470
垃圾回收-实战篇
推荐阅读
相关推荐
排查Java的内存问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档