回答
一、内存溢出
内存溢出是指 JVM 在运行时无法分配足够的内存给新建的对象,致程序抛出OutOfMemoryError
异常。
导致内存溢出的原因有很多,大致有如下几个:
- 堆内存溢出:这是最常见的 OOM 了。产生堆内存溢出的原因有蛮多,比如创建大量的大对象、应用程序中使用了大量的缓存且没有及时释放等等。
- 栈内存溢出:栈内存溢出一般都是发生在递归调用过深或者创建了大量的线程。
- 元空间溢出:元空间溢出一般都是发生在我们应用程序通过动态代理(如
CGLib
、Javassist
)生成大量类时。 - 直接内存溢出:堆外内存溢出,比如我们在应用程序中大量使用
DirectByteBuffer
,超过了-XX:MaxDirectMemorySize
设置的限制。
二、内存泄漏
内存泄漏是指应用程序中不再使用的对象仍然被引用,导致它们无法被垃圾回收器回收,从而导致内存溢出。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。