一般,在内存不足、GC异常等情况下,我们就会怀疑有内存泄露。这个时候我们就可以制作堆Dump来查看具体情况。分析原因。...-histo[:live] 打印堆的柱状图。其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。...如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。 -h打印帮助信息。 -help 打印帮助信息。...-histo:live 这个命令执行,JVM会先触发gc,然后再统计信息。...4.使用jmap -histo:[live]查看堆内存中的对象的情况。如果有大量对象在持续被引用,并没有被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。
的; 从图来看,堆内存已经占用了1.4G,可能存在内存泄露风险。...#jmap -dump:format=b,file=heapDump 6900 #jmap -dump:live,format=b,file=dump.bin 6900 -dump:[live,]format...使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象,如下: # jmap -histo:live pid | more ?...top出来java占用内存极大而jmap出来的很小,说明有堆外内存泄露。...参考Java堆外内存泄露分析 综合使用参考: JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解 JVM性能调优监控工具专题一:JVM自带性能调优工具(jps
文章目录 一、简介 二、jmap用法 三、使用示例 1、no option 2、heap 3、histo[:live] 4、clstats 5、finalizerinfo 6、dump 一、简介 jmap...heap: 显示Java堆详细信息 histo[:live]: 显示堆中对象的统计信息 clstats:打印类加载器信息 finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行...在这个模式下,live子参数无效. help:打印帮助信息 J:指定传递给运行jmap的JVM的参数 三、使用示例 1、no option 查看进程的内存映像信息,类似 Solaris pmap 命令。...jmap -heap pid 打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息。 3、histo[:live] 显示堆中对象的统计信息。...jmap -histo:live pid 其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。
4、jmap的使用以及内存溢出分析 前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容, 如:内存使用情况的汇总、对内存溢出的定位与分析。...#查看所有对象,包括活跃以及非活跃的jmap ‐histo | more #查看活跃对象 jmap ‐histo:live | more [root@node01 ~]# jmap...‐histo:live 6219 | more num #instances #bytes class name ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐...dump到文件中 有些时候我们需要将jvm当前内存中的情况dump到文件中,然后对它进行分析,jmap也是支持dump到文件中的。...查看可能存在内存泄露的分析: ?
其实在Java的复杂项目中都会有内存不足问题、内存泄露问题、线程死锁问题、CPU问题。这些问题功能测试或者是小压力的情况下有可能并不明显,很容易被忽视。...jmap是java内存映射工具,jmap用于生成堆转储快照(heapdump文件或者dump文件),打印出制定java进程的内存情况。...内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件....-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量....另外,内部String的数量和占用内存数也会打印出来. -F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
1.3 options参数 heap:显示Java堆详细信息; histo:线下堆中对象的统计信息; clstats:Java堆中内存的类加载器的统计信息; finalizerinfo:显示在F-Queue...,可以用此来判断内存目前的使用情况以及垃圾回收情况。...2.4 jmap -histo:live 129665 打印堆的对象统计,包括对象数、内存大小等。jmap -histo:live这个命令执行,JVM会先触发gc,然后再统计信息。...第一列:编号id 第二列:实例个数 第三列:所有实例大小 第四列:类名 > jmap -histo:live 129665 | grep com.netflix 658: 1...如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。
jmap指令可以查看JVM运行的堆内存情况, [test@localhost]> jmap -h Usage: jmap [option] (to connect to...running process) jmap [option] (to connect to a core file) jmap [...to print same info as Solaris pmap -heap to print java heap summary -histo...Use with -dump: or -histo to force a heap dump or histogram...例如,可以看下可能的泄露问题,点击饼图部分,就可以看到构成此问题的具体类,因为涉及细节,在此不做展示, ?
只好寻求其他方法了,幸好Java提供了一个很好的内存监控工具:jmap命令 jmap命令有下面几种常用的用法: •jmap [pid] •jmap -histo:live [pid] >a.log •jmap...其中,jmap -histo:live [pid] 可以查看当前Java进程创建的活跃对象数目和占用内存大小。...具体怎么使用可以查看本博的另一篇文章:利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏 这里详细介绍下jmap -histo:live [pid] 命令: 从上图可以看出...2、jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。...3、jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏等等。
,通过jmap -histo/-histo:live pid >> log导出fgc前后的histo对比,发现了一个实例数很大的对象CarnivalOneDayInfo,达到了2kw级别,而且一直在增加...但是线上玩家很多,而且堆内存很多,导出一次很花费时间,会stw,所以直接连开发服务器,查了一下,一样存在CarnivalOneDayInfo泄露的问题,所以直接利用jmap -dump:live,format...复盘和总结 其实非常怀疑过beanutils的问题,但是没有太仔细注意,现在一看,和上面的分析一模一样,分析内存泄露,思路: 对比fgc前后的histo,确认那些对象实例数一直在增加,而且明显偏大 分析代码...,如果直接定位问题,最好 如果不能直接定位,需要确认是谁持有该对象引用,那么需要dump堆内存快照 但是不能在线上dump,需要在开发服务器复现(内存泄露通常比较容易复现),然后在开发服务器dump dump...这样能快速确认是否是出现了内存泄露还是真的比较占内存。
在这个模式下,live子参数无效. help:打印帮助信息 J:指定传递给运行jmap的JVM的参数 1、no option 命令:jmap pid 描述:查看进程的内存映像信息,类似 Solaris...3、histo查看内存中对象数量及大小 命令:jmap -histo[:live] pid 描述:显示堆中对象的统计信息 可以使用管道 | more来一段一段地输出信息。...#查看所有对象 jmap ‐histo | more #查看活跃(存活?)对象 jmap ‐histo:live | more ? ...-dump:live 以及 jmap -histo:live都会触发Full GC https://www.iteye.com/blog/langzi-xl-798905 4、clstats打印类加载器信息...⑦查看可能存在内存泄露的分析 ?
工具 } } /** output: 72 72 voice2:56 */ jmap 查看 一致的:OK jmap -histo PID | findstr ObjName 打印出某个...可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。...如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。...-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. ...另外,内部String的数量和占用内存数也会打印出来. -F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
常见的有全局集合类 堆对象统计信息 命令:jmap -histo:live pid 描述:显示堆中对象的统计信息 可以看到各个类的实例数和占用内存大小 num #instances...interface Lclassname; double D float F int I long J short S 如果有[则表示数组,[[则是二维数组 一般情况下从类的实例数,还是很难定位到内存泄露点...,因为没有引用链路,不知道是哪个变量造成了内存泄露 生成内存镜像 命令:jmap -dump:format=b,file=heapdump.hprof [pid] 描述:生成堆转储快照dump文件...dump内存镜像,我们就可以使用内存分析工具(MAT),查看各个类的引用链路,找到内存泄漏点 使用MAT分析 一般使用Dominator Tree,因为一般对象的内存占用大小只是该对象本身的大小...,不包含其引用其他对象的大小,Dominator Tree可以计算对象以及被其引用的其他对象的大小,这样就可以找到最终导致内存泄露的点 从MAT分析结果来看: ch.qos.logback.classic.LoggerContext
heap: 显示Java堆详细信息 histo[:live]: 显示堆中对象的统计信息 clstats:打印类加载器信息 finalizerinfo: 显示在F-Queue队列等待Finalizer...在这个模式下,live子参数无效....help:打印帮助信息 J:指定传递给运行jmap的JVM的参数 示例一:no option 命令:jmap pid 描述:查看进程的内存映像信息,类似 Solaris pmap 命令。...示例二:heap 命令:jmap -heap pid 描述:显示Java堆详细信息 打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息 C:\Users\jjs>jmap -...示例三:histo[:live] 命令:jmap -histo:live pid 描述:显示堆中对象的统计信息 其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。
上文:JVM-jinfo的使用 jmap:Java内存映像工具是什么?可以干什么?...java memory = direct memory(直接内存) + jvm memory(MaxPermSize +Xmx) jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize...显示class的内存情况 jmap -histo 20220 instances:实例数; bytes:内存占用大小; classs name:类名。...从大到小排序 jmap -histo:live 20220 生成文件 jmap -histo:live 20220>D://hong.log 打印类加载信息 jmap -clstats 20220...生成堆转储快照文件 注意:会暂停应用 jmap -dump:live,format=b,file=D://hong2.log 20220 参数: option:选项参数,不可同时使用多个选项参数 pid
来源:github.com/jasonGeng88/blog 背景 离线分析 主要逻辑: 回放客户端实现(内存泄露): 内存分析: 代码优化 结果验证 总结 ---- ?...具体命令如下: jmap -histo:live `pid of java` # 为了便于观察,还是将输出写入文件 jmap -histo:live `pid of java` > /tmp/jmap00...场景再现 经过分析,最后我们定位到是使用 httpasyncclient 产生的内存泄露问题。...下面通过一个 Demo,来简单讲下具体内存泄露的原因。...这一次的内存泄露问题算是解决了。 总结 关于内存泄露问题在第一次排查时,往往是有点不知所措的。我们需要有正确的方法和手段,配上好用的工具,这样在解决问题时,才能游刃有余。
=quMall.dump 16969 显示堆中活跃对象的统计信息,比如实例数量,占用空间(会触发Full GC) jmap -histo:live 查看进程使用的GC算法(实际上用到了.../vjmap.sh -old:live PID > /tmp/histo-old-live.log 过滤对象大小,不显示过小的对象。...使用jmap -histo:live 命令,可以看到跟JDBC相关类的实例数和占用空间比较多。...如果使用jmap -histo:live 和jmap -dump:format=b,file=quMall.dump 16969会造成Full GC。 ?...jmap 使用Memory Analyzer tool(MAT)分析内存泄漏 利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露 allow heap & Retained
jstat -gccause:额外输出上次GC原因 jstat -calss:件事类装载、类卸载、总空间以及所消耗的时间 jmap 功能 生成堆转储快照(heapdump) 常用指令 jmap -heap...3331:查看java 堆(heap)使用情况 jmap -histo 3331:查看堆内存(histogram)中的对象数量及大小 jmap -histo:live 3331:JVM会先触发gc,然后再统计信息...jmap -dump:format=b,file=heapDump 3331:将内存使用的详细情况输出到文件,之后一般使用其他工具进行分析。...jhat 功能 一般与jmap搭配使用,用来分析jmap生成的堆转储文件。...六、结合代码解决内存溢出或泄露问题。
老年代内存占用百分比变化趋势大致如下: 初步判断大量请求超时和服务瘫痪的直接原因: 每次fullGC后的内存占用越来越高 内存占用增长速度越来越快 fullGC的频率越来越高...最终占用达到100%,服务完全瘫痪 分析处理 使用指令:jmap -histo:live *** | more 查看堆内存中的对象数量和大小 发现Log4jLogEvent这个对象实例很多,占用内存也异常的大...后续分析 在前一步分析内存的同时,使用指令:jmap -dump:format=b,file=heapDump.hprof将实时内存信息导出(dump过程比较慢,所以在问题暂时处理完后进行后续分析),使用...mat分析内存结构: 可以看到主要占据堆内存的对象信息,果然是Flume异步传输日志堵塞的问题。...总结 对jvm内存泄露这类问题的解决,主要是要善于利用jvm提供的类似jstat、jmap等工具来分析查找问题。这次问题虽然解决,但是后续还是存在出现此类问题的风险。
//输出大对象到文件 jmap -histo:live pid > ..../java.log //查询前20占用内存大对象 jmap -histo:live 2837 | head -n 20 //查看Full GC情况 jstat -gcutil 2501 //查看线程...查看启动参数 jinfo -flags //查看linux内核日志 dmesg | grep java //查看系统日志 vim /var/log/messages 查看系统日志 //jvm使用情况查看 jmap
jmap命令可以获取运行中的jvm的快照,从而离线分析,检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中最多的对象,各种对象所占用的内存大小.可以使用jmap生成Heap Dump....jmap pid 查看进程的内存映像信息,类似 Solaris pmap 命令 使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称...-histo:live pid 堆中对象统计 其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。...如果指定了live子选项,则只计算活动的对象。...[root@Server-i-b2l6uawirw ~]# jmap -histo:live 18378 | more num #instances #bytes class
领取专属 10元无门槛券
手把手带您无忧上云