工作一段时间后,会经常听到内存溢出,那内存溢出到底是哪里的内存溢出,是什么原因导致的,如何解决,今天就来深入了解一下.
在java中,要了解内存,需要先清楚jvm内存模型,我们常说的java内存实际上就是指Runtime Data Area,分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分.这里不做具体介绍.
1.常见的内存泄露
(1)内存分配未成功,却使用了它
(2)内存分配成功,但尚未初始化就引用它
(3)内存分配成功且初始化,但操作越过了内存的边界
(4)忘记释放内存,造成内存泄漏
(5)释放了内存却继续使用它
以发生的方式来分类:
(1)常发性内存泄漏,发生内存泄漏的代码会被多次执行到,每次执行都会导致一块内存泄漏
(2)偶发性内存泄漏
(3)一次性内存泄漏,发送泄漏的代码只会被执行一次
(4)隐式内存泄漏,程序在运行过程中不停地分配内存,但直到结束时才释放内存。
2.为什么会导致内存溢出
编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出。而出现内存泄露的地方,一般是不断的往容器中存放对象,而容器没有相应的大小限制或清除机制。