(1)内存泄漏和内存溢出

内存泄漏:分配出去的内存无法回收(不再使用的对象或者变量仍占内存空间),在Java中内存泄漏就是存在一些被分配的对象(可达的,却是无用的)无法被gc回收。

内存溢出:程序要求的内存超出了系统所能分配的范围(比如:栈满还入栈 出现上溢,栈空还出栈 出现下溢)

可以看出内存泄漏是内存溢出的一种诱因,但不是唯一因素。

(2)Java存在内存泄漏:

Java判断内存空间是否符合垃圾回收标准有两个:给对象赋null且不再使用;给对象赋新值,重新分配内存

内存泄漏的两种情况:一是堆中申请的内存没释放;二是对象已不再使用,但还在内存中保留着

Gc可以有效的解决第一种情况,但是无法保证情况二,所以Java存在的内存泄漏主要是第二种。

(3)内存泄露的几种场景:

  1. 长生命周期的对象持有短生命周期对象的引用,即静态集合类。例如:在static HashMap中缓存局部变量,且没清空,随时间的推移,这个map会越来越大,造成内存泄露。
  2. 变量不合理的作用域。
  3. 没有及时的将对象设置为null
  4. 各种连接没显示关闭。数据库连接、网络连接、IO连接,没显示的close,会造成很多对象无法回收。
  5. 监听器。释放对象时没有删除监听器。

(4)避免内存泄漏

  1. 尽早释放无用对象的引用
  2. 使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域
  3. 尽量少用静态变量,因为静态变量存放在永久代(方法区)
  4. 避免在循环中创建对象
  5. 开启大型文件或从数据库一次拿了太多的数据很容易造成内存溢出,所以在这些地方要大概计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。

 

(5)内存溢出:无法申请到足够的内存

  1. 堆内存溢出(outOfMemoryError:Javaheap space)堆中的内存是用来生成对象实例和数组的。堆内存(新生代老年代,新生代包括1个Eden2个survivor)。当生成新对象时,内存的申请过程如下:

a、jvm先尝试在eden区分配新建对象所需的内存;b、如果内存大小足够,申请结束,否则下一步;

c、jvm启动新生代GC,试图将eden区中不活跃的对象释放掉,释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;

d、Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;

e、 当OLD区空间不够时,JVM会在OLD区进行full GC;

f、full GC后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”

2.堆内存溢出(OutOfMemoryError)的例子:申请了很多内存,没释放

public class OOMTest{public static void main(String[] args){List list=new ArrayList();while(true){//申请大量内存,但是没有释放int[] temp=new int[1000];list.add(temp);}}
}或者
public class MemoryLeak {private String[] s = new String[1000];public static void main(String[] args) throws InterruptedException {Map<String,Object> m =new HashMap<String,Object>();int i =0;while(true){for(;i<10000;i++){MemoryLeak memoryLeak = new MemoryLeak();m.put(String.valueOf(i), memoryLeak);}}}
}

3.方法区内存溢出(outOfMemoryError:permgem space)方法区主要存放的是类信息、常量、静态变量等。所以如果程序加载的类过多,或者使用反射、gclib等这种动态代理生成类的技术,就可能导致该区发生内存溢出

while(true){

list.add(String.valueOf(i++).intern());

}

永久代的两个参数设置:PermSize, -XX:MaxPermSize

4、线程栈溢出(java.lang.StackOverflowError)线程栈时线程独有的一块内存结构,所以线程栈发生问题必定是某个线程运行时产生的错误。 一般线程栈溢出是由于递归太深或方法调用层级过多导致的。

public class StackOverflowTest {public static void main(String[] args) {int i =0;digui(i);}private static void digui(int i){//递归深度太大System.out.println(i++);String[] s = new String[50];digui(i);}}或者
public class SOFTest{...main(...){method();}public static void method(){//递归深度太大for(;;){method();}}
}

*内存泄漏和内存溢出相关推荐

  1. python会不会出现内存泄露_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

  2. 内存泄漏和内存溢出的关系和区别

