内存溢出、内存泄露和FULL GC
内存溢出和内存泄露
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
比如:内存中加载的数据量过于庞大,如一次从数据库取出过多数据;集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;代码中存在死循环或循环产生过多重复的对象实体等。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,故发生内存泄露。
比如:静态集合类引起内存泄露,像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着;当集合里面的对象属性被修改后,再调用remove()方法时不起作用;比如一个应用中使用多到监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。
两者间的联系:
内存泄露会最终会导致内存溢出。
相同点:都会导致应用程序运行出现问题,性能下降或挂起。
不同点:
1) 内存泄露是导致内存溢出的原因之一,内存泄露积累起来将导致内存溢出。
2) 内存泄露可以通过完善代码来避免,内存溢出可以通过调整配置来减少发生频率,但无法彻底避免
JVM出现Full GC的情况
从新生代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的,Major GC的速度一般会比Minor GC慢10倍以上。
1、System.gc()方法的调用
程序员通过函数调用的形式,让JVM进行一次full gc的操作。尽量避免人工去进行full gc,最好让JVM自己去回收。
2、老年代空间不足
老年代空间的对象有两种形式,一种是有新生代满足minor gc次数后进入到老年代;另一种是创建了大的对象、大的数组,不经过新生代直接到老年代的形式。当老年代空间不足是就会触发full gc的情况。
不要创建过大的对象及数组,让对象在新生代中回收可以解决这种情况。
3、当新生代中要转移到老年代中的对象的大小低于老年代的剩余空间时
Hotspot为了避免由于新生代对象晋升到老年代导致老年代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到老年代的平均大小大于老年代的剩余空间,那么就直接触发Full GC。
4、方法区空间不足
运行时数据区域中的方法区用来存放类的信息、常量、静态变量等数据,当系统中要加载的类、反射的类和调用的方法较多时可能会被占满,在未配置为采用CMS GC的情况下也会执行Full GC。
可增大方法区空间或转为使用CMS GC。
5、CMS GC(Concurrent Mark Sweep GC)时出现promotion failed和concurrent mode failure
promotion failed是在进行Minor GC时,survivor space放不下、对象只能放入老年代,而此时老年代也放不下造成的;concurrent mode failure是在执行CMS GC的过程中同时有对象要放入老年代,而此时老年代空间不足造成的
可以增大survivor空间、老年代空间或调低触发并发GC的比例。
6、堆中分配很大的对象
这里的大对象是指需要大量连续内存空间的java对象,例如很长的数组,此种对象会直接进入老年代,而老年代虽然有很大的剩余空间,但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发JVM进行Full GC。
可通过配置CMS垃圾收集UseCMSCompactAtFullCollection开关参数。
总结:
Full GC可以清除老年代的垃圾本质上是好的行为,但是如果Full GC发生的频率高了,就会影响性能。同时,Full GC频繁发生,意味着你的内存分配机制存在问题,也许是内存泄露,有大量内存垃圾不断在老年代产生;也许是你的大对象(缓存)过多;也有可能是你的参数设置不好,minor GC清理不掉内存,导致每次minor GC都会触发Full GC;还有可能是你的老年代大小参数设置错误,老年代过小等等原因,合理排查处理才能最优化自己的代码。
内存溢出、内存泄露和FULL GC相关推荐
- JavaScript 内存溢出,内存泄漏
内存 内存(Memory)是计算机的重要部件之一,也称内存储器和主存储器,它用于暂时存放CPU中的运算数据,与硬盘等外部存储器交换的数据.它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存 ...
- java 内存溢出 内存泄露_java 内存泄露、内存溢出、内存不足
内存泄露 什么是内存泄露? 在维基百科上的定义如图: 中文意思就是一个对象在内存中,而程序无法获取此对象,于是不能释放该对象所占用的内存. 百度百科上的定义如图: OWASP上的定义: 开发者无法释放 ...
- java 内存溢出 内存泄露_JVM——内存泄漏与内存溢出
1.内存溢出 1.1 什么是Java的内存溢出? 在Java程序运行的过程中,经常会碰到以下错误:java.lang.OutOfMemoryError. 通俗讲,内存溢出是指程序在申请内存时,没有足够 ...
- 我的世界java内存不足_[菜鸟级]简单解决内存溢出内存不足、卡机问题(可当启动器使用)...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 好吧,该死的度娘破坏了格式,下面才是整理好格式的版本: ================================================= ...
- Spark读取HDFS上的Snappy压缩文件所导致的内存溢出问题 java.lang.OutOfMemoryError: GC overhead limit exceeded
报错java.lang.OutOfMemoryError: GC overhead limit exceeded HDFS上有一些每天增长的文件,使用Snappy压缩,突然某天OOM了 1.原因: 因 ...
- Java内存泄露和内存溢出、JVM命令行工具、.JDK可视化工具、Java Class文件
1.Java内存泄露和内存溢出对比 1.1 Java 内存泄露 内存泄露是指一个不再被程序使用的对象或变量还在内存中占用空间. 1.1.1判断内存空间是否符合垃圾回收的标准 在Java语言中,判断一个 ...
- java 溢出与泄露_Java内存溢出与栈溢出
一.背景知识 1.JVM体系结构 2.JVM运行时数据区 3.JVM内存模型 JVM运行时内存 = 共享内存区 + 线程内存区 3-1.共享内存区 共享内存区 = 持久带 + 堆 持久带 = 方法区 ...
- 内存泄露与内存溢出的区别及解决方法
内存溢出与泄露的区别 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的 ...
- C++内存机制中内存泄露、内存溢出、内存越界和内存泄漏原因分析
在用C++做底层驱动时,经常会遇到内存不足的警告,往往是因为内存出现溢出.泄露或者越界等原因. 内存溢出(out of memory) 是指程序在申请内存时,没有足够的内存空间供其使用. 内存泄漏(m ...
- 内存溢出和内存泄漏的定义,产生原因以及解决方法(面试经验总结)
一.定义(概念与区别) 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请 了一个integer,但给它存了long才能存 ...
最新文章
- Ext.widgets-Button,SplitButton,CycleButton
- java数组实验报告_Java实验一实验报告
- php 聚类算法,科学网—matlab-聚类算法笔记 - 孙月芳的博文
- 关于工业交换机技术的简单总结
- 时间序列模式识别_空气质量传感器数据的时间序列模式识别
- Handler的一个图片轮播程序
- 惊艳!28岁就任副教授,年纪轻轻已是博导、院长
- 余弦信号频谱表达式_信号傅里叶变换系列文章(1):傅里叶级数、傅里叶系数以及傅里叶变换...
- Java多线程学习三十一:ThreadLocal 是用来解决共享资源的多线程访问的问题吗?
- as与asp.net通信
- 从外行到外包,从手工测试到知名互联大厂测开 我经历了我这个年龄段不该经历的事情...
- 【夏虫语冰】visio2013安装出错,您输入的产品密钥无法在此计算机上使用,错误25004
- 招生报名小程序开发笔记二:功能需求设计
- ISP 因特网服务提供商
- 南航C语言答案,2009-2011南航复试题(回忆版) 予人玫瑰,手有余香
- 卡刷刷机包出现 Error 7
- React-Native: bios打开VT-x选项
- Layaverse掌舵人谢成鸿在上海静安国际设计节的主题分享
- Promox VE(PVE) 连接wifi配置
- c语言已知加速度求位移速度,已知初速度,加速度,时间,求位移