蓝盟IT小贴士,来喽!
一、基本概念
内存溢出:简单地说,内存溢出是指在程序执行中被请求的内存大于系统能够提供的内存,无法申请足够的内存,发生了内存溢出。
内存泄漏:内存泄漏是指程序运行期间内存被分配给临时变量,用完后不会被GC回收,总是占用内存,使用也不会被分配给其他程序,发生内存泄漏。
内存溢出out of memory是指程序在申请内存时没有足够的内存空间可供使用,而且会产生out of memory
内存泄漏memory leak是指程序申请内存后,无法释放所申请的内存空间,可以忽略内存泄漏的损失,但内存泄漏的堆积结果严重,不管内存量如何,迟早会被占用。
memory leak最终会成为out of memory!
所谓内存泄漏,是不需要的对象(未使用的对象)持续占用内存,或者不需要的对象的内存不能立即释放,内存空间的浪费被称为内存泄漏。 内存泄漏可能不严重并且难以感知,开发者可能不知道内存泄漏的存在但也可能严重,并且提示Out of memory。
二、内存溢出的常见情况
内存溢出的一般情况包括:
1.Java.lang.out of memory error : permgenspace (持续带宽溢出)
由于jvm通过永久带实现了java虚拟机规范的方法区域,并且已知运行时常量池存储在该方法区域中,因此发生此溢出的原因是运行时常量池溢出,或者程序中存储了大量的jar或 存储在方法区域中的类对象可能未能及时收集,或者类信息可能超过设置的大小。
2、Java.lang.out of memory error : javaheappaspace (堆溢出)
发生这种溢出的原因是,一般生成的对象过多,在回收垃圾之前对象数达到了最大堆的容量限制。
一种解决此区域异常的方法是使用内存映像分析工具分析转储堆转储的快照,以查看内存是溢出还是泄漏。 对于内存泄漏,还可以使用工具查看从泄漏对象到GC Roots的引用链,以确定泄漏代码的位置并修改程序和算法。如果没有泄漏,即内存中的对象必须确保存在内存中。 必须检查虚拟机堆参数-Xmx (最大堆大小)和-Xms (初始堆大小),以确定它们是否可以比计算机的物理内存更大。
3、虚拟机堆栈和本地方法堆栈溢出
如果线程请求的堆栈深度大于虚拟机允许的最大深度,则抛出堆栈溢出错误。
如果扩展堆栈时虚拟机无法请求足够的内存空间,则会抛出OutOfMemoryError。