前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查。
搞Java开发的,经常会碰到下面两种异常:
1、java.lang.OutOfMemoryError: PermGen space
2、java.lang.OutOfMemoryError: Java heap space
要详细解释这两种异常,需要简单重提下Java内存模型。
(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen)
Java内存模型是描述Java程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节。
在Java虚拟机中,内存分为三个代:新生代(New)、老生代(Old)、永久代(Perm)。
(1)新生代New:新建的对象都存放这里
(2)老生代Old:存放从新生代New中迁移过来的生命周期较久的对象。新生代New和老生代Old共同组成了堆内存。
(3)永久代Perm:是非堆内存的组成部分。主要存放加载的Class类级对象如class本身,method,field等等。
如果出现java.lang.OutOfMemoryError: Java heap space异常,说明Java虚拟机的堆内存不够。原因有二:
(1)Java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整。
(2)代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用)。
如果出现java.lang.OutOfMemoryError: PermGen space,说明是Java虚拟机对永久代Perm内存设置不够。
一般出现这种情况,都是程序启动需要加载大量的第三方jar包。例如:在一个Tomcat下部署了太多的应用。
从代码的角度,软件开发人员主要关注java.lang.OutOfMemoryError: Java heap space异常,减少不必要的对象创建,同时避免内存泄漏。
现在以一个实际的例子分析内存占用的故障排查。
通过top命令,发现PID为9004的Java进程一直占用比较高的内存不释放(24.7%),出现高内存占用的故障。
想起上一篇线上应用故障排查之一:高CPU占用介绍的PS命令,能否找到具体是哪个的线程呢?
ps -mp 9004 -o THREAD,tid,time,rss,size,%mem
遗憾的是,发现PS命令可以查到具体进程的CPU占用情况,但是不能查到一个进程下具体线程的内存占用情况。
只好寻求其他方法了,幸好Java提供了一个很好的内存监控工具:jmap命令
jmap命令有下面几种常用的用法:
•jmap [pid]
•jmap -histo:live [pid] >a.log
•jmap -dump:live,format=b,file=xxx.xxx [pid]
用得最多是后面两个。其中,jmap -histo:live [pid] 可以查看当前Java进程创建的活跃对象数目和占用内存大小。
jmap -dump:live,format=b,file=xxx.xxx [pid] 则可以将当前Java进程的内存占用情况导出来,方便用专门的内存分析工具(例如:MAT)来分析。
这个命令对于分析是否有内存泄漏很有帮助。具体怎么使用可以查看本博的另一篇文章:利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏
这里详细介绍下jmap -histo:live [pid] 命令:
从上图可以看出,int数组、constMethodKlass、methodKlass、constantPoolKlass都占用了大量的内存。
特别是占用了大量内存的int数组,需要仔细检查相关代码。
最后,总结下排查内存故障的方法和技巧有哪些:
1、top命令:Linux命令。可以查看实时的内存使用情况。
2、jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。
3、jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏等等。
(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen)
分享到:
相关推荐
本篇文章将探讨一个常见的问题——"线上应用故障排查之一:高CPU占用"。高CPU占用可能导致系统响应变慢,影响用户体验,甚至可能导致服务崩溃。解决这个问题需要深入理解应用程序的运行机制以及系统资源的管理。 ...
本文档围绕Java线上故障排查提供了详尽的方案和知识点,覆盖了从问题定位到解决方案的多个方面。 首先,了解Java线上常见问题的分类是非常重要的。在生产环境中,问题可大致分为系统异常和业务异常两大类。系统异常...
### Java线上故障排查方案 #### 一、引言 在软件开发领域,处理生产环境中的问题是一项必备技能。生产环境中可能会遇到多种复杂的情况,比如代码bug、硬件故障、网络问题等,这些都可能导致应用程序无法正常运行。...
Java线上故障排查是每个Java开发者或运维人员必备的技能之一,尤其在生产环境中,快速定位并解决问题至关重要。本文将深入探讨Java线上故障排查方案,帮助你掌握一系列实用的方法和技术。 一、日志分析 1. 日志级别...
线上故障排查是IT运维中的重要环节,涉及到系统的稳定性和服务的连续性。本文主要讨论了四种常见的线上故障类型:CPU问题、频繁GC、上下文切换过多以及磁盘问题,并提供了相应的排查工具和方法。 首先,CPU异常是较...
### MySQL线上常见故障剖析 #### 一、故障概述与分类 在MySQL的日常运维中,经常会出现各种各样的故障,这些故障可能源自于不同的层面,包括但不限于应用层、数据库层、操作系统层等。通过对这些故障的深入分析,...
本文将详细介绍一套线上故障排查的全面方案,涵盖CPU、磁盘、内存和网络四个关键层面。 首先,CPU异常是常见的故障类型。CPU使用率过高可能是由于业务逻辑中的死循环、频繁的垃圾回收(GC)或者上下文切换过于频繁...
CPU占用过高是LINUX服务器出现常见的一种故障,也是程序员线上排查错误必须掌握的技能,我们经常需要找出相应的应用程序并快速地定位程序中的具体代码行数,本文将介绍一种CPU占用过高的一种处理思路,文中采用四...
Arthas,全名 Alibaba Arthas,是一个强大的开源Java诊断工具,由阿里巴巴开发并维护。这个工具的主要目的是帮助...通过熟练掌握Arthas,开发者可以在面对复杂问题时更加从容,及时解决线上故障,保障服务的高可用性。
#### 三、故障排查步骤 ##### 1. 获取故障进程ID - **工具**: `jps` - **功能**: `jps`(JVM Process Status Tool)是一个用来显示指定系统中所有HotSpot虚拟机进程的工具。 - **命令**: `jps -l -m` - `-l`: ...
线上故障主要会包括 CPU、内存、磁盘以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。基本上出问题就是 df、free、top,然后依次 使用jstack、jmap,具体问题...
基本的疑难排查步骤包括:执行 top 命令记录 CPU 使用率,执行 free 命令记录内存使用率,使用 ps 命令记录进程信息,使用 jstack 收集线程信息,使用 jstat 视图 Old 区占用率,使用 jmap 保留内存信息等。...
3. 故障排查效率:培训开发人员快速定位和解决问题,减少故障持续时间。 4. 优先级排序:随着问题增多,确定优先级至关重要,关键问题需优先解决。 5. 性能监控:通过监控系统CPU、内存使用情况,及时发现并定位性能...
- **故障排查**:当系统出现异常,如死锁、内存溢出等问题时,VJTop可以提供详细的堆栈信息,辅助开发者找到问题根源。 - **日常监控**:VJTop适合集成到持续集成/持续部署(CI/CD)流程中,作为性能指标的一部分,...
- **故障排查**:解决线上问题,对用户反馈的问题进行定位和修复。 3. **高级Android开发工程师**: - **技术领导**:指导和培训初级或中级工程师,参与技术决策,推动技术创新。 - **跨平台开发**:了解并可能...
通过收集CPU使用率、内存占用、磁盘I/O、网络流量等系统资源监控数据,结合数据库日志(如慢查询日志),找出性能波动的时间点和关联操作。 2. **SQL查询优化**:检查慢查询日志,找出导致性能下降的SQL语句。分析...
7. **CPU过高排查**:Arthas提供CPU快照分析,协助定位CPU占用高的原因。 8. **日志级别动态调整**:在线更新日志等级为debug,获取更详细的问题排查信息。 【Arthas常用命令详解】 - **jad命令**:反编译JVM中的...
**可观测性差**:针对MySQL性能抖动的复杂性,MGR模块增强了性能统计,将其输出到performance_schema和error日志,每秒提供一次Paxos状态机的统计信息,提高了故障排查效率。 D. **内存占用过大**:问题在于内存...
报告通常包括异常类型、堆栈跟踪、设备信息等关键数据,这使得开发者能迅速定位问题源头,缩短故障排查时间。对于线上应用,这种即时的崩溃报告尤其重要,因为它可以帮助开发者迅速响应用户反馈,修复问题,提高应用...
- **内存分析工具**:VisualVM、MAT (Memory Analyzer Tool) 等工具可以帮助开发者分析堆内存,找出内存占用过高或者内存泄漏的原因。 3. **线程监控** - **线程状态**:Java中的线程有多种状态,如新建、运行、...