一、定义
内存溢出:OutOfMemoryError,是指因内存不够,导致操作新对象没有剩余空间。会导致频繁fullgc出现STW从而导致性能下降。
内存泄漏:指用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态。
二、主要外在体现
- 应用程序长时间连续运行时性能下降;
- CPU使用率高,甚至到100%;
- 频繁fullgc,各种诸如接口超时等报警;
- 应用程序偶尔会耗尽连接对象;
查看应用程序full gc时间:jstat -gc pid 间隔时间 显示次数:
三、造成OOM的原因
- 一次性申请的对象太多。比如查数时表数据太多一次性到内存中处理,需要定位到具体的代码再优化;
- 内存资源耗尽未释放。比如一些连接、线程等,应用完后释放,且用线程池的概念;
- 本身资源不够。本身要处理一些日常的大对象工作,可以用jmap -heap 可以查看服务资源情况。
jmap -heap命令界面