    作者:不怕天黑_0819 链接:https://www.jianshu.com/p/61d34df7eabe 一.内存泄漏(memory leak) 1.内存泄漏是指程序中已动态分配的堆内存由于某种原 ...

  3. java 内存溢出 内存泄露_JVM——内存泄漏与内存溢出

    1.内存溢出 1.1 什么是Java的内存溢出? 在Java程序运行的过程中,经常会碰到以下错误:java.lang.OutOfMemoryError. 通俗讲,内存溢出是指程序在申请内存时,没有足够 ...

  4. 段错误、内存泄漏、内存溢出、堆溢出、栈溢出

    参考:内存泄漏.内存溢出.段错误.堆溢出.栈溢出 作者:焦木白 发布时间:2019-10-22 网址:https://blog.csdn.net/jiaomubai/article/details/1 ...

  5. java内存泄漏和内存溢出_Java和内存泄漏

    java内存泄漏和内存溢出 总览 术语"内存泄漏"在Java中的使用方式不同于在其他语言中使用的方式. 通用术语中的"内存泄漏"是什么意思,在Java中如何使用 ...

  6. python会内存泄漏吗_Python内存泄漏和内存溢出的解决方法

    Python内存泄漏和内存溢出的解决方法 发布时间:2020-10-30 23:08:34 来源:亿速云 阅读:92 作者:Leah 这篇文章将为大家详细讲解有关Python内存泄漏和内存溢出的解决方 ...

  7. python 内存溢出能捕获吗_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

  8. python内存泄漏解决方案_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

  9. 移动端测试=== 两个概念 内存泄漏 和 内存溢出 【转】

    关于内存在一块其实我并不是很想拿出来说,一般情况下内存这一块都是可优化的,可以通过硬件资源或者调整一些系统或者应用系统的参数配置来进行优化. 很多同僚问到了"内存泄漏"和" ...

  10. 透彻分析JAVA内存泄漏和内存溢出的区别

    JAVA内存泄漏和内存溢出的区别和联系 1.内存泄漏memory leak : 是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出. 2 ...

最新文章

  1. mysql.cnf utf8_mysql通过my.cnf修改默认字符集为utf-8的方法和注意事项
  2. [trouble shoot]atol和atoll
  3. java 循环标记_深入浅析Java 循环中标签的作用
  4. Win11关机后自动开机怎么办 Win11关机后自动开机的解决方法
  5. oracle锁表与解表
  6. python 自动下载文件_【Py大法系列--03】Python如何自动下载文件
  7. 物以类聚:对象也有生命
  8. 深度学习——loss函数的学习笔记(legacy)
  9. 利用docker-machine安装swarm
  10. 网关支付、银联代扣通道、快捷支付、银行卡支付分别是怎么样进行支付的?...
  11. 参考文献起止页码怎么写_参考文献起止页码格式
  12. 【多媒体】媒体的概念和分类
  13. c语言关于数组排序法和插入一个数的详细讲解
  14. MTK6737功能展示
  15. 防红域名生成的3种方法介绍
  16. python笔记更新(正则表达式)
  17. Spring Boot + Drools+模板引擎,优惠券的动态添加以及购物车结算
  18. 关于 input在 chrome 、IE浏览器中遇到的兼容性问题处理
  19. 网络技巧|远程桌面连接不上的多种解决方案!
  20. GBase 8a的产品简介

热门文章

  1. 云计算时代 甲骨文行将势弱?
  2. 虚拟机——windows安装VMware虚拟机
  3. MATLAB资源整理
  4. ibdata1导致mysql打不开_关于mysql:mysql文件ibdata1增长过大导致服务器无法写的问题...
  5. jQuery小项目之王者荣耀手风琴,有图片素材
  6. 病毒对信息社会的巨大影响
  7. 如果客户机同时得到多台dhcp服务器的ip地址_秘技,同时为三个女神装系统的方法...
  8. 十种免费网站访问分析工具
  9. win10 pro 使用远程桌面
  10. 卡巴斯基安装时提示有360 Antivirus Software,发生致命错误