如何判断在哪里内存溢出

1、先判断是否是内存溢出导致的

监控内存的情况

创建内存的MXBean


将内存信息输出


内存运行中的变化

将内存调整为500M,可以看到程序在运行一段时间后,老生代的内存一直在333M没有下降的意思。这种情况一般就是是否有在执行过程中,不断对成员变量塞值,导致内存溢出

第二中方式是用

jstat -gc 12538 5000

即会每5秒一次显示进程号为12538的java进成的GC情况,

显示内容如下图:

用jstat

主要是看 PU:Perm(持久代)目前已使用空间 (字节) ,查看满的情况下是否有回收的操作?

2、判断是那个位置导致的内存溢出

1、之前一次我会查看写的代码成员变量,找的很快。

2、不过这次没有找到,所以我用最笨的办法:我会将代码分为2个部分,先只保留第一部分,没有溢出然后解开第二部分的注释,如果在第二部分这溢出就将第二部分再拆解2个部分,循环往复,如果找到对应的位置最好在前面一步再执行一次确认。这个过程需要细心,耐心。

3、如果经过第二步依旧没能解决内存溢出的问题,那么还有一种可能那就是因为数据需要批量输出,所以你之前测试的内存太小,直接将内存改大一点,让它可以将批量的数据输出,再进行观察。

拓展:

利用jcmd命令:

1、jcmd -l 找pid

2、jcmd pid help 找对应的命令

3、选择 jcmd 7 GC.class_histogram 获取那个class最多

注释对应的类的内容

3、测试

你可能感兴趣的:(如何判断在哪里内存溢出)