zoukankan      html  css  js  c++  java
  • 内存泄露

    内存泄露是指变量或者对象在程序中不需要使用,但它还占用着内存空间

    一般内存泄露发生的情况有如下两种:

    1.在堆中申请的内存没有释放

    2.对象已经不需要使用,但它还占用内存

    C#和Java中有垃圾回收器,所以不存在第一种情况,而C++不存在垃圾回收机制,两种情况都存在。

    但是C#,Java中也不是完全依赖于系统回收的,比如对于大型资源,数据库连接,网络连接和IO连接等,它也提供了手动的方式,比如Open()和Close(),Open创建一个连接并分配内存,Close方法关闭连接并释放内存。

    在C#,Java中,引起内存泄露的原因还很多:

    1.静态集合类,当数据被存放到静态集合类中,他们的生命周期就与程序一致,那么在程序结束之前就不能被释放,造成内存泄露。

    2.上面所说的各种连接,数据库连接,网络连接和IO连接等,如果没有调用Close方法,会造成内存泄露

    3.各种监听器。一个程序中往往用到很多监听器,如果在监听结束后还没有关闭监听器(Close方法),会造成内存泄露

    4.变量不合理的作用域,例如:

    class Test
    {
        private string x;
        public void save()
        {
            x=get();//从网络获取数据保存到x
            save(x);//将x保存到文件中
        }
    }
    变量不合理的作用域

    上面的x在函数结束后如果再不会被用到,而他的生命周期和程序一样,会造成内存泄露

    5.单例模式也会造成内存泄露,例如:

        class class1
        { }
        class class2
        {
            private class1 c1;
            private static class2 c2=new class2(new class1());
            private class2(class1 c1)
            {
                this.c1 = c1;
            }
            public class2 get()
            {
                return c2;
            }
        }
    单例模式的内存泄露

    class2中存在class1的引用,因为单例对象是以静态的方式被存储,所以生命周期是和程序一样,但是单例对象对Class1的引用有一个引用,所以Class1的对象不能被回收,造成内存泄露。

  • 相关阅读:
    操作系统8:文件系统
    操作系统7:内存管理
    操作系统6:死锁
    操作系统5:进程同步
    操作系统3:CPU调度
    操作系统2:进程
    操作系统1:操作系统结构
    计算机组成:CPU
    计算机组成:数制与运算
    计算机组成:输入输出系统
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4432459.html
Copyright © 2011-2022 走看看