目录
一、内存溢出
概念:就是说系统分配的内存空间不足以存放当前数据项。比如栈溢出。进栈时,栈已满,却依旧再进栈就会出现上溢,当数据项已经全部出栈,却依然在退栈,就会出现下溢。
-
栈溢出:栈溢出就是由于递归或循环嵌套层次太多造成的
-
局部数组过大
-
递归调用层次太多
-
指针或数组越界
-
堆溢出:导致堆溢出的操作是不断的new 一个对象,一直创建新的对象,但是不销毁
二、 内存泄漏
概念:是指new出来的对象如果是强引用、软引用应当在数据项使用完成之后,即使释放,如果没有及时释放,就会在内存里,这就是内存的泄露,内存泄露久而久之会造成内存溢出。
栈泄露:是缓冲区泄露的一种,比如布局嵌套过深会导致栈泄露等等。
堆泄漏:程序在运行中malloc/new等分配一块内存,完成没有调用相对应的free/delete释放掉;
三、 如何排查解决
-
jps 查看JVM进程ps -ef | grep java
-
Jmap 内存占用情况查哪个对象占用比较多 jmap -histo pid查看各个代内存大小 jmap -heap pid打印堆栈信息 jmap -dump:format=b,file=canal.hprof pid
-
Jstat 监控进程的classloader,compiler,gc情况jstat -gcutil pid 1000
-
Jstack查看CPU高内存的堆栈信息步骤:
-
(1) top 查看CPU最高的进程
-
(2) top -Hp pid 查看哪个线程占用的CPU最高
-
(3)printf "%x\n" tid 线程ID转为16进制格式
-
(4)jstack -l tid > ./filename.stack
-
(5)jstack pid |grep tid -A 30 查看线程堆栈信息
-
Jinfojvm的全部参数和系统属性 jinfo pid输出某属性的参数 jinfo -flag name pid