java -Xms200M -Xmx200M -XX:+PrintGC com.xxx.xxx
通过gc日志和top命令可看到,程序在频繁ygc,并且每次回收的内存越来越少;cpu和系统内存也在逐步上升。
1.使用top或者jps命令查看服务器运行java进程状况,找到pid
2.使用jinfo pid查看该进程运行的参数信息
3.使用jstat -gc pid 500命令,每500ms打印一次pid进程的内存使用情况
2.使用top -Hp 2043 查看2043进程里面的线程信息,也可以使用jdk自带的命令jstack 2043|more查看。
3.使用jmap -histo pid|head -20 命令查看堆内对象占用内存情况
在这里可以看到cardInfo对象一直在生成,且不能被回收,接下来在代码中查找哪里使用了cardInfo对象。
1.使用jmap -dump:format=b,file=xxx.hprof pid命令导出二进制堆栈文件,该命令不建议在生产环境使用,因为该命令会造成堆暂停生成快照,影响业务进行,可以使用参数-XX:+HeapDumpOnOutOfMemoryError参数进行线上oom参数打印
2.使用图形化工具分析导出的堆栈文件,例如MAT,jvisualvm,推荐jvisualvm,在自带的jdk路径下
在阿里官网搜索该工具,下载下来后,linux环境使用./as.sh启动,或者使用java -jar arthas-boot.jar进行启动
里面的[1]:2359是环境上的java进程,直接敲1回车,进行监测
挂上arthas之后,jad 类名,直接反编译出来该类内容