精华内容
下载资源
问答
  • linux释放内存的命令

    万次阅读 2019-04-13 02:00:38
    Linux释放内存的命令:sync echo 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同的含义:0:不释放(系统默认值)1:释放页缓存2:释放dentries和inodes 3:释放所有缓存释放完内存...

    Linux释放内存的命令:
    sync
    echo 1 > /proc/sys/vm/drop_caches

    drop_caches
    的值可以是0-3之间的数字,代表不同的含义:
    0:不释放(系统默认值)
    1:释放页缓存
    2:释放dentriesinodes
    3
    :释放所有缓存

    释放完内存后改回去让系统重新自动分配内存。
    echo 0 >/proc/sys/vm/drop_caches

    free -m #
    看内存是否已经释放掉了。

    如果我们需要释放所有缓存,就输入下面的命令:
    echo 3 > /proc/sys/vm/drop_caches

    ######### Linux
    释放内存的相关知识 ###############

    Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP 间影响性能,例如当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。,此时就需 要执行释放内存(清理缓存)的操作了。

    Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作。但是在进行了大量文件操作之后,缓存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分 缓存已经用不到了。这个时候,我们难道只能眼睁睁的看着缓存把内存空间占据掉吗?所以,我们还是有必要来手动进行Linux下释放内存的操作,其实也就是 释放缓存的操作了。/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改 /proc中的文件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。要达到释 放缓存的目的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就 是不释放缓存。

    一般复制了文件后,可用内存会变少,都被cached占用了,这是linux为了提高文件读取效率的做法:为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer CachePage Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。"

    释放内存前先使用sync命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。

    [root@fcbu.com ~]# free -m
                 total       used       free     shared    buffers     cached
    Mem:
              7979       7897         82          0         30       3918
    -/ buffers/cache:
           3948       4031
    Swap:         4996        438       4558


    第一行用全局角度描述系统使用的内存状况:
    total 内存总数
    used 已经使用的内存数,一般情况这个值会比较大,因为这个值包括了cache 应用程序使用的内存
    free 空闲的内存数
    shared 多个进程共享的内存总额
    buffers 缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
    cached 缓存,用于已打开的文件

    第二行描述应用程序的内存使用:
    -buffers/cache 的内存数:used - buffers - cached
    buffers/cache
    的内存数:free buffers cached
    前个值表示-buffers/cache 应用程序使用的内存大小,used减去缓存值
    后个值表示 buffers/cache 所有可供应用程序使用的内存大小,free加上缓存值

    第三行表示swap的使用:
    used 已使用
    free 未使用 

    可用的内存=free memory buffers cached

    为什么free这么小,是否关闭应用后内存没有释放?
    但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值:-/ buffers/cache:       3948       4031 ,这才是系统可用的内存大小。

    实际项目中的经验告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。我觉得既然核心是可以快速清空buffercache,但核心并没有这样做(默认值是0),我们不应该随便去改变它。

    一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。当发生内存不足、应用获取不到可用内存、OOM 误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可 能只是把问题给暂时屏蔽了,所以说一般情况下linux都不用经常手动释放内存。

    向/proc/sys/vm/drop_caches中写入内容,会清理缓存。建议先执行sync(sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)。执行echo 1、2、3 至 /proc/sys/vm/drop_caches, 达到不同的清理目的。

     

     



     

     

    展开全文
  • 家里要来客人了,我们要给客人们泡茶。如果规定只能在确定来几位客人之前就把茶泡好,这就会显得很...所以,为了解决这个问题,我们需要能够在程序运行时根据实际情况申请内存空间。 在C++中,允许我们在程序运行时根

    家里要来客人了,我们要给客人们泡茶。如果规定只能在确定来几位客人之前就把茶泡好,这就会显得很尴尬:茶泡多了会造成浪费,泡少了怕怠慢了客人。所以,最好的方法就是等知道了来几位客人再泡茶,来几位客人就泡几杯茶。

    然而,我们在使用数组的时候也会面临这种尴尬:数组的存储空间必须在程序运行前申请,即数组的大小在编译前必须是已知的常量表达式。空间申请得太大会造成浪费,空间申请得太小会造成数据溢出而使得程序异常。所以,为了解决这个问题,我们需要能够在程序运行时根据实际情况申请内存空间.

    申请堆内存空间

    在C++中,允许我们在程序运行时根据自己的需要申请一定的内存空间,我们把它称为堆内存(Heap)空间
    如何获得堆内存空间
    我们用操作符new来申请堆内存空间,其语法格式为:

    new 数据类型[表达式];
    

    其中,表达式可以是一个整型正常量,也可以是一个有确定值的整型正变量,其作用类似声明数组时的元素个数,所以两旁的中括号不可省略。如果我们只申请一个变量的空间,则该表达式可以被省略,即写作:

    new 数据类型;
    

    使用new操作符后,会返回一个对应数据类型的指针,该指针指向了空间的首元素。所以,我们在使用new操作符之前需要声明一个对应类型的指针,来接受它的返回值。如下面程序段:

    int *iptr;//声明一个指针
    int size;//声明整型变量,用于输入申请空间的大小
    cin >>size;//输入一个正整数
    iptr=new int[size];//申请堆内存空间,接受new的返回值
    

    我们又知道,数组名和指向数组首元素的指针是等价的。所以,对于iptr我们可以认为是一个整型数组。于是,我们实现了在程序运行时,根据实际情况来申请内存空间。

    释放内存

    当一个程序运行完毕之后,它所使用的数据就不再需要。由于内存是有限的,所以它原来占据的内存空间也应该释放给别的程序使用。对于普通变量和数组,在程序结束运行以后,系统会自动将它们的空间回收。然而对于我们自己分配的堆内存空间,大多数系统都不会将它们回收。如果我们不人为地对它们进行回收,只“借”不“还”,那么系统资源就会枯竭,电脑的运行速度就会越来越慢,直至整个系统崩溃。我们把这种只申请空间不释放空间的情况称为内存泄露(Memory Leak)

    确认申请的堆内存空间不再使用后,我们用delete操作符来释放堆内存空间,其语法格式为:

    delete [] 指向堆内存首元素的指针;
    

    如果申请的是一个堆内存变量,则delete后的[]可以省略;如果申请的是一个堆内存数组,则该[]不能省略,否则还是会出现内存泄露。另外,我们也不难发现,delete后的指针就是通过new获得的指针,如果该指针的数据被修改或丢失,也可能造成内存泄露。

    下面我们来看一段程序,实践堆内存的申请和回收:(程序8.7)

    #include “iostream.h”

    int main()

    {

    int size;

    float sum=0;

    int *heapArray;

    cout <<“请输入元素个数:”;

    cin >>size;

    heapArray=new int[size];

    cout <<“请输入各元素:” <<endl;

    for (int i=0;i<size;i++)

    {

      cin >>heapArray[i];
    
      sum=sum+heapArray[i];
    

    }

    cout <<“这些数的平均值为” <<sum/size <<endl;

    delete [] heapArray;

    return 0;

    }

    运行结果:

    请输入元素个数:5

    请输入各元素:

    1 3 4 6 8

    这些数的平均值为4.4

    可见,申请的堆内存数组在使用上和一般的数组并无差异。我们需要记住的是,申请了资源用完了就一定要释放,这是程序员的好习惯,也是一种责任。[若堆区数组中保存的数据也是开辟在堆区内存的,在释放资源时,要把堆内存数组中的数据逐个释放]

    那么,我们能不能来申请一个二维的堆内存数组呢?事实上,new 数据类型[表达式][表达式]的写法是不允许的。所以,如果有需要,最简单的方法就是用一个一维数组来代替一个二维数组。这就是上一章最后一小段文字的意义所在。

    原文:http://see.xidian.edu.cn/cpp/biancheng/view/51.html

    展开全文
  • 浅谈C++跨模块释放内存

    千次阅读 2020-05-09 20:12:07
    浅谈C++跨模块释放内存一, MT改MD二, DLL提供释放接口三, 使用进程堆申请内存      在开发主程序和动态库时,首要原则就是:避免跨模块申请和释放内存。这一点,我们在很多开源库或者...

         在开发主程序和动态库时,首要原则就是:避免跨模块申请和释放内存。这一点,我们在很多开源库或者平常项目中也都碰到过,对于动态库中的堆内存申请与释放,动态库总是会提供两个接口分别实现new和delete操作,而不会让调用方自己去操作。但有时候如果违背了这个原则呢,在linux平台上不会存在这样的忧虑,因为在linux下,每个进程只有一个heap,在任何一个动态库模块so中通过new或者malloc来分配内存的时候都是从这个唯一的heap中分配的,那么自然你在其它随便什么地方释放都是没问题的。这个模型是简单的。而windows下就变得复杂了,下面主要介绍一下windows下的主程序和dll之间跨模块内存释放的问题。

         windows允许一个进程中有多个heap,那么当需要在堆上分配内存时就要指明在哪个heap上分配,win32提供了HeapAlloc函数可以在指定的堆上分配内存。这样的设计虽然比较灵活,但是问题在于,每次分配内存的时候就必须要显式的指定一个heap,对于crt中的new/malloc,显然需要特殊处理。那么如何处理就取决于crt的实现了。vc的crt是创建了一个单独的heap,叫做__crtheap,它对于用户是看不见的,但是在new/malloc的实现中,都是用HeapAlloc在这个__crtheap上分配的,也就是说malloc(size)基本上可以认为等同于HeapAlloc(__crtheap, size)(当然实际上crt内部还要维护一些内存管理的数据结构,所以并不是每次malloc都必然会触发HeapAlloc),这样new/malloc就和windows的heap机制吻合了。

         如果一个进程需要动态库支持,系统在加载dll的时候,在dll的启动代码_DllMainCRTStartup中,会创建这个__crtheap,所以理论上有多少个dll,就有多少个__crtheap。最后主进程的mainCRTStartup 中还会创建一个为主进程服务的__crtheap。(由于顺序总是先加载dll,然后才启动main进程,所以你可以看到各个dll的__crtheap地址比较小,而主进程的__crtheap比较大,当然排在最前面的堆是每个进程的主heap。)

         由此可见,对于crt来说,由于每个dll都有自己的heap,所以每个dll通过new/malloc分配的内存都是在自己dll内部的那个heap上用HeapAlloc来分配的,而如果你想在其它模块中释放,那么在释放的时候HeapFree就会失败了,因为各个模块的__crtheap是不一样的。

         那么如果有非要用到跨模块释放的场景呢,可以使用以下几种方式来解决:

    一, MT改MD

         一个进程的地址空间是由一个可执行模块和多个DLL模块构成的,这些模块中,有些可能会链接到C/C++运行库的静态版本,有些可能会链接到C/C++运行库的DLL版本。当使用运行库的DLL版本时,由于dll加载到进程中只会在地址空间中存有一份,因此共用的是同一个堆。所以将可执行模块和DLL模块统一修改为MD编译,则可以直接实现跨模块之间的内存申请和释放,而不会存在任何问题。
         更多MT和MD,以及DLL和进程地址空间的知识可以参见博客:DLL和进程的地址空间

    二, DLL提供释放接口

         DLL提供统一的对外接口,供外部模块(可执行模块或其它DLL模块)调用,由该DLL内部来进行内存的释放。简单实现如下:

    void __stdcall MyFree(void *ptr)
    {
    	if (ptr)
    	{
    		free(ptr);
    	}
    }
    void __stdcall MyDelete(void *ptr)
    {
    	if (ptr)
    	{
    		delete ptr;
    	}
    }
    void  __stdcall MyDeleteArray(void *ptr)
    {
    	if (ptr)
    	{
    		delete[] ptr;
    	}
    }
    
    

    三, 使用进程堆申请内存

         在一个进程中,可执行模块和DLL模块都属于同一个进程地址空间,而每个进程又都有一个为主进程服务的堆(一般也称为进程的默认堆),当我们需要跨模块进行内存申请和释放时,可以在进程主堆上进行申请,同样地,释放时,也直接在进程主堆上进行释放,这样就可以不用考虑MT导致的跨进程释放的问题。API的使用此处不讲解,直接附上简易代码:
    在DLL中:

    void* __stdcall Test(int *len)
    {
    	void* pData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 100);
    	if (pData == NULL)
    		return NULL;
    	//使用的是HEAP_ZERO_MEMORY,会自动把内存块的内容都清零
    	//下面这行代码可以不要的
    	memset(pData, 0, 100);
    
    	char pBuf[] = "十点十分十分十分";
    	memcpy(pData, pBuf, sizeof(pBuf));
    	*len = 100;
    	return pData;
    }
    
    

    在可执行模块中:

    int main()
    {
    	HMODULE hLib = LoadLibraryA("Dll1.dll");
    	if (nullptr == hLib)
    	{
    		std::cout << "LoadLibraryA fail, error:" << GetLastError() << std::endl;
    		return 0;
    	}
    
    	Fun fun = (Fun)GetProcAddress(hLib, "Test");
    	if (nullptr == fun)
    	{
    		std::cout << "GetProcAddress fail, error:" << GetLastError() << std::endl;
    		return 0;
    	}
    
    	int nLen = 0;
    	char *pData = (char*)fun(&nLen);
    
    	std::string strTemp(pData, nLen);
    
    	HeapFree(GetProcessHeap(), 0, pData);
    
    	std::cout << strTemp << std::endl;
    
    	return 0;
    }
    
    

         使用默认的进程堆来申请内存还需要注意,很多Windows系统函数都用到了进程的默认堆,而且应用程序会可能有多个线程同时要调用各种windows函数,因此系统保证不管在什么时候,一次只让一个线程从默认堆中分配或者释放内存快。当两个线程同时想要从默认堆中分配一块内存,那么只有一个线程能够分配,另一个线程必须等待第一个线程的分配完成。这种依次访问对性能会有轻微影响,在一般的应用程序中可以忽略不计,对性能要求较高的程序需要注意。

    展开全文
  • python del释放内存

    千次阅读 2020-07-01 22:34:30
    说明 del语句作用在变量上,而不是数据对象上 del删除的是变量,而不是数据 __del__是个特殊方法,它不会销毁实例 无论手动del还是等Python自动GC,都会调用到__del__ 例子 class A: def __init__(self): ...

    说明

    1. del语句作用在变量上,而不是数据对象上
    2. del删除的是变量,而不是数据
    3. __del__是个特殊方法,它不会销毁实例
    4. 无论手动del还是等Python自动GC,都会调用到__del__

    例子

    class A:
        def __init__(self):
            print("__init__() ")
    
        def __del__(self):
            print("__del__()")
    
    
    a = A()
    b = a
    del a
    print("***********")
    #输出
    >__init__() 
    >***********
    >__del__()
    

    注意看输出结果, __del__()是在调用print()之后打印的,这是为什么呢?

    1. 手动调用 __del__() 方法,该方法也不会立即执行
    2. Python 采用自动引用计数(简称 ARC)的方式实现垃圾回收机制
    3. 每当遇到 del x, Python 会将 x 的引用数减1, 当 x 的引用数减到0时就会调用 x.__del__()
    展开全文
  • Python如何释放内存

    千次阅读 2019-09-23 08:48:09
    就想着在运行过程中,动态的释放内存,减少冗余的内存占用。一般我会直接用del来删除变量,但是对于占用内存较大的对象,del 并不管用,删除了内存也没见减小。有一个解决办法就是调用gc(垃圾回收)模块,就能立刻...
  • 文章目录一、c++ vector clear() 方法的问题:二、vector的内存释放:1....:四、vector容器删除某些元素且释放内存:1.size和capacity2.应用 对于查到的相关资料做了梳理 如果一定需要实现内存动态释放,第...
  • CentOS 释放内存

    千次阅读 2019-01-26 08:50:15
    在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了。 Linux...
  • 在CentOS7上手动释放内存cache和脚本定时释放 前言 总有很多朋友对于Linux的内存管理有疑问,当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。这个...
  • php手动释放内存

    千次阅读 2017-11-22 21:44:25
    关于php释放内存问题
  • Tensorflow 释放内存

    万次阅读 2018-05-02 22:54:00
    我请教了深度学习社区q群中的大神,大神说这是运算图还在内存中,没有及时释放,需要restart一下kernel,但是由于我的代码不能停止执行,所以没办法用重新运行代码来解决释放内存运行图的问题。问题:with tf....
  • Java和c++之间有一堵由内存分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人想出来  java的GC回收是完全自动的,没有提供相关api手动回收,所有的内存分配和回收权限都在jvm,不在开发人员手里...
  • C/C++申请和释放内存

    万次阅读 多人点赞 2018-01-11 11:39:47
    new 和 delete 是 C++ 用于管理堆内存的两个运算符,对应于C语言中的 malloc 和 free,但是 malloc 和 free ...同样,delete 在释放内存之前,会调用对象的析构函数,而 free 只会释放内存。C++new运算符申请内存:将调
  • C++ delete释放内存的本质

    千次阅读 2019-02-21 13:34:21
    然而,通过验证可以发现,delete所谓的释放内存,只是将指定空间定义为可分配内存,该空间仍保留原有的值,且可以访问。 测试样例 #include &amp;amp;lt;iostream&amp;amp;gt; using namespace std; class A...
  • 释放solr内存

    热门讨论 2016-10-21 16:27:40
    java -jar gcsolrutil.jar ,即可释放运行的solr的内存情况
  • Linux下释放内存

    万次阅读 2019-04-27 20:39:18
    当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching,因此我们很有必要手动清理系统缓存释放内存。 第一步 我们在清理缓存前应该先执行sync。 因为系统在...
  • java的GC回收是完全自动的,没有提供相关api手动回收,所有的内存分配和回收权限都在jvm,不在开发人员手里**** 没有绝对的强制垃圾回收的方法,不过可以这样去做: 对于不再引用的对象,及时把它的引用赋为null...
  • linux 手动释放内存

    千次阅读 2019-08-03 18:22:12
    因此我们很有必要手动清理系统缓存释放内存。 我们在清理缓存前应该先 sync下 因为系统在操作的过程当中,会把你的操作到的文件资料先保存到buffer中去,因为怕你在操作的过程中因为断电等原因遗失数据,所以在你...
  • java的内存管理 对象的分配与释放 分配: 程序员通过new为每个对象申请内存空间(基本类型除外下面有介绍,注意局部变量和对象的实例变量的区别)所有对象都在堆中分配空间; 释放: 对象的释放是由垃圾回收机制决定和...
  • 来说:这种应该怎么释放内存? 如果delete A;是不是只是把A中存放的指针删掉了,而没有删掉指针指向的内存? 如果 for(auto i=A.begin();i!=A.end();i++) { whatever *a=*i; whatever *p1; whatever *p2; ...
  • android Application使用及如何释放内存

    千次阅读 2019-01-08 13:37:45
    android Application简单使用及内存释放; 一、 1、 Application是Android框架的一个系统组件,当Android程序启动时系统会创建一个 Application对象,用来存储系统的一些信息,通常我们是不需要指定一个...
  • 这样编译器在编译阶段就知道该为这个数组分配多少内存了,这就叫静态分配。 那要是这个班的人数是未知的,需要用户手动输入来确定呢? 那就需要动态分配了: void func(int student_count) { int grade[] = ne....
  •  本文中使用的apache是 Event 模式,在访问量上来之后,linux服务器总共60G的内存占用持续升高,于是将内存容量扩大,升高至120G。经过一段时间后发现,内存占用继续升高,几乎将120G占满,网站访问速度急速下降...
  • php释放内存

    千次阅读 2018-10-08 17:44:14
    实验1 var_dump(memory_get_usage()); $a = 'test'; var_dump(memory_get_usage());...赋值为null不能释放内存,函数unset()只有unset所有引用的变量,当内存的引用计数为0时,内存才回被释放。
  • Centos7 释放内存

    千次阅读 2019-06-17 16:14:01
    // 查看内存使用情况 [root@localhost ~]# free -m // 释放cache [root@localhost ~]# sync; echo 3 > /proc/sys/vm/drop_caches 清理yum缓存 // 清理/var/cache/yum的headers [root@localhost ~]# yum clean ...
  • python-opencv下读取影像释放内存

    千次阅读 2020-08-05 16:15:00
    c++下opencv释放影像占用内存: IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&img); 在python下没有找到对应函数,甚至查阅了opencv网站welcome to opencv do
  • C#释放内存的方法

    千次阅读 2018-11-05 10:13:00
    原文:... --------------------- 如何释放内存: [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")] public static extern int SetProcessWo...
  • kettle 不释放内存的问题

    千次阅读 2019-09-17 11:26:47
    使用kettle自带的Spoon工具使用“转换”和“作业”之后内存不会释放,kettle是把数据抽取到内存中的,Spoon每执行一次转换内存都会加大,Spoon本身也占内存,定时作业更是以进程的方式执行,会一直占用服务器的CPU和...
  • GPU释放内存

    千次阅读 2018-09-24 18:06:06
    首先 nvidia-smi 查看PID序号, 然后使用 kill -9 PID 释放内存
  • Python 释放内存的3种方法

    千次阅读 2019-11-15 14:31:49
    python话说会自己管理内存,实际上,对于占用很大内存的对象,并不会马上释放。举例,a=range(10000*10000),会发现内存飙升一个多G,del a 或者a=[]都不能将内存降下来。。 del 可以删除多个变量,del a,b,c,d 办法...
  • 内核手动释放内存方法

    千次阅读 2016-03-17 17:50:50
    转载自:... Linux释放内存的命令: sync echo 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同的含义: 0:不释放(系统默认值) 1:释放页缓存 2:释放

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 921,897
精华内容 368,758
关键字:

释放内存