精华内容
下载资源
问答
  • Linux释放内存空间

    2019-07-04 18:22:51
    Linux释放内存空间  Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,所以这也正是linux内存管理...

    Linux释放内存空间

      Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,所以这也正是linux内存管理中非常出色的一点,所以乍一看内存剩余的非常少,但是在程序真正需要内存空间时,linux会将缓存让出给程序使用,这样达到对内存的最充分利用,所以真正剩余的内存是free+buff/cache

            但是有些时候大量的缓存占据空间,这时候应用程序回去使用swap交换空间,从而使系统变慢,这时候需要手动去释放内存,释放内存的时候,首先执行命令 sync 将所有正在内存中的缓冲区写到磁盘中,其中包括已经修改的文件inode、已延迟的块I/O以及读写映射文件,从而确保文件系统的完整性

           说到清理内存,那么不得不提到/proc这一个虚拟文件系统,这里面的数据和文件都是内存中的实时数据,很多参数的获取都可以从下面相应的文件中得到,比如查看某一进程占用的内存大小和各项参数,cpu和主板的详细信息,显卡的参数等等;相应的关于内存的管理方式是在/proc/sys/vm/drop_chches文件中,一定要注意这个文件中存放的并不是具体的内存内容,而是0-3这几个数字,通过文件大小只有1B也可以知道,而这些代号分别告诉系统代表不同的含义如下:

    0:0是系统默认值,默认情况下表示不释放内存,由操作系统自动管理
    1:释放页缓存
    2:释放dentries和inodes
    3:释放所有缓存

    所以根据上面的说明,分别将1,2,3这3个数字重定向到drop_caches中可以实现内存的释放,一般释放内存都是重定向3到文件中,释放所有的缓存
    那么下面举个例子,比如这里只释放页缓存,首先使用 free -h 查看当前内存剩余

    当前内存剩余1.1G左右,另外buff/cache是18G,根据上面说的现在真正的剩余内存应该是1.9G左右,首先写缓存到文件系统:

    sync

    然后执行下面命令释放内存(页缓存buff/cache):

    echo 1 > /proc/sys/vm/drop_caches

     释放全部缓存内存

    echo 3 > /proc/sys/vm/drop_caches

     

    可见 Free空闲内存为16G  由此可知,确实释放了

    到这里内存就释放完了,现在drop_caches中的值为1,如果现在想让操作系统重新分配内存,那么设置drop_caches的值为0即可:

    echo 0 > /proc/sys/vm/drop_caches

      另外需要注意的是,在生产环境中的服务器我们不要频繁的去释放内存,只在必要时候清理内存即可,更重要的是我们应该从应用程序层面去优化内存的利用和释放,经常清理内存可能只是暂时屏蔽的应用程序中的一些bug,所以更重要的是程序的调优,其他的交给操作系统来管理

    原文博客参考来源 :https://www.cnblogs.com/freeweb/p/5713513.html

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

    展开全文
  • 程序运行时的内存空间分布

    万次阅读 多人点赞 2014-03-21 01:33:18
    一、程序运行时的内存空间情况 其实在程序运行时,由于内存的管理方式是以页为单位的,而且程序使用的地址都是虚拟地址,当程序要使用内存时,操作系统再把虚拟地址映射到真实的物理内存的地址上。所以在程序中,...
    我们在写程序时,既有程序的逻辑代码,也有在程序中定义的变量等数据,那么当我们的程序进行时,我们的代码和数据究竟是存放在哪里的呢?下面就来总结一下。
    

    一、程序运行时的内存空间情况

    其实在程序运行时,由于内存的管理方式是以页为单位的,而且程序使用的地址都是虚拟地址,当程序要使用内存时,操作系统再把虚拟地址映射到真实的物理内存的地址上。所以在程序中,以虚拟地址来看,数据或代码是一块块地存在于内存中的,通常我们称其为一个段。而且代码和数据是分开存放的,即不储存于同于一个段中,而且各种数据也是分开存放在不同的段中的。

    下面以一个简单的程序来看一下在Linux下的程序运行空间情况,代码文件名为space.c
    #include <unistd.h>
    #include <stdio.h>
    
    int main()
    {
    	printf("%d\n", getpid());
    	while(1);
    	return 0;
    }

    这个程序非常简单,输出当前进程的进程号,然后进入一个死循环,这个死循环的目的只是让程序不退出。而在Linux下有一个目录/proc/$(pid),这个目录保存了进程号为pid的进程运行时的所有信息,其中有一个文件maps,它记录了程序执行过程中的内存空间的情况。编译运行上面的代码,其运行结果如图1所示:


    从上面的图中,我们可以看到这样一个简单的程序,在执行时,需要哪些库和哪些空间。上面的图的各列的意思,不一一详述,只对重要的进行说明。
    第一列的是一个段的起始地址和结束地址,第二列这个段的权限,第三列段的段内相对偏移量,第六列是这个段所存放的内容所对应的文件。从上图可以看到我们的程序进行首先要加载系统的两个共享库,然后再加载我们写的程序的代码。

    对于第二列的权限,r:表示可读,w:表示可写,x:表示可执行,p:表示受保护(即只对本进程有效,不共享),与之相对的是s,意是就是共享。

    从上图我们可以非常形象地看到一个程序进行时的内存分布情况。下面我们将会结合上图,进行更加深入的对内存中的数据段的解说。

    二、程序运行时内存的各种数据段

    1.bss段
    该段用来存放没有被初始化或初始化为0的全局变量,因为是全局变量,所以在程序运行的整个生命周期内都存在于内存中。有趣的是这个段中的变量只占用程序运行时的内存空间,而不占用程序文件的储存空间。可以用以下程序来说明这点,文件名为bss.c
    #include <stdio.h>
    
    int bss_data[1024 * 1024];
    
    int main()
    {
    	return 0;
    }
    这个程序非常简单,定义一个4M的全局变量,然后返回。编译成可执行文件bss,并查看可执行文件的文件属性如图2所示:


    从可执行文件的大小4774B可以看出,bss数据段(4M)并不占用程序文件的储存空间,在下面的data段中,我们可以看到data段的数据是占用可执行文件的储存空间的。

    在图1中,有文件名且属性为rw-p的内存区间,就是bss段。

    2.data段
    初始化过的全局变量数据段,该段用来保存初始化了的非0的全局变量,如果全局变量初始化为0,则编译有时会出于优化的考虑,将其放在bss段中。因为也是全局变量,所以在程序运行的整个生命周期内都存在于内存中。与bss段不同的是,data段中的变量既占程序运行时的内存空间,也占程序文件的储存空间。可以用下面的程序来说明,文件名为data.c:
    #include <stdio.h>
    
    int data_data[1024 * 1024] = {1};
    
    int main()
    {
    	return 0;
    }
    这个程序与上面的bss唯一的不同就是全局变量int型数组data_data,其中第0个元素的值初始化为1,其他元素的值初始化成默认的0,而因为数组的地址是连续的,所以只要有一个元素在data段中,则其他的元素也必然在data段中。编译连接成可执行文件data,并查看可执行文件的文件属性如图3所示:


    从可执行文件的大小来看,data段数据(data_data数组的大小,4M)占用程序文件的储存空间。

    在图1中,有文件名且属性为rw-p的内存区间,就是data段,它与bss段在内存中是共用一段内存的,不同的是,bss段数据不占用文件,而data段数据占用文件储存空间。

    3.rodata段
    该段是常量数据段,用于存放常量数据,ro就是Read Only之意。但是注意并不是所有的常量都是放在常量数据段的,其特殊情况如下:
    1)有些立即数与指令编译在一起直接放在代码段(text段,下面会讲到)中。
    2)对于字符串常量,编译器会去掉重复的常量,让程序的每个字符串常量只有一份。
    3)有些系统中rodata段是多个进程共享的,目的是为了提高空间的利用率。

    在图1中,有文件名的属性为r--p的内存区间就是rodata段。可见他是受保护的,只能被读取,从而提高程序的稳定性。

    4.text段
    text段就是代码段,用来存放程序的代码(如函数)和部分整数常量。它与rodata段的主要不同是,text段是可以执行的,而且不被不同的进程共享。

    在图1中,有文件名且属性为r-xp的内存区间就是text段。就如我们所知道的那样,代码段是不能被写的。

    5.stack段
    该段就是栈段,用来保存临时变量和函数参数。程序中的函数调用就是以栈的方式来实现的,通常栈是向下(即向低地址)增长的,当向栈中push一个元素,栈顶指针就会向低地址移动,当从栈中pop一个元素,栈顶指针就会向高地址移动。栈中的数据只在当前函数或下一层函数中有效,当函数返回时,这些数据自动被释放,如果继续对这些数据进行访问,将发生未知的错误。通常我们在程序中定义的不是用malloc系统函数或new出来的变量,都是存放在栈中的。例如,如下函数:
    void func()
    {
        int a = 0;
        int *n_ptr = malloc(sizeof(int));
        char *c_ptr = new char;
    }

    整型变量a,整型指针变量n_ptr和char型指针变量c_ptr,都存放在栈段中,而n_ptr和c_ptr指向的变量,由于是malloc或new出来的,所以存放在堆中。当函数func返回时,a、n_ptr、c_ptr都会被释放,但是n_ptr和c_ptr指向的内存却不会释放。因为它们是存在于堆中的数据。

    在图1中,文件名为stack的内存区间即为栈段。

    6.heap段
    heap(堆)是最自由的一种内存,它完全由程序来负责内存的管理,包括什么时候申请,什么时候释放,而且对它的使用也没有什么大小的限制。在C/C++中,用alloc系统函数和new申请的内存都存在于heap段中。

    以上面的程序为例,它向堆申请了一个int和一个char的内存,因为没有调用free或delete,所以当函数返回时,堆中的int和char变量并没有释放,造成了内存泄漏。

    由于在图1所对应的代码中没有使用alloc系统函数或new来申请内存,所以heap段并没有在图1中显示出来,所以以下面的程序来说明heap段的位置,代码文件为heap.c,代码如下:
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    int main()
    {
    	int *n_ptr = malloc(sizeof(int));
    	printf("%d\n", getpid());
    	while(1);
    	free(n_ptr);
    	return 0;
    }
    查看其运行时内存空间分布如下:


    可以看到文件名为heap的内存区间就是heap段。从上图,也可以看出,虽然我们只申请4个字节(sizeof(int))的空间,但是在操作系统中,内存是以页的方式进行管理的,所以在分配heap内存时,还是一次分配就为我们分配了一个页的内存。注:无论是图1,还是上图,都有一些没有文件名的内存区间,其实没用文件名的内存区间表示使用mmap映射的匿名空间。

    展开全文
  • linux 运行内存/磁盘空间/CPU查看命令

    千次阅读 2019-01-12 17:20:22
    linux 运行内存不足报错 和查看 很明显,内存不足! 磁盘空间查看 CPU查看

    linux 运行内存不足报错 和查看

    很明显,内存不足!

    磁盘空间查看

    CPU查看

    展开全文
  • 转载:C语言中free函数是如何确定要释放多少内存空间的 转载原因:通俗易懂,逻辑清晰。 今天看书的时候看到free函数释放动态申请的内存时只需要把内存块的首地址传过去就行了,显然仅仅依靠首地址是无法确定要...
  • 1. 动态申请空间1.1 基本内容 Ⅰ 动态申请的空间没有具体名称,只能...而程序员动态申请的空间则需要人为来释放,否则随着程序运行内存占用积累,很容易造成内存泄漏,尤其在程序过大,运行时间过长的时候,更需要
  • C# 释放C++DLL 中申请的内存空间

    千次阅读 2016-12-15 19:14:54
    问题描述:C#调用C++的dll,传入一组数据,返回处理后的数据以及一些信息字段。但是,返回的内容是不定长的,也就是dll内部要进行动态内存申请。...目前的解决方法只能够是调用方预先分配一个足够大的内存空间
  • 动态内存空间的开辟与释放

    千次阅读 2015-04-22 16:36:16
    在不知道需要占用内存空间大小时,需要在堆栈上动态开辟内存空间,空间使用结束后需要程序员自己释放。#include #include void main() { int n,*p,i,j,m,temp; printf("本程序可对任意个整数排序;\n"); printf...
  • vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续...
  • Linux系统虚拟内存空间一般布局示意图 说明:   1)线性地址空间:是指Linux系统中从0x00000000到0xFFFFFFFF整个4GB虚拟存储空间。   2)内核空间:内核空间表示运行在处理器最高级别的超级用户模式...
  • IntelliJ IDEA运行内存设置

    千次阅读 2020-05-08 10:18:39
    ·IntelliJ IDEA运行项目报内存不足时:“There is insufficient memory for the Java Runtime Environment to continue.”,需设置IDEA的jre运行内存。 解决方案: 1、file-seeting 2、compiler ...
  • 某台式机内存共3G,但free的内存只有200M,无法满足scala的jvm需求。 注意用top命令查看才能看到真正...搜索发现有三种方法都可以达到释放内存的目的。 watch -n 1 free -m or: free -m 上述这种方法只增加了几十M。
  • 还没有运行怎么会占用内存呢?!(这一点还要怀疑吗!?) 所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以...
  • JAVA获取JVM内存空间和物理内存空间

    万次阅读 2018-06-28 11:32:08
    获取JVM内存空间系统环境:WINJDK版本:1.8re直接调用Runtime中相应的方法即可:public long maxMemory() Returns the maximum amount of memory that the Java virtual machine will attempt to use. If there is...
  • 一般情况下,在c语言中,使用malloc()函数来分配指定大小的内存空间,用free()函数来释放这块内存空间。但是,往往初学者在编写这类程序时会出错,而许多错误是因为到底为谁分配了这块内存不清楚导致的。来看下面一...
  • 在清理前内存使用情况 free -m -m是单位,也可以-g 用以下命令清理内存 echo 1 > /proc/sys/vm/drop_caches 清理后内存使用情况再用以下命令看看。 free –m 多出很多内存了吧。 ...
  • JVM运行内存结构

    千次阅读 2019-02-26 08:20:52
    内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配; 方法区存储类信息、常量、静态变量等数据,...
  • 程序员通过new为每个对象申请内存空间(基本类型除外下面有介绍,注意局部变量和对象的实例变量的区别)所有对象都在堆中分配空间; 释放: 对象的释放是由垃圾回收机制决定和执行的,这样极大的简化CG(垃圾处理装置)的...
  • RAM,ROM 是手机自带内存,其中RAM 是手机运行内存,ROM是手机机身存储。 存储卡扩展指的是最大支持的TF卡(一般都是T-Flash 卡)空间,他是手机的外置存储设备。ROM是手机的内置存储设备,都是用来存储程序和...
  • Tomcat运行内存修改

    千次阅读 2019-07-23 04:43:44
    修改bin目录下的catalina.bat文件 因为命令以及执行了要设在java执行命令之前可以设置在rem-----ExecuteTheRequestedCommand-的下面一行 加上: set JAVA_OPTS=-Xms512m -Xmx...最小内存,最大内存,加载jar...
  • Python如何释放内存

    千次阅读 2019-09-23 08:48:09
    就想着在运行过程中,动态的释放内存,减少冗余的内存占用。一般我会直接用del来删除变量,但是对于占用内存较大的对象,del 并不管用,删除了内存也没见减小。有一个解决办法就是调用gc(垃圾回收)模块,就能立刻...
  • C中,使用malloc 和calloc申请测内存空间需要使用free进行内存释放,而在c++中,new函数申请的空间必须使用delete来释放。一. 使用new和delete运算符时PF率的变化情况Ctrl+Alt+Del进入任务管理器、性能,运行下列...
  • idea中配置项目的运行内存大小

    千次阅读 2020-12-26 15:54:19
    一、Java idea中配置项目的运行内存大小 参数描述 -Xms1024m //设置运行内存的最小值为1024m -Xmx2048m //设置运行内存的最大值为2048m -Xmn512m //设置新生代大小 -XX:MetaspaceSize=256m //设置初始Metaspace...
  • malloc申请最大运行内存

    千次阅读 2018-11-17 20:06:27
    贴一个在Windows平台下,关于malloc申请最大运行内存的代码,运行很费时间,可能是一个byte去读,效率比较低吧。 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; unsigned maximum = 0; int...
  • Python内存管理及释放

    万次阅读 多人点赞 2018-01-23 15:51:43
    python话说会自己管理内存,实际上,对于占用很大内存的对象,并不会马上释放。举例,a=range(10000*10000),会发现内存飙升一个多G,del a 或者a=[]都不能将内存降下来。。 del 可以删除多个变量,del a,b,c,d ...
  • 在Linux下操作频繁时,物理内存会被快速用完,当操作结束后,物理内存没有被正常的释放,而一直当作caching,影响系统的正常运行,今天就来谈谈如何能释放这一部分被占用的内存。 1、打开Linux命令窗口,可使用...
  • Linux进程的内存空间布局

    千次阅读 2018-10-09 11:51:41
    此文也可看作是Linux下C程序的内存空间布局(虚拟地址),因为在Linux下的C编译器本质上也是一个进程,编译器再强大也得在操作系统的保护模式下运行内存空间布局  在Linux中,进程的内存空间按低地址到高地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,053,837
精华内容 421,534
关键字:

怎样释放运行内存空间