1、先判断是否是内存溢出导致的
监控内存的情况



将内存调整为500M,可以看到程序在运行一段时间后,老生代的内存一直在333M没有下降的意思。这种情况一般就是是否有在执行过程中,不断对成员变量塞值,导致内存溢出。
第二中方式是用
jstat -gc 12538 5000
即会每5秒一次显示进程号为12538的java进成的GC情况,
显示内容如下图:

主要是看 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、测试
网友评论