Widows 分析dump文件的工具太多了,而且都是傻瓜式的点点就好了。但是生产上分析dump文件的话,还是linux工具比较方便,因为生产上的dump文件一般都至少是GB级别的,这么大的文件拷贝到本
dump文件传输到本地进行分析, 常常需要大量的等待时间。 使用IBM的eclipse的MAT工具可以直接在服务器上进行快速DUMP分析。
**Jmap (Memory Map for Java)**命令⽤于⽣成堆转储快照。如果不使⽤ jmap 命令,要想获取 Java 堆转储快照,还有⼀些⽐较“暴⼒”的⼿段:-XX: +HeapDumpOnOutOfMemoryError参数,可以让虚拟机在 OOM 异常出现之后⾃动⽣成 dump ⽂件,⽤于系统复盘环节
jstat用法 其中-gc可以换成-class 、-gcnew、-gcold等参数;而54992表示的JVM的进程id(可能通过上面的jps命令查看) ;4s表求每4秒打印一次,后面的3表求共打印三次。 打印的各参数含义如下: 1:S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used) 2:EC、EU:Eden区容量和使用量 3:OC、OU:年老代容量和使用量 4:MC、MU:元数据区容量和使用量 5:CCSC、CCSU:压缩类空间容量和使用量 5:YGC、YGT:年轻代GC次数和GC耗时 6:FGC、FGCT:Full GC次数和Full GC耗时 7:GCT:GC总耗时 jstat可以用来判断系统是否出现了内存泄漏,方法是通过一短长时间的观察OU的增长情况,如果OU稳定增长,则有可能出现内存泄漏。
学会下面这几个方法,让你轻松玩转内存溢出,我们会从 Windows、Linux 两个系统来做示例展示,有人会有疑问了:为什么要说 Windows 版的 ?因为目前市面上还是有很多 Windows 服务器的,应用于传统行业、政府结构、医疗行业等等;两个系统下的情况都演示下,有备无患,
前面几章内容我们学习了JVM的内存回收和JVM参数等系列,今天墨白给大家分享的是jmap的使用以及内存溢出分析等详情,话不多说,正文开始;
jps(JVM Process Status Tool)是JDK中的一个小工具,它的功能和UNIX的ps命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier),LVMID和操作系统的进程ID是一致的,当同时启动多个虚拟机进程,无法根据进程名称进行定位时,就可以使用jps命令显示主类的功能来区分。
作为法医,不怕高度腐烂的尸体,也不怕错综复杂的案情。最怕的,是没留下任何东西。空无一物,任何高超的技术,丰富的经验,都无从下手。
后文会从 Windows、Linux 两个系统来做示例展示,有人会有疑问了:为什么要说 Windows 版的 ? 目前市面上还是有很多 Windows 服务器的,应用于传统行业、政府结构、医疗行业 等等;两个系统下的情况都演示下,有备无患
lsof -i -P | grep LISTEN |grep java 查看应用端口
“ 给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里的数据包括:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据和定位解决问题的速度,但我们在学习工具前,也应当意识到工具永远都是知识技能的一层包装,没有什么工具是“秘密武器”,学会了就能包医百病”
该命令主要与jmap搭配使用,用来分析jmap转储的转储快照。其中构建了一个微型的http/html服务器。生成dump文件的分析结果后可以通过浏览器进行查看。 通常情况下不采用jhat进行分析,一方面,分析工作需要耗费额外的资源和时间,既然都要在其他机器进行,则不需要限定于上述工具。另外一方面,jhat界面比较简陋,可以用visualVM,eclipse的Memory Analizer 等更加专业的分析工具进行替换。
jhsdb: A New Tool for JDK 9这篇文章中列出了jhsdb与jcmd的等价命令,如下图:
//输出大对象到文件 jmap -histo:live pid > ./java.log //查询前20占用内存大对象 jmap -histo:live 2837 | head -n 20 //查看Full GC情况 jstat -gcutil 2501 //查看线程 top -H -p 2501 //查看启动参数 jinfo -flags //查看linux内核日志 dmesg | grep java //查看系统日志 vim /var/log/messages 查看系统日志 //jvm使用
《不可不知的7个JDK命令》介绍了些jdk自带的问题排查工具,机器出现CPU飙升的情况,此时就可以借助工具,排查应用端是否存在一些潜在问题。
当你的应用没有一套完善的监控告警系统,线上故障了 ,总是很被动,但是还得要定位问题 ,奈何手里无利器 ,没办法只能硬上了,虽然原始,好在有效~
在实际的故障排查、性能监控中,常常是操作系统的工具和Java虚拟机的工具结合使用。
HowToLiveLonger 是一个程序员延寿指南项目。 该项目旨在提供关于如何延长寿命的指南,特别是针对程序员群体。该项目包括术语、目标、关键结果、分析、行动和证据等内容,涵盖了各种与健康相关的方面,并提供了相应的科学研究作为支持。 具体功能和优势包括:
可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称(main函数所在类)以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。其常用选项见下表;
jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。
正在和同事在外面吃饭,突然钉钉报警,有一个服务的机器内存飙到百分之90%多。和同事大概聊了一下说是队列累积,机器消费不过来,具体原因也没有深问,又一同事,说看一下是那个对象占的内存,使用jmap,jstat。当时我也在旁边围观,由于之前有看过,我就说jmap在生产环境敢使用吗?
前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查。
看了网上很多帖子,都说一半,说的都是大家说过的,根本没有解决问题。说jdk8不行,换成jdk9或者jdk11,我都试了,还是不行,最后说是mac的问题。换成linux,崩溃!!!
最近参加面试经常被面试官问到有没有遇到过线上人内存溢出(OOM)的问题?遇到过的化你是怎么定位是哪个线程下哪些对象占用你内存太多造成的?提出这个问题其实面试官就是用来考察你到底有没有JVM调优经验。如果你在工作中并没有JVM方面的经验,也没有仔细看过线上定位和OOM问题的文章,那么99.9%这道题你要凉凉!
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》
目前采用微服务架构已经逐渐成为企业架构的标准范式,而大多微服务是基于Spring Cloud框架来进行应用的构建的,所以在开发实践中,甚至生产环境中,会遇到java相关问题,例如系统运行变慢、内存OOM,堆栈异常等问题,这里结合我之前的一些实践提供一些相关工具,和大家一起分享我们的诊断思路和解决技巧。
可以看到经过分配的存活区与eden比率=2:8 1)eden区:775M 2)两个存活区大小:都为127M(存活区=space) 3)年轻代大小:1G 4)老年代大小:2G 5)最大堆内存大小:年轻代大小+老年代大小=3G 7)java应用程序占用内存大小:最大堆内存大小=3G
jmap(Java Virtual Machine Memory Map)是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。除此以外,jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息,比如空间使用率、当前使用的什么垃圾回收器、分代情况等等。
Caused by: java.lang.RuntimeException: unknown CollectedHeap type : class sun.jvm.hotspot.gc_interface.CollectedHeap
前面介绍了JVM相关的内存和线程相关的技术。对于JVM也算有了一个比较系统、完整的理论基础。理论总是作为指导实践的工具,但是从理论到实践,总会遇到一些虚拟机相关问题,故障。所以还需要学习一些常用的JVM排障工具,和一些常见的调优手段。
生产环境中直接排查 JVM 的话,最简单的做法就是使用 JDK 自带的 6 个非常实用的命令行工具来排查。它们分别是:jps、jstat、jinfo、jmap、jhat 和 jstack,它们都位于 JDK 的 bin 目录下,可以使用命令行工具直接运行,其目录如下图所示:
jmap -heap 1234 查看进程号为1234的Java程序的整个jvm内存状态
常用的命令行工具主要有 jps、jstat、jinfo、jmap、jhat、jstack。
jmap(Java Virtual Machine Memory Map)是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。除此以外,jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息,比如空间使用率、当前使用的什么垃圾回收器、分代情况等等。 之前写过通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容,如:内存使用情况的汇总、对内存溢出的定位与分析。 还有几种方式获取dump文件:
首先通过我们内部搭建的日志平台发现我们线上环境一个java应用有大量的http接口请求超时,登录linux服务器查看网络环境没有问题,判断是应用自身运行异常,重启应用后发现异常还在,开始查找问题。
之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令。 也可以帮助自己在以后的工作中快速的排查线上问题。
JDK 提供了一系列用于监控、诊断 Java 进程的工具,它们在 JDK 安装目录的 bin 目录下,有 jps、jcmd、jstack、jinfo、jmap 等。其中jmc、jconsole、jvisualvm 是 GUI 工具,其他大部分都是命令行工具。
说到监控CPU,目前主要是监控CPU的使用率,以及每一个进程占用CPU资源,Linux系统中主要使用 top、vmstat、pstree 三个命令。
这些问题在日常开发中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。本文参考了网上很多资料,难以一一列举,在此对这些资料的作者表示感谢!关于JVM性能调优相关的资料,请参考文末。
我发现很多人没办法高效地解决问题的关键原因是不熟悉工具,不熟悉工具也还罢了,甚至还不知道怎么去找工具,这个问题就大条了。我想列下我能想到的一个Java程序员会用到的常用工具。 一、编码工具 1.IDE:Eclipse或者IDEA,熟悉尽可能多的快捷键,《Eclipse常见快捷键列表》 2.插件: (1) Findbugs,在release之前进行一次静态代码检查是必须的 (2) Clover,关心你的单元测试覆盖率 (3) Checkstyle 代码风格检查 3.构建和部署工具:ant或者maven,现在主流都是maven了吧,使用nexus搭建maven私服,再加上持续集成jenkins。代码质量不用愁。 4.版本管理工具: svn或者git 5.diff和patch 6.设置你的eclipse或者IDEA,如formatter,save actions以及code template等。代码风格,直接用google的也可以啊。《Google style guide》 7.掌握一个文本编辑器,Emacs或者VIM,熟悉常用快捷键。这在你需要在线编辑代码,或者编写其他语言代码时候特别有用。《神器圣战》 二、JDK相关 1.jstat : 观察GC情况,如:
对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的。各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题。楼主同样也遇到过这些问题,那么,遇到这些问题该如何解决呢?
版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://blog.csdn.net/wh211212/article/details/84866727
最近项目出现tomcat宕机的情况,即项目运行一段时间后tomcat就会停止运行,解决方法步骤如下:
首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka 可以看到kafka这个程序的进程id
其中 pid 可以通过 jdk 自带工具 jps(直接在命令行执行jps命令即可) 进行查看
领取专属 10元无门槛券
手把手带您无忧上云