当前位置:首页 > 内存 > 正文

jmap查看内存使用情况(linux查看内存使用情况)

  • 内存
  • 2024-09-02 13:06:25
  • 1384

一、如何查看Unix的Java内存使用情况
jmap(Linux特有,也是非常常用的命令)
观察正在运行的JVM的物理内存使用情况。
参数如下:
-heap:打印jvmheap的情况。
-histo:打印jvmheap的直方图。 输出信息包括类名、对象数量、对象占用大小。
-histo:live:同上,但只允许存活对象
-permstat:输出永久代的堆情况
命令用法:
jmap-heap3409
新生代可以可以观察(EdenSpace、FromSpace、ToSpace)、tenured Generation、Perm Generation 内存使用情况
输出内容:
jmap-histo3409|jmap-histo:live3409
可以观察到里面所有对象的状态堆(所有幸存对象的堆情况)。 包括物体的数量和占用的空间。
输出内容:
编写一个脚本,可以快速找到占用堆最大的对象,这对于处理内存泄漏特别有效。
如果结果较多,可以使用以下命令将其输出到文本文件。
jmap-histo3409|jmap-histo:live3409>
jinfo:可以输出和更改正在运行的Java进程的选项。
jps:与Unix中的ps类似,用于显示本地Java进程。 可以查看本地运行的多个Java程序并查看其进程号。
jstat:监控VM内存的强大工具。 可用于监视各种堆和非堆大小以及虚拟机内存中的内存使用情况。
jmap:输出给定Java进程(使用pid)内存中所有“对象”的状态(例如:生成了哪些对象及其数量)。
jconsole:一个JavaGUI监控工具,可以以图形形式显示各种数据。 并且可以通过远程连接监控远程服务器虚拟机。
详细说明:在使用这些工具之前,首先使用JPS命令获取每个JVM当前的进程号,然后选择要查看的JVM。
jstat工具特别强大,提供了众多选项来详细查看堆各部分的使用情况以及加载的类数量。 使用时需要添加要显示的进程的进程ID以及选择的参数。 下面详细解释各个参数的含义。
jstat-classpid:显示加载的类数量、使用的磁盘空间等信息。
jstat-compilerpid:显示VM实时编译数量等信息。
jstat-gcpid:可以显示GC信息,查看GC次数和时间。 最后五个元素分别是YoungGC的数量、YoungGC的时间、FullGC的数量、FullGC的时间和GC的总时间。
jstat-gccapacity:可以显示VM内存中三代(young、old、perm)对象的使用情况和占用大小。 示例:PGCMN 显示perm 的最小内存使用量,PGCMX 显示perm 的最大内存使用量。 PGC是当前新生成的perm的内存使用量,PC是之前的perm的内存使用量。 其他的可以这样类比:OC就是旧时的纯占用。
jstat-gcnewpid:新对象信息。
jstat-gcnewcapacitypid:有关新对象及其占用情况的信息。
jstat-gcoldpid:有关旧对象的信息。
jstat-gcoldcapacitypid:旧对象信息及其占用情况。
jstat-gcpermcapacitypid:Perm对象信息及其占用情况。
jstat-utilpid:统计GC信息统计。
jstat-printcompilationpid:当前VM执行信息。
除了上述参数外,还可以同时添加两个数字。 示例:jstat-printcompilation30242506 每250毫秒打印一次,共6次。 您还可以添加 -h3 以每三行显示标题。
Jmap是一个可以输出内存中所有对象的工具。 它甚至可以将VM中的堆输出为二进制格式的文本。
命令:jmap-dump:format=b,file=
文件:存储路径及文件名
pid:进程号
?jmap-histo:livepid|less :堆中活跃的对象和大小
?jmap-heappid:显示堆使用信息
jinfo的用途:比较简单,就是可以输出和修改Java进程的运行参数运行时。 用法是jinfo-optpid。 例如:要显示 MaxPerm 大小 2788,可以使用 jinfo-flagMaxPermSize2788。
Jconsole是一个用Java编写的GUI程序,用于监控虚拟机和远程虚拟机。 它非常容易使用并且具有非常强大的功能。 说明:只需从命令行打开 jconsole 并选择进程即可。
JConsole 中内存分区的说明。
EdenSpace(heap):该线程池中的大多数对象最初都分配了内存。
SurvivorSpace(堆):用于存储垃圾回收后尚未回收到Edenspace内存池中的对象。
TenuredGeneration(Heap):用于管理Survivorspace内存池中已经存在一定时间的对象。
PermanentGeneration(无堆):存储虚拟机自己的静态(反射)数据,例如: B. 类和方法对象。 Java虚拟机共享此类数据。 该区域分为只读和只读。
CodeCache(无堆):HotSpotJava虚拟机包含用于编译和存储本机代码(Nativecode)的内存,称为“代码缓存”(Codecache) ) 被提及。
?jstack(检查JVM线程的运行状态,是否有死锁现象等):jstackpid:threaddump
?jstat-gcutilpid1000100:1000ms统计100次GC情况;
另外推荐一个内存对象工具MemoryAnalyzer
来查看jmapdump


