一. 内存泄漏(Memory Leak)
是指程序在申请内存后,无法释放已申请的内存空间(程序中有引用没有释放,不能被GC回收)。一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是会导致内存溢出。
二. 内存溢出(Out Of Memory)
它是指程序在申请内存时,没有足够的内存空间供其使用,抛出OutOfMemory异常。
比如申请了一个8MB空间,但是当前内存可用空间只有5MB,那么就是内存溢出。
三. 二者的关系与区别
关系:1.内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢了或者没有将钥匙还回去,那么结果就是这个柜子将无法供给任何人使用,也无法被垃圾回收器回收,因为找不到他的任何信息。
2.内存泄漏的堆积最终会导致内存溢出,由于系统中的内存是有限的,如果过度占用资源而不及时释放,最后会导致内存不足,从而无法给所需要存储的数据提供足够的内存,从而导致内存溢出。
3.导致内存溢出也可能是由于在给数据分配大小时没有根据实际要求分配,即请求的内存空间超过了系统实际分配给你的内存空间,最后导致分配的内存无法满足数据的需求,从而导致内存溢出。
区别: 内存泄露是由于GC无法及时或者无法识别可以回收的数据进行及时的回收,导致内存的浪费;内存溢出是由于数据所需要的内存无法得到满足,导致数据无法正常存储到内存中。内存泄露的多次表现就是会导致内存溢出。
四. 内存溢出的解决方法
第一步,修改JVM启动参数,直接增加内存(-Xms,-Xmx参数一定不要忘记加);
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误;
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。