Java服务器内存过高CPU过高问题检阅
1、内存过高一般有两种情况:内存溢出和内存泄漏 (1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报错 (2)内存泄漏:不再使用的对象一直占据着内存不释放,导致这块内存浪费掉,久而久之,内存泄漏的对象堆积起来,也会导致物理机的内存被耗尽,出现OOM报错 2、内存过高的检测办法:通常我们的Java服务器部署在Linux机器上面,可以通过jvm自带的命令进行一些检测 (1)查看对象的数目和占用内存大小 ①参数为Java程序的进程号,将结果导出到指定目录中, jmap -histo:live <进程号> > <导出目录+文件名> ②示例如下,可以看到程序中各个对象所占用内存的情况,根据占用字节数大小降序显示,这里只能看出哪些对象占用内存高,但是还不能具体定位到问题代码,需要进一步排查 ③一些特殊的标识的含义 [C 表示char[],一般与String对象相关,因为String其实就是基于char数组实现的 [S 表示short[] [I 表示int[] [B 表示byte[] [II 表示int[][] num #instances #bytes class name ---------------------------------------------- 1: 585152 75635896 [C 2: 66541 71446496 [B 3: 1141734 36535488 java.util.HashMap$Entry 4: 176622 26086840 <constMethodKlass> 5: 176622 24034208 <methodKlass> 6: 17717 19584560 <constantPoolKlass> 7: 174454 18375128 [Ljava.util.HashMap$Entry; 8: 571222 13709328 java.lang.String 9: 832783 13324528 java.lang.Integer 10: 17717 13198840 <instanceKlassKlass> 11: 15092 11237440 <constantPoolCacheKlass> 12: 46779 10429728 [I 13: 191501 7660040 java.util.LinkedHashMap$Entry 14: 12599 6567592 <methodDataKlass> 15: 113526 6357456 java.util.HashMap 16: 197998 6335936 java.util.Hashtable$Entry (2)如果需要进一步定位问题代码,那么就需要把Java程序的内存镜像导出,再具体分析了,通过如下命令导出程序的内存镜像 jmap -dump:format=b,file=<导出目录+文件名> <进程号> (3)下载Memory Analyzer工具来分析内存镜像
(4)打开软件后,File-->Open Heap Dump...,打开刚才导出的镜像文件,选择Leak Suspects Report,Finish,进入分析页面 Histogram:列表展示出内存中的对象数目和占用内存大小 Dominator Tree:列表展示出程序中每个线程中的对象数目和占用内存大小 Top Consumers:图表展示出每个线程的对象数目和占用内存大小 Top Components:图表展示出内存中的对象数目和占用内存大小 Leak Suspects:这个是最常用的,会自动检测分析内存异常的原因 右键对象-->show objects by class可以查看对象的具体情况 by incomming reference:显示引用该对象/线程的其他对象 by outgoing reference:显示当前对象/线程引用的其他对象 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |