在进行 Java 程序性能分析时,我们可以利用 Java 自带的工具来对程序进行监控和调试。这些工具包括 JVM 监控工具、GC 日志分析工具以及 Java 编译器等,它们可以帮助我们识别出程序中存在的性能问题并提出相应的解决方案,从而提升程序的性能和响应速度。下面将详细介绍常用的 Java 性能分析工具及其使用方法,并结合实例进行演示。
之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令。 也可以帮助自己在以后的工作中快速的排查线上问题。
我们目前所有的 java 服务都是封装在 docker 里面的,今天做压力容量测试的时候发现有个服务占用cpu 300%,想找到是这个 java 程序的那个线程造成的问题,把问题反馈给开发让他们去修复。
利用java的命令行工具:jps + jstack 组合可以得到Thread Dump:
JDK的bin目录中有一系列的小工具,除了java.exe、javac.exe这两个编译和运行Java程序外,还有打包、部署、签名、调试、监控、运维等各种场景都会用到这些小工具。
Java 虚拟机(JVM)生成3个关键文件,这些文件对于JVM优化性能和解决生产问题非常有用。这些文件是:
Thread dumps(线程转储)能帮助我们判断 CPU 峰值、死锁、内存异常、应用反应迟钝、响应时间变长和其他系统问题。一些在线的分析工具比如 http://fastthread.io/ 也能帮助我们分析和定位问题,但是这些工具都要求有一个 dump 文件。因此在这篇文章当中,我总结了7中抓取 Java Thread Dumps 文件的方式。
在当今的信息化时代,计算机系统在各行各业都发挥着重要的作用。然而,当生产环境中的CPU飙升时,系统性能会受到影响,甚至导致整个系统瘫痪。这不仅会对企业造成经济损失,还会对用户体验造成严重影响。因此,如何定位并解决生产环境中CPU飙升的问题,已成为众多企业和开发人员亟待解决的问题之一。
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
我发现很多人没办法高效地解决问题的关键原因是不熟悉工具,不熟悉工具也还罢了,甚至还不知道怎么去找工具,这个问题就大条了。我想列下我能想到的一个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情况,如:
UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据;同时提供JVM基本参数获取、内存dump、线程分析、内存分配采样和热点方法分析等功能。
线上 CPU 高负载是许多运维工程师和开发人员经常面临的挑战之一。当 CPU 使用率升高时,系统性能可能会受到严重影响,因此快速定位问题所在至关重要。本文将介绍一些常见的技术和方法,帮助你迅速找到线上 CPU 高负载问题的根本原因,并提供实际代码示例。
可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称(main函数所在类)以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。其常用选项见下表;
生产环境中直接排查 JVM 的话,最简单的做法就是使用 JDK 自带的 6 个非常实用的命令行工具来排查。它们分别是:jps、jstat、jinfo、jmap、jhat 和 jstack,它们都位于 JDK 的 bin 目录下,可以使用命令行工具直接运行,其目录如下图所示:
前言 对于JVM的性能监控,主要注意以下关键参数,通过jdk自带的命令行工具,即可查看相关参数,从而分析系统或目标服务程序中存在的性能瓶颈 jps JVM Process Status Tool的缩写,JVM进程状况工具。 主要功能: 列出正在运行的java进程,并显示执行主类的名称及进程在本地JVM中的ID。 与ps命令相似,可以查看java进程ID(LVMID)。 使用方法: jps [options][hostid] [options]:-q: 只输出LVMID -m: 输出JVM启动时传给主类的方
jps(Java Virtual Machine Process Status Tool)显示当前所有Java进程pid的命令
当你的应用没有一套完善的监控告警系统,线上故障了 ,总是很被动,但是还得要定位问题 ,奈何手里无利器 ,没办法只能硬上了,虽然原始,好在有效~
有时候碰到服务器CPU飙升或者程序卡死之类的问题,一般都不太好定位。这类bug一般都隐藏的比较深并且还可能是偶发性的,比较棘手。
内存溢出 out of memory : 通俗理解就是内存不够用了,是我们工作当中经常会遇到的问题,内存溢出有可能发生在正常的情况下,而非代码层面问题导致,比如高并发下,大量的请求占用内存,垃圾回收机制无法进行回收,而导致的内存溢出,这种情况就需要我们去调整架构了。一但出现内存溢出问题,我们需要快速定位并解决,尤其是生产环境,所以针对内存溢出问题,我们需要掌握一些常用的排查工具,针对不同场景、现象有快速排查思路。引起内存溢出的原因有很多种,常见的有以下几种:
JDB 是基于文本和命令行的调试工具,Jikes 在 JDB 的基础上提供了 GUI。熟悉 JDB 还是有价值的,很多情况下需要我们在命令行下完成简单的 debug 问题定位。
了解了部分JVM运行的原理之后,就要进入实战环节啦.在实际工作中,我们既不需要去实现虚拟机,也不需要对垃圾收集或者内存分配过程进行DEBUG.但是我们经常需要对某个应用程序进行JVM层面的调优.
学会下面这几个方法,让你轻松玩转内存溢出,我们会从 Windows、Linux 两个系统来做示例展示,有人会有疑问了:为什么要说 Windows 版的 ?因为目前市面上还是有很多 Windows 服务器的,应用于传统行业、政府结构、医疗行业等等;两个系统下的情况都演示下,有备无患,
昨天一个前同事找我,问有没有性能测试岗位的面试题,正好之前帮业务团队加面过几次性能测试岗位的候选人,我将面试时候会问的一些问题以及要考察的点列了出来,供大家参考。
最近参加面试经常被面试官问到有没有遇到过线上人内存溢出(OOM)的问题?遇到过的化你是怎么定位是哪个线程下哪些对象占用你内存太多造成的?提出这个问题其实面试官就是用来考察你到底有没有JVM调优经验。如果你在工作中并没有JVM方面的经验,也没有仔细看过线上定位和OOM问题的文章,那么99.9%这道题你要凉凉!
概述 jstack是jdk自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。 Jstack 用法 image 参数说明: -l 长列表. 打印关于锁的附加信息,例如
jmap -dump:live,format=b,file=m.hprof <PID>
2、jdk内存分析命令:jmap、jstack、jstat、jConsole、jvisualvm
作为一个合格的开发人员,不仅要能写得一手还代码,还有一项很重要的技能就是排查问题。这里提到的排查问题不仅仅是在coding的过程中debug等,还包括的就是线上问题的排查。由于在生产环境中,一般没办法debug(其实有些问题,debug也白扯。。。),所以我们需要借助一些常用命令来查看运行时的具体情况,这些运行时信息包括但不限于运行日志、异常堆栈、堆使用情况、GC情况、JVM参数情况、线程情况等。
备注:默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制(MinHeapFreeRatio参数可以调整)
服务监控是一个服务中非常重要的组成部分,直接决定了问题的发现及排查速度,并且从一定程度上提高服务一个周期内的可用性。在Java服务中,除了对于 业务、接口耗时&性能的监控之外还需要对Java 所依赖的JVM进行一定的监控策略。对于JVM的合理监控可以帮助我们更加全面的发现问题:比如说内部接口耗时忽然上升、oom频出这类问题,并且合理的JVM监控及分析策略,能够以此为依据进行服务所使用JVM的调优,从而提升稳定性及性能。
后文会从 Windows、Linux 两个系统来做示例展示,有人会有疑问了:为什么要说 Windows 版的 ? 目前市面上还是有很多 Windows 服务器的,应用于传统行业、政府结构、医疗行业 等等;两个系统下的情况都演示下,有备无患
Java 开发人员肯定都知道 JDK的 bin 目录中有 “java.exe”、“javac.exe” 这两个命令行工具。下面主要介绍一些监视虚拟机和故障处理的工具。
ps(Java Process Status):显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。
其中 pid 可以通过 jdk 自带工具 jps(直接在命令行执行jps命令即可) 进行查看
jps 命令可以列出所有的 Java 进程。如果 jps 不加任何参数,可以列出 Java 程序的进程 ID 以及 Main 函数短名称,如下所示。
最近做了一个XXX项目,背景是老服务重构,预期指标是在原有系统基础上性能提升3倍,架构设计是XXX。针对这个项目我梳理了核心应用和接口有XXX个,对应的场景有XXX,我的压测策略是XXX。测试过程中发现了XXX问题,问题表现是XXX,通过XXX(日志、工具)分析原因为XXX,最终优化策略是XXX,优化后结果为XXX
记一次Java线上服务器CPU过载问题的排查过程,详解排查过程中用到的Java性能监测工具:jvisualvm、jstack、jstat、jmap。
上篇文章写完后,性能调优|成都核酸系统篇 收到了一些夸赞,让我有继续写下去的动力;
该命令主要与jmap搭配使用,用来分析jmap转储的转储快照。其中构建了一个微型的http/html服务器。生成dump文件的分析结果后可以通过浏览器进行查看。 通常情况下不采用jhat进行分析,一方面,分析工作需要耗费额外的资源和时间,既然都要在其他机器进行,则不需要限定于上述工具。另外一方面,jhat界面比较简陋,可以用visualVM,eclipse的Memory Analizer 等更加专业的分析工具进行替换。
最近翻看以前写的 PPT, 发现了在2019年做的一次技术分享,关于 Java 问题排查,由于没什么公司机密可言,整理下分享给大家~
前面介绍了虚拟机的内存分配和回收,大致有了一些理论基础,接下来我们从实践的角度去了解虚拟机内存管理。定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。
本文将通过一次jvm内存分析过程来说明jps、jcmd、jstat、jstack 和 jmap 工具的使用方法。
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稳定增长,则有可能出现内存泄漏。
Java虚拟机(JVM)生成3个关键工件,这些工件对于优化性能和解决生产问题很有用。这些工件是:
目前采用微服务架构已经逐渐成为企业架构的标准范式,而大多微服务是基于Spring Cloud框架来进行应用的构建的,所以在开发实践中,甚至生产环境中,会遇到java相关问题,例如系统运行变慢、内存OOM,堆栈异常等问题,这里结合我之前的一些实践提供一些相关工具,和大家一起分享我们的诊断思路和解决技巧。
领取专属 10元无门槛券
手把手带您无忧上云