内存溢出

内存溢出和内存泄漏

浪尽此生 提交于 2020-02-13 03:11:52
内存溢出和内存泄漏 一、内存溢出和内存泄露概述 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory! 二、内存泄漏分4类 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。 4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月

内存溢出异常

孤街浪徒 提交于 2020-02-13 01:27:59
JVM参数 -Xms:初始堆大小,默认为物理内存的1/64(<1GB),默认空余堆内存(MinHeapFreeRatio)小于40%时     JVM就会增大堆大小直到-Xmx的最大限制。 -Xmx:最大堆大小,默认空余堆内存(MaxHeapFreeRatio)大于70%时JVM会减少堆大小直到 -Xms的最小限制。     注:初始堆大小和最大堆大小设置成相同的值是导致堆不能自动扩展。 -Xmn:新生代的内存空间大小,整个堆大小=新生代大小 + 老生代大小。在保证堆大小不变的情况下     增大新生代后,将会减小老生代大小。推荐配置为整个堆的3/8。 -Xss:每个线程的虚拟机栈大小。 -XX:+PrintGCDetails:打印GC详细日志 -XX:SurvivorRatio=8:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8     一个Survivor区占整个年轻代的1/10。 -XX:NewRatio:堆中新生代和老年代的容量比值,默认为2。即默认的新生代占堆内存的1/3,老年代占2/3。 -XX:+HeapDumpOnOutOfMemoryError:堆内存溢出时的“堆转储快照” -XX:PermSize:方法区(永久代)初始大小 -XX:MaxPermSize:最大方法区(永久代)大小 -XX

内存泄漏 和 内存溢出

别来无恙 提交于 2020-02-11 03:45:59
在计算机科学中, 内存泄漏(memory leak) 指由于疏忽或错误造成程序 未能释放已经不再使用的内存 的情况。内存泄漏并非指内存在物理上的消失,而是 应用程序 分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,严格意义上来说这是不准确的。    一般我们常说的内存泄漏 是指堆内存的泄漏 。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。 内存溢出 就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。 这是程序语言中的一个概念,典型的,在C语言中,在分配数组时为其分配的长度是1024,但往其中装入超过1024个数据时,由于C语言不会对数组操作进行越界检查,就会造成内存溢出错误 在程序员设计的代码中包含的

JVM内存划分

半世苍凉 提交于 2020-02-08 15:21:39
JVM中内存划分及其作用 运行时数据区 :这部分由5部分组成,分别为程序计数器、虚拟机栈、本地方法栈、堆、方法区;其中程序计数器、虚拟机栈、本地方法栈是线程独有的(即每个线程都有如此一个区域),而堆与方法区是线程共享的。下面我们再分别从存储内容、是否会发生内存溢出来介绍各个区域。 一、 程序计数器: 是当前线程所执行的字节码的行号指示器(记录当前线程执行到字节码文件的什么位置),没有规定任何内存溢出的情况;如果当前线程执行的是java方法,则计数器存储的是正在执行的字节码指令的地址,若当前线程执行的是本地方法(native修饰的方法),则计数器的值为空。 二、 虚拟机栈: 描述的是java方法执行的内存模型,每个方法在执行的时候就会创建一个栈帧,栈帧就是在虚拟机栈中的,栈帧中存储得有局部变量表、操作数栈、动态链接、方法出入口等信息。在该内存区域可能会出现内存溢出的情况,当栈是不可扩展的,当栈满时再往栈中存元素就会发生StackOverflowError异常;当栈是可扩展的,栈一直扩展直至虚拟机内存不够时将会发生OutOfMemoryError异常。 三、 本地方法栈: 与虚拟机栈是一样的,知识虚拟机栈针对的是java方法,而本地方法栈针对的是native方法。 四、 堆: 我们创建的对象基本都是存储在堆上,也有例外,这里举几个列子后期的优化会使对象实例可能存储在其他的区域

记一次内存溢出查找分析文档

