内存溢出

Java-JVM OutOfMemory 情况(JDK8)

五迷三道 提交于 2019-11-26 14:57:30
JVM 运行时内存结构(Run-Time Data Areas) 内存溢出分为两大类:OutOfMemoryError 和 StackOverflowError。 一、HeapOomError (JVM 堆内存溢出) -Xms:初始值 -Xmx:最大值 -Xmn:最小值 public static void main(String[] args) { List<byte[]> list = new ArrayList<>(); int i = 0; while (true) { list.add(new byte[8 * 1024 * 1024]); System.out.println(++i); } } 二、MemoryLeakOomError(JVM 堆内存泄漏) Java 语言中是指,未使用的对象仍然在 JVM 堆空间中存在,任保留着引用,无法被 GC。不停的堆积最终触发堆内存溢出。 三、OverheadLimitOomError(垃圾回收超时内存溢出) # JDK6 新增错误类型。当 GC 为释放很小空间占用大量时间时抛出。 # (超过 98% 以上的时间去释放小于 2% 的堆空间) java.lang.OutOfMemoryError: GC overhead limit exceeded # 关闭上述检查功能,通常不治本,最终会 Java heap space

开发:内存泄漏&amp;内存溢出

邮差的信 提交于 2019-11-26 14:19:23
一、内存泄漏( memory leak ) 1.内存泄漏定义: 申请的内存空间没有被正确释放,导致后续程序里这块内存被永远占用(不可达/无法访问),而且指向这块内存空间的指针不再存在时,这块内存也就永远不可达了,内存空间就这么一点点被蚕食 2.内存泄漏的后果? 少量的内存泄漏可能不会对程序产生影响,但是随着量的累计,程序的性能会逐渐降低。 更糟的是,泄漏的程序可能会用掉太多内存,以致另一个程序失败,而使用户无从查找问题的真正根源。 3.内存泄漏的种类: (1)堆内存泄漏 (Heap leak)。程序员按需动态申请内存时通过malloc,realloc new从堆中分配得到内存,完成后必须通过调用对应的 free或者delete 删掉。如果没有释放掉,那么这块内存会无法使用,就会产生Heap Leak. (2)系统资源泄露(Resource Leak)。主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。 4.使用C/C++语言开发的软件在运行时,出现内存泄漏。可以使用以下三种方式,进行检查排除: (1)使用工具软件BoundsChecker,BoundsChecker是一个运行时错误检测工具,它主要定位程序运行时期发生的各种错误。 (2) 调试运行DEBUG版程序

~关于内存溢出的一些想法(Android)

笑着哭i 提交于 2019-11-26 11:40:37
最近看了一些资料,对android的程序的内存有一些想法,我提出来,请大家指正,目的是抛砖引玉。 首先提几个有意思的问题: 1,如果activty destroy掉的话,那么这个activty内的view所引用的bitmap回收掉了吗? 2,如果activty destroy掉的话,那么这个acitity所占用的内存被GC回收了吗? 我觉的一个程序中占用内存的地方有两个方面:一个是bimap。一个是context(activity). 一,先说bitmap:这个引起内存溢出比较普遍。有2个解决方法: 1,用bitmap的recycle方法,在我们确认这个bitmap不被使用的时候调用这个方法可以直接把bitmap所占用的内存回收掉。不过这个方法的使用的弱点是:如果这个方法调用的时间点不合理,很容易引起 use a recycle bitmap的异常。 2,用弱引用来管理你的bitmap。具体方法,是把程序里所有的bitmap对象放到一个静态的hasmap中,用弱引用来保 存。如果再用到这个bitmap的时候,根据相应的key直接取出来,相当于一个高速缓存池。保证这个程序不会重复创建过多的bitmap对象。此外弱引用对象可以在系统内存不足的时候自动被系统回收。 3,设置压缩参数,对bitmap进行压缩。以及用反射设置一下bitmap所占内存的位置(据说可以不算到heap中)。 二,

JVM集训-----内存结构

旧街凉风 提交于 2019-11-26 08:59:32
摘自: https://www.cnblogs.com/lowerma/p/11929041.html JVM集训-----内存结构 一、程序计数器/PC寄存器 ( Program Counter Registe )   用于 保存当前正在执行的程序的内存地址(下一条jvm指令的执行地址) ,由于Java是支持多线程执行的,所以程序执行的轨迹不可能一直都是线性执行。当有多个线程交叉执行时,被中断的线程的程序当前执行到哪条内存地址必然要保存下来,以便用于被中断的线程恢复执行时再按照被中断时的指令地址继续执行下去。为了线程切换后能恢复到正确的执行位置, 每个线程都需要有一个独立的程序计数器 ,各个线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存,是线程安全的。    特点:1.线程私有 2.不会存在内存溢出 二、虚拟机栈(Java Virtual Machine Stack)    虚拟机栈总是与线程关联在一起的, 每当创建一个线程,JVM就会为该线程创建对应的虚拟机栈 ,在这个 虚拟机栈中又会包含多个栈帧(Stack Frame) ,这些栈帧是与每个方法关联起来的, 每运行一个方法就创建一个栈帧 ,每个栈帧会含有一些局部变量、操作栈和方法返回值等信息。每当一个方法执行完成时,该栈帧就会弹出栈帧的元素作为这个方法的返回值,并且清除这个栈帧,

