内存溢出Linux相关命令排查获取相关数据

一.dump基本概念

        在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。

        heap dump:

        heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。

        thread dump:

        thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。比较有用的是,线程在一个时间段内的执行情况。

两个thread dump文件在分析时特别有效,困为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点的耗时是很大的。通过对这两个文件进行分析,查出原因,进而解决问题。

二.利用JDK自带的工具获取thread dump文件和heap dump文件

        使用的JDK工具在JDK_HOME/bin/目录下,使用到jmap和jstack这两个命令。

1.获取heap dump文件

        windows下切换到JDK_HOME/bin/,执行以下命令:jmap -dump:format=b,file=heap.hprof 2576 

        linux下切换到JDK_HOME/bin/,执行以下命令:./jmap -dump:format=b,file=heap.hprof 2576

        这样就会在当前目录下生成heap.hprof文件,这就是heap dump文件。

2.获取thread dump文件

        windows下执行:jstack 2576 > thread.txt

        linux下执行:./jstack 2576 > thread.txt

        windows/linux则会将命令执行结果转储到thread.txt,这就是thread dump文件。有了dump文件后,我们就能借助性能分析工具获取dump文件中的信息。

3.如果我们只需要将dump中存活的对象导出,那么可以使用:live参数

jmap -dump:live,format=b,file=heapLive.hprof 2576

 说明:如上实例的2576是我当前需要分析的java进程PID,关于Windows下如何获得指定的JAVA时空程PID可参考:http://bijian1013.iteye.com/blog/2221238

三.使用工具分析java heap dump文件

        现在我们使用一些图形化工具,来帮助我们分析文件中的信息,有效地定位问题。

1.使用JDK自带的jhat命令

        jhat是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

jhat -port 5000 heap.hrof

   当服务启动完成后,我们就可以在浏览器中,通过http://localhost:5000/进行访问,如下所示:

 

 

2.使用eclipse MAT工具

        一般来说,应用程序的dump文件都是很大的,jdk自带命令难以分析这些大文件。在实际的生产环境下,我们必须要借助第三方工具,才能快速打开这些大文件,进行分析定位。eclipse memory analyzer是一款优秀的heap分析工具,能够帮我们快速定位内存泄露问题。

原文:http://bijian1013.iteye.com/blog/2221240

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当Linux系统出现内存溢出时,可以通过以下步骤进行排查: 1. 查看系统日志,特别是/var/log/messages和/var/log/syslog文件,以查找任何与内存相关的错误或警告信息。 2. 使用top或htop等工具查看系统的内存使用情况,以确定哪些进程占用了大量的内存。 3. 使用ps命令查看进程列表,并使用pmap命令查看每个进程的内存映射,以确定哪些进程使用了大量的内存。 4. 使用free命令查看系统的内存使用情况,以确定是否存在内存泄漏或其他内存问题。 5. 使用vmstat命令查看系统的虚拟内存使用情况,以确定是否存在内存交换或其他虚拟内存问题。 6. 如果以上步骤无法解决问题,可以考虑使用内存分析工具,如valgrind或gdb,来进一步分析进程的内存使用情况。 ### 回答2: 一、查看系统内存使用情况 首先,我们需要了解系统的内存使用情况,可以使用以下命令查看: top 通过 top 命令可以查看系统进程的内存占用情况,可以根据内存占用情况确定是否存在内存溢出问题。 另外,还可以使用 free 命令来查看系统的内存使用情况: free -m 这个命令会输出系统的内存总量、已用内存、空闲内存等信息,可以帮助我们快速了解系统内存使用情况。 二、查看进程内存占用情况 确定了系统的内存占用情况后,我们就需要查看具体的进程内存占用情况了。 我们可以使用以下命令来查看某个进程的内存占用情况: ps aux | grep 进程名称 例如,查看名为“tomcat”的进程内存情况,可以输入以下命令: ps aux | grep tomcat 这个命令会列出进程的详细信息,包括进程 ID、内存占用情况等。 查看进程内存占用情况还可以使用更加详细的命令: pmap 进程ID 这个命令会输出给定进程的内存映射信息,包括进程占用的物理内存和虚拟内存等。 三、使用内存监控工具 除了命令行工具,我们还可以使用一些内存监控工具来帮助我们排查内存溢出问题。 常用的内存监控工具包括: 1. top top 命令可以在实时显示系统进程的 CPU 和内存占用情况,并且可以按照内存占用情况进行排序。 2. htop htop 是一个更加直观的进程监控工具,它可以显示进程树和进程的状态等详细信息。 3. Glances Glances 是一个跨平台的监控工具,它可以监控系统的 CPU、内存、硬盘、网络等多种指标,可以通过 Web 界面进行访问,并且可以通过插件扩展其功能。 四、通过日志排查内存溢出问题 在排查内存溢出问题时,还可以通过日志来查看具体的错误信息和堆栈跟踪信息,从而找到产生内存溢出的代码。 一般来说,我们可以查看应用程序的错误日志或者系统日志来排查内存溢出问题。 总结 要排查 Linux 内存溢出问题,我们需要了解系统的内存使用情况,查看进程的内存占用情况,并且可以使用内存监控工具和日志来找到具体的问题。同时,我们还可以通过一些优化措施,比如调整进程的内存限制、优化代码等来减少内存使用。 ### 回答3: Linux的内存管理是一个复杂的系统,可以通过一系列的工具和命令来检测与诊断内存问题。其中,最常用的方法是使用系统监控工具,并结合内核日志来判断内存是否正在溢出。 以下是一些可能的排查方法: 1. 监控系统的内存使用情况。可以使用 top 命令来查看正在使用内存量排名前几的进程,并结合 free 命令来查看系统的整体内存使用情况。如果内存使用量超过了系统可用内存大小,就应该怀疑内存溢出的存在。 2. 扫描内核日志。内核在出现内存问题时会有日志记录,可以使用 dmesg 命令来查看系统的内核信息。如果发现日志中有内存相关的警告或错误信息,就需要重视并进行排查。 3. 使用 valgrind 工具来检测内存泄漏。valgrind 是一个用于调试内存问题的工具,可以检测程序是否存在内存泄漏等问题。 4. 检查是否存在进程泄漏。某些程序可能会导致内存泄漏,特别是有大量进程存在时。可以使用 ps 命令来检查正在运行的进程情况,结合其他工具也可进行进一步排查。 5. 通过软件更新解决问题。有时候,内存问题可能是由软件版本或补丁更新不及时导致,因此及时更新软件可能会修复内存问题。 6. 借助第三方工具进行排查。还可以使用一些第三方的内存排查工具,如 memtester、mtrace、ElectricFence 等等来检测和解决内存问题。 总之,在排查内存问题时需要结合多种方式,综合分析来判断内存是否正在溢出,并尽快采取相应的解决措施来避免内存问题影响系统的正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值