java的jvm堆中的内存泄露和内存溢出的概念以及区别【杭州多测师】【杭州多测师_王sir】
一、什么是内存溢出和内存泄露
内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存不够用,最终导致内存溢出。
2、内存溢出 (out of memory)::指程序申请内存时,没有足够的内存供申请者使用,导致数据无法正常存储到内存中。也就是说给你个int类型的存储数据大小的空间,但是却存储一个long类型的数据,这样就会导致内存溢出。
二、内存溢出和内存泄露的关系以及区别
1.关系:内存泄露最终会导致内存溢出,由于系统中的内存是有限的,如果过度占用资源而不及时释放,最后会导致内存不足,从而无法给所需要存储的数据提供足够的内存,从而导致内存溢出。导致内存溢出也可能是由于在给数据分配大小时没有根据实际要求分配,最后导致分配的内存无法满足数据的需求,从而导致内存溢出。
2.区别:内存泄露是由于GC无法及时或者无法识别可以回收的数据进行及时的回收,导致内存的浪费;内存溢出是由于数据所需要的内存无法得到满足,导致数据无法正常存储到内存中。内存泄露的多次表现就是会导致内存溢出。
内存泄漏与内存溢出
内存泄露:是指内存对象经过多次 GC 之后仍然无法被回收堆积的越来越多,导致内存可用空间越来越少,称之为内存泄露。( 泄露的是内存空间) 现象:频繁的fullGC然后老年代空间越来越少,就可以认定内存泄露了
内存溢出:指可用空间不足后,JVM 返回的 OOM 故障。常见的 OOM 异常有下面几种
1)Java heap space # 堆内存泄露
2)StackOverflow # 无限递归循环,超出栈帧深度,栈空间耗尽
3)GC overhead limit exceeded Java # 进程花费 98% 以上的时间执行 GC,只恢复了不到 2% 的内存,且该动作连续重复了 5 次
4)Direct buffer memory Java # 应用通过 Direct ByteBuffer 直接访问堆外内存。堆外内存不足,返回此错误
内存泄露:是指内存对象经过多次 GC 之后仍然无法被回收堆积的越来越多,导致内存可用空间越来越少,称之为内存泄露。( 泄露的是内存空间) 现象:频繁的fullGC然后老年代空间越来越少,就可以认定内存泄露了
内存溢出:指可用空间不足后,JVM 返回的 OOM 故障。常见的 OOM 异常有下面几种
1)Java heap space # 堆内存泄露
2)StackOverflow # 无限递归循环,超出栈帧深度,栈空间耗尽
3)GC overhead limit exceeded Java # 进程花费 98% 以上的时间执行 GC,只恢复了不到 2% 的内存,且该动作连续重复了 5 次
4)Direct buffer memory Java # 应用通过 Direct ByteBuffer 直接访问堆外内存。堆外内存不足,返回此错误