ASP在ACCESS中模糊查询&quot;内存溢出&quot;的解决方法

守給你的承諾、 提交于 2019-11-26 05:00:50
今天在日常维护一个网站时,发现该网站的留言程序没有经过严格的验证过滤,导致了将近十万条垃圾数据。而其中又不乏重要信息,需要清理数据,以及增加更为严格的验证措施。 而通过在数据库中直接删除又不太科学,会误删很多重要信息。 通过 模糊查询语句: select * from Feedback where Comments like '%http%' 结果:“内存溢出” 经过不断的搜索,找出了问题的主要原因: asp 中用 LIKE 关键字查询日文符号就会出错,比如说Chr(-23075),提示内存溢出。 如果数据表中的数据包含日文或者一些特殊非简体汉字符号,也会出现内存溢出的错误。 而网上说,上述问题已经得到微软动力营的微软工程师确认,为产品的 BUG,无法解决。唯一的办法就是将整个数据库中的数据编码为ANSI 文本格式,然后保存。显示的时候再DECODE。 无解,只有按上面所说,进行字段转换保存到另外一个新字段中,然后再进行清理操作。面对这个超标数据真是困难。 EncodeString 函数进行字符转义 Function EncodeString(strWords) Dim i As Long Dim strEncodeWords For i = 1 To Len(strWords) strEncodeWords = strEncodeWords & CStr(Asc(Mid

JVM参数调优(一)

时间秒杀一切 提交于 2019-11-26 04:58:20
过了段时间没写日志了,今天有空写下,下面写的是jvm相关的概念及调优,开发的朋友平时可以读读其他的书,比如散文方面,为人处世方面的。 1、-XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 -Xms 堆初始值 -Xmx 堆最大可用值 -Xmn 新生代堆最大可用值 -XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例. -XX:NewRatio 配置新生代与老年代占比 1:2 含以-XX:SurvivorRatio=eden/from=den/to 总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等, 这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。 -XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例. 2、虚拟机栈溢出 错误原因: java.lang.StackOverflowError 栈内存溢出 栈溢出 产生于递归调用,循环遍历是不会的,但是循环方法里面产生递归调用, 也会发生栈溢出。 解决办法:设置线程最大调用深度 -Xss5m 设置最大调用深度 3、内存溢出与内存泄漏区别 Java内存泄漏就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源(内存资源耗尽);

Java 内存溢出问题总结

倖福魔咒の 提交于 2019-11-26 02:29:39
1. Java heap space -> 超大对象, 通常是大数组 (查询结果过大, 没有限制就放入数组); -> 内存泄漏, 资源没有回收; 解决: -Xmx 参数调高 JVM 堆内存空间, 限流, 做好资源回收; 2. Permgen space or Metaspace 原因: class数量过多; 解决: -XX:MaxPermSize -XX:MaxMetaspaceSize 3. Unable to create new native thread 原因: java创建的线程数 超过操作系统的线程总数; 解决: -Xss 参数减少线程栈的大小 or ulimit -u xxx 调整最大线程数限制 来源: https://www.cnblogs.com/ruili07/p/11315380.html

内存泄漏和内存溢出

ぃ、小莉子 提交于 2019-11-25 22:39:45
背景:当内存中存储的数据越来越多,而GC又没有可以回收的数据,造成OOM GC机制的两种算法: 引用计数算法:对于每个数据的引用,进行计数,增加引用则加1,溢出引用则减1,GC扫码到该对象并且引用数量为0时就会被回收 如果两个对象,有一个属性互相保存对方的引用,此时将两个对象的引用置为null,但是相互对象内部属性还保留了一个引用 此时两个对象计数引用数量都为1,不能被回收,但其实两个对象都被置为了null,希望被回收,这样就出现了问题 所以引用计数算法回收机制不靠谱 可达性分析算法: 从GC ROOS作为起点,整个可以连通的为存活对象,连通不了的对象为可回收对象 内存泄漏:内存泄漏最终导致的内存溢出,为强引用导致 原因:GC不能回收垃圾数据,造成内存泄漏. 对象的引用: 强引用,软引用,弱引用,虚引用 强引用:Object obj = new Object(); 对于强引用,GC永远都不会回收,即使造成OOM也不会被回收 作为成员变量:作为强引用,置为null,可以被回收 作为局部变量:方法执行完成后,可以被回收 软引用:SoftReference<T> ref = new SoftReference(obj);或SoftReference<T> ref = new SoftReference(obj,referenceQueue); 对于软引用,GC在内存不足的时候