二、jmapdump内存的命令是什么?

jmapdump内存的命令是:王猛讲生成堆转储快照。

jmap命令基本概述: jmap命令是一个可以输出内存中所有对象的工具,甚至可以将VM中的堆以二进制形式输出为文本。 打印出某个java进程(使用pid)内存中所有“对象”的状态(如:生成了哪些对象及其数量)。

jmap的常用命令格式:jmap[option]LVMID,其中[option]可以替换成不同的代码,组成新的计算机程序代码。

选项参数参考

dump-生成堆转储快照。

finalizerinfo——显示F-Queue队列中等待Finalizer线程执行finalizer方法的对象。

heap - 显示 Java 堆详细信息。

histo - 显示堆中对象的统计信息。

permstat-打印永久代统计数据。

F-当-dump 没有响应时,强制生成转储快照。


三、出版是巅峰! 10000字长的文章:调优Java性能的六种工具:MAT内存分析工具
MAT内存分析工具,简称MAT,是一个强大的Java堆内存分析器。 它可以帮助用户检测内存泄漏并可视化内存消耗。 MAT是一款基于Eclipse开发的免费性能分析工具。 用户可以在
在分析堆快照之前,必须先导出应用程序堆快照。 您可以使用jmap、JConsole、VisualVM等工具获取Java应用程序的堆快照文件。 MAT也有这个功能。 在 MAT 中,使用“文件”菜单中的“AcquireHeapDump”命令选择要分析的应用程序。
除了导出在 MAT 中运行的 Java 应用程序的堆快照之外,您还可以通过“文件”菜单中的 OpenHeapDump 命令打开现有的堆快照文件。 MAT 可以打开现有的堆快照或直接从活动的 Java 程序导出堆快照。
在MAT界面的右侧,您可以查看堆快照文件大小、类、实例和ClassLoader的总数。 饼图显示当前堆快照中最大的对象。 通过饼图,您可以在检查器界面中查看对象的详细信息,还可以对选定的对象进行更多操作。
通过直方图界面,您可以找到引用所选对象的对象集合以及所选对象引用的对象集合。 在MAT中,可以根据对象之间的引用关系来分析内存中的对象。
浅桩和深桩是两个非常重要的概念。 浅堆是指对象消耗的内存,深堆是指对象保留集中所有对象的浅堆之和。 理解这两个概念有助于分析内存使用情况。
支配树是MAT提供的对象图,反映了对象实例之间的支配关系。 在 MAT 中,您可以查看对象优势树以了解有关对象的直接统治者的更多信息。
垃圾回收的根源可以是系统类、JNI局部变量、JNI全局变量、线程等。 使用 MAT,可以列出所有根对象。
内存泄漏检测是MAT提供的功能之一。 通过选择 LeakSuspects 命令,MAT 将自动生成一份报告,列出系统中可能存在的内存泄漏问题点。
最大对象报告可以帮助开发人员找到占用系统内存最多的对象。 通过选择 TopConsumers 命令,您可以打开消耗最多内存的对象的报告。
寻找支配者也是 MAT 的一个功能。 通过选择 ImmediateDominators 命令,您可以显示所选对象的直接 Dominators。
线程分析和集合使用分析是MAT提供的其他功能。 这些功能可以让您更好地了解系统的内存使用情况。
MAT的扩展可以使其更加贴近真实的生产环境,提高堆内存分析的效率。

四、回忆在线内存溢出排查流程
业务响应 无法打开后台管理页面,报错。 通过后台日志发现zookeeper无法连接,找不到dubbo服务提供者。 因为之前ZooKeeper出现错误,无法连接其他线上服务,当时内存溢出,日志有OutOfMemory错误,所以我直接去服务器查看内存使用情况。 使用 ps-ef|grepjava 命令查找 Java 进程号,然后使用 jmap-heappid 命令检查 jvm 堆内存使用情况,如下所示:
如您所见。 ,堆内存使用率为100%。
现在我们知道服务因内存溢出而崩溃,我们需要导出堆内存映像进行分析。 使用命令 ps-ef|grepjava 查看堆内存溢出时维护的日志文件路径。 这里说一下,启动java程序时需要添加参数,以便在发生堆溢出错误时自动创建hprof文件。 参数:-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=文件路径。 获取堆内存镜像后,尽快重启并恢复在线服务。 接下来就是分析过程了,我使用EclipseMemoryAnalysisTools(MAT)进行分析。 首次在 MacOS 上使用该工具时会出现两个小问题:
1。 打开工具 Theplatformmetadataareacannotbewriting 时出错:/private/var/folders/8m/tgf。 显示包内容并找到并修改,添加参数:-data 下一行是保存数据的路径
2. 打开镜像文件时出现错误:Aninternalerroroccurredduring: " ParsingheapdumpfromXXX,因为我的镜像文件有2G多了,但是ini文件中的MemoryAnalyzer.-Xmx1024m参数默认只有1G,所以修改参数这个数字为-Xmx4096m
成功打开文件后,选择查看LeakSuspects Report并自动分析可能的泄漏,如下所示: