什么是内存泄漏?有什么危害

1、什么是内存泄漏

    内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对象申请一块内存空间,但当我们使用完了却没有归系统(delete),导致这个不使用的对象一直占据内存单元,造成系统将不能再把它分配给需要的程序。

    一次内存泄漏的危害可以忽略不计,但是内存泄漏堆积则后果很严重,无论多少内存,迟早会被占完,造成内存泄漏。

2、引起内存泄漏的原因

1、分配给程序的内存忘记回收;

    这个是不应该发生的事情,但也是代码中常见的问题。分配的内存用完之后,就一定要回收,避免造成内存泄漏。

2、程序代码有问题,造成系统没有办法回收;

    Temp1 = new BYTE[100];
    Temp2 = new BYTE[100];
    Temp2 = Temp1;

    这样,Temp2的内存地址就丢掉了,而且永远都找不回了,这个时候Temp2的内存空间想回收都 没有办法。

3、某些API函数操作不正确,造成内存泄漏;

3、内存泄漏的危害

      1、频繁GC:系统分配给每个应用的内存资源都是有限的,内存泄漏导致其他组件可用的内存变少后,一方面会使得GC的频率加剧,再发生GC的时候,所有进程都必须等待,GC的频率越高,用户越容易感应到卡顿。另一方面内存变少,可能使得系统额外分配给该对象一些内存,而影响整个系统的运行情况。

    2、导致程序运行崩溃:一旦内存不足以为某些对象分配所需要的空间,将会导致程序崩溃,造成体验差。

4、Java的垃圾回收机制GC

原文地址:https://blog.csdn.net/zy_jibai/article/details/80957169

     1、CG的作用:释放掉不可到达的对象的内存。

     2、不可达是个什么概念?

    首先我们要搞清楚Java的内存分区了,其中有两个非常重要的就是栈内存和堆内存

  • 堆内存存放创建的对象的内存
  • 栈内存存放指向对象的引用和普通数据类型

例如创建一个变量:String str1 = new String("test");

由此可以说明Java操作对象全部都是匿名操作。在创建之初,每一个堆内存中对象的内存,在栈中都会有一个值(引用)指向他,而有一部分值在我们使用完毕后会将引用置空,这就会有一些堆中的内存没有引用指向,又因为Java中对对象是匿名操作,所以对这些没有栈中内存存储的引用指向的对象称之为不可触及的对象。

工作原理

简单介绍一下GC的工作原理:

首先GC会扫描栈内存中的引用,然后会遍历堆内存中的引用,这样就会查找出内存中不可触及的对象,然后将其释放掉。

说到这里大家应该发现一个问题,GC回收的只是堆中的内存,而没有栈中的内存,这是因为栈中已分配的内存会随着哟个方法结束的时候释放掉,所以不用担心栈内存中会存在内存泄漏的问题。

PS:定义变量的时候,慎用static,例如静态的集合中的数据都不会被回收

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页