我怕爱的太早我们不能终老 提交于 2020-02-05 09:26:22
内存溢出介绍。 内存溢出和内存泄漏的联系: 内存泄漏会最终导致内存溢出。 相同点:都会导致应用程序运行出现问题,性能下降或挂起。 不同点: 1 内存泄漏是导致内存溢出的原因之一,内存泄漏积累起来导致内存溢出。 2 内存泄漏可以通过完善代码来避免,内存溢出可以通过调整完善代码来避免,内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。 内存溢出 内存溢出 (out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory ; 比如申请了一个integer,但给它存了long才能存下的数。 产生原因 : 1内存中加载的数据量过于庞大,如一次从数据库取出过多的数据。(主要排查方式 导出,导入。以及排查未分页的查询:表现为对应web页面假死。) 2 JVM 启动参数内存值设定的过小。 3使用的第三方软件中的BUG。 内存泄漏 内存泄漏 (memory leak),是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏危害可以忽略,但内存泄漏堆积后果很严重,无论多少内存,迟早会被占光。Memory leak 最终会导致 out of memory。 内存泄漏对象特点: 1 这些对象是可达的,即在有向图中,存在通路可以与其相连; 2 这些对象是无用的,程序以后不会在使用这些对象。 对象满足这两个条件,可以判定位Java 中的内存泄漏

JVM内存结构

夙愿已清 提交于 2020-02-05 03:39:38
JVM 内存结构 程序计数器 虚拟机栈 本地方法栈 堆 方法区 一、程序计数器 1.1定义 Program Counter Register 程序计数器(寄存器) 1.2作用 在 java 程序执行前会将 java 文件编译为二进制字节码( jvm 指令) 计数器的作用就是记住下一条 jvm 指令的执行地址(储存在寄存器中) 1.3特点 线程私有 不会存在内存溢出 二、虚拟机栈 (JVM Stacks) 2.1虚拟机栈 每个线程运行时所需要的内存,称为虚拟机栈 栈的特点:先进后出,后进先出 每个栈是由多个栈帧 (Frame) 组成,对应每次方法调用时占用的内存 每个线程只能有一个活动栈帧,对应着当前正在执行的方法 使用虚拟机参数 -Xss【大小】 控制虚拟机栈的空间大小 2.2栈帧 每个方法运行时需要的内存 栈帧中包含的内容 参数 局部变量 返回地址 2.3注意 垃圾回收不涉及栈内存 在方法中的局部变量没有脱离方法的作用范围,则它是线程安全的 若局部变量引用了对象,并脱离了方法的作用范围,则需要考虑线程安全 2.4栈内存溢出 栈帧过多导致栈内存溢出 栈帧过大导致栈内存溢出 2.5线程运行诊断 2.5.1 cpu 占用过多 使用 top 命令定位进程号 使用 ps H -eo pid,tid,%cpu | grep 进程id 定位线程id 使用 jstack 进程id

280 内存溢出与内存泄露

夙愿已清 提交于 2020-02-01 20:57:05
1、内存溢出 一种程序运行出现的错误 当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误 2、内存泄露 占用的内存没有及时释放 内存泄露积累多了就容易导致内存溢出 常见的内存泄露: 意外的全局变量 没有及时清理的计时器或回调函数 闭包 02_内存溢出与内存泄露 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>02_内存溢出与内存泄露</title> </head> <body> <!-- 1. 内存溢出 * 一种程序运行出现的错误 * 当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误 2. 内存泄露 * 占用的内存没有及时释放 * 内存泄露积累多了就容易导致内存溢出 * 常见的内存泄露: * 意外的全局变量 * 没有及时清理的计时器或回调函数 * 闭包 --> <script type="text/javascript"> // 1. 内存溢出 var obj = {} for (var i = 0; i < 10000; i++) { obj[i] = new Array(10000000) console.log('-----') } // 2. 内存泄露 // 意外的全局变量 function fn() { a = new Array(10000000)

JVM探秘:MAT分析内存溢出

◇◆丶佛笑我妖孽 提交于 2020-01-29 15:13:55
本系列笔记主要基于《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》,是这本书的读书笔记。 MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory Analyzer Tool,用来帮助分析内存泄漏和减少内存消耗。使用MAT分析Java堆快照,可以快速计算出对象的保留大小(Retained Sizes),查找到阻止对象被回收的原因,MAT会自动生成一个包含内存泄漏疑点的报告。 MAT可以从Eclipse网站下载: http://www.eclipse.org/mat/ 生成Dump 使用MAT分析的是Heap Dump,也就是堆内存快照,生成快照有以下几种方式: 使用虚拟机参数-XX:+HeapDumpOnOutOfMemoryError,溢出时自动生成快照。 使用jmap命令,jmap -dump:format=b,file=${dir}/jmap.hprof pid 使用MAT导出本地java进程的内存快照,File->Acquire Heap Dump->选择要dump的java进程就可以了。 MAT的使用 生成完dump之后,可以用MAT打开dump出来的快照文件,File -> Open Heap Dump,对dump文件进行分析,生成一个Overview视图: 首先会列出堆内存的大小,有多少个类,有多少个对象,以及多少个类加载器。

内存泄漏和内存溢出详解

瘦欲@ 提交于 2020-01-28 08:29:19
内存泄漏(Memory Leak) 概念 程序已动态申请的堆内存,由于某种原因程序未释放或无法释放,造成程序内存的浪费,导致系统运行速度减慢甚至系统崩溃等严重后果。 内存泄漏的根本原因是: 长生命周期的对象,持有短生命周期对象的引用 ,尽管短生命周期的对象已经不再需要,单因为长生命周期的对象持有它的引用而导致不能被GC回收。 发生条件 内存泄漏必须满足以下两个条件 对象是可达的。即在有向图中,存在通道达到该对象,GC不会回收 对象是无用的。即程序以后不会再使用该对象 发生场景 静态集合类引起内存泄漏 HashMap、Vactor等集合的使用最容易出现内存泄漏。因为这些集合属于静态集合,这些静态变量的生命周期和应用程序一致,他们所引用的所有Object对象都不能被释放,因为这些对象还一直被Vector引用着 Static Vector v = new Vector ( 10 ) ; for ( int i = 1 ; i < 100 ; i ++ ) { Object o = new Object ( ) ; //每次创建新的对象 v . add ( o ) ; o = null ; //将对象添加到集合后将对象的引用置空 } //因为对象的引用置空之后,JVM已经失去的使用该对象的价值,本应该被GC清除,但是在vector集合中还存在着此对象的引用,导致没能顺利清除

jvisualvm定位JVM内存溢出,死锁,分析GC日志

倖福魔咒の 提交于 2020-01-24 06:47:34
OOM定位 创造一个会OutOfMemoryError的程序 import java . util . LinkedList ; import java . util . List ; public class OutOfMemoryDump { /** * JVM 参数 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Volumes/mac */ public static void main ( String [ ] args ) { List < Byte [ ] > bytes = new LinkedList < > ( ) ; while ( true ) { Byte [ ] byteNew = new Byte [ 1024 ] ; bytes . add ( byteNew ) ; } } } 运行时添加虚拟机运行参数: - Xms10m - Xmx10m - XX : + PrintGCDetails - XX : + HeapDumpOnOutOfMemoryError - XX : HeapDumpPath = / Volumes / mac / oomdump . dump 然后可以在/Volumes/mac