堆和栈的笔记

来源:互联网 发布:2016人工智能论坛 编辑:程序博客网 时间:2024/06/05 00:12

堆和栈的笔记

内存泄漏

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存溢出

内存溢出(out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。

堆和栈的定义

  • 堆栈空间分配
    栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
    堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

  • 堆栈缓存方式
    栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
    堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

  • 堆栈数据结构区别
    堆(数据结构):堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。
    栈(数据结构):一种先进后出的数据结构。

  • 一个由C/C++编译的程序占用的内存分为以下几个部分
    1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等。其操作方式类似于数据结构中的栈。
    2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
    3、静态区(static)—全局变量和局部静态变量的存储是放在一块的。程序结束后由系统释放。
    4、文字常量区—常量字符串就是放在这里的,程序结束后由系统释放 。
    5、程序代码区— 存放函数体的二进制代码。

  • 变量的存储方式

存储描述 持续性 作用域 链接性 如何声明 自动 自动 代码块 无 在代码块中 寄存器 自动 代码块 无 在代码块中,使用关键字 register 静态,无链接性 静态 代码块 无 在代码块中,使用关键字 static 静态,外部链接性 静态 文件 外部 不在任何函数内 静态,内部链接性 静态 文件 内部 不在任何函数内,使用关键字 static
  • 注意:链接性为外部的变量通常简称为外部变量,它们的存储持续性为静态,作用域为整个文件。外部变量是在函数外部定义的,因此对所有函数而言都是外部的。如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(单定义规则),但在使用该变量的其他所有文件中,都必须使用关键字extern声明它:

https://baike.baidu.com/item/%E5%A0%86%E6%A0%88/1682032?fr=aladdin#3_2

内核的定义

内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

分页查询

当数据量过大时,可能会导致各种各样的问题发生,例如:服务器资源被耗尽,因数据传输量过大而使处理超时,等等。最终都会导致查询无法完成。
解决这个问题的一个策略就是“分页查询”,也就是说不要一次性查询所有的数据,每次只查询一“页“的数据。这样分批次地进行处理,可以呈现出很好的用户体验,对服务器资源的消耗也不大。
打一个比方,有很多很多人要过河,而只有一条船摆渡。若让所有人都上船,肯定会导致沉船(资源耗尽);若换一条超大的船,除了换船要很高的成本外,上船下船也要耗费很长时间。
所以最好的解决方法是,根据船的容量,每次只上一部分人。等这一船人过河以后,再摆渡下一批人。

原创粉丝点击