问:简单说说 Java 中内存泄漏与内存溢出的区别?
答:内存溢出(OutOfMemory)是指程序在申请内存时没有足够的内存空间供其使用。内存泄露(MemoryLeak)是指程序在申请内存后无法释放已申请的内存空间。一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存迟早会被消耗尽,所以内存泄漏最终可能会导致内存溢出。
内存泄漏本身一般对业务逻辑不会产生什么危害,作为一般的用户在频次不高的情况下根本感觉不到内存泄漏的存在,真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存,所以频次不高和占用内存不大的泄露一般都比较难以发现定位,如果需要定位分析内存泄漏可以采用一些第三方工具辅助,譬如 MAT 等。
内存溢出出现的原因一般比较多,譬如内存中一次加载的数据量过于庞大,启动参数内存值设定的过小,内存持续泄漏导致内存用光等。解决内存溢出可以通过修改 JVM 启动参数( -Xms/-Xmx 等,不过一般不建议),检查分析代码找出庞大数据或者泄漏点。
本文参考自 内存泄漏与内存溢出相关面试题解析