Memory management 什么';请问内存分配和垃圾回收的区别是什么?

Memory management 什么';请问内存分配和垃圾回收的区别是什么?,memory-management,Memory Management,我知道“垃圾收集”是一种内存管理形式,是一种自动回收未使用内存的方法 但是什么是“内存分配”以及与“垃圾收集”在概念上的区别呢?内存分配是向系统请求一些内存以用于某些事情的行为 垃圾收集是一个检查以前分配的某些内存是否不再实际使用(即不再可从程序访问)以自动释放的过程 一个微妙的点是,允许您继续分配内存,而不关心释放内存;因此,它不能替代其他类型资源(例如文件句柄、数据库连接等)的管理。内存分配是向系统请求一些内存以用于某些用途的行为 垃圾收集是一个检查以前分配的某些内存是否不再实际使用(即不再

我知道“垃圾收集”是一种内存管理形式,是一种自动回收未使用内存的方法


但是什么是“内存分配”以及与“垃圾收集”在概念上的区别呢?

内存分配是向系统请求一些内存以用于某些事情的行为

垃圾收集是一个检查以前分配的某些内存是否不再实际使用(即不再可从程序访问)以自动释放的过程


一个微妙的点是,允许您继续分配内存,而不关心释放内存;因此,它不能替代其他类型资源(例如文件句柄、数据库连接等)的管理。

内存分配是向系统请求一些内存以用于某些用途的行为

垃圾收集是一个检查以前分配的某些内存是否不再实际使用(即不再可从程序访问)以自动释放的过程


一个微妙的点是,允许您继续分配内存,而不关心释放内存;因此,它不能替代其他类型资源(例如文件句柄、数据库连接等)的管理。

它们是极为对立的。所以,是的,差别很大

分配内存是指占用内存空间来存储东西的过程

垃圾收集(或释放内存)是将内存释放回可用内存池的过程


当变量被声明/初始化并超出范围时,许多较新的语言会在后台为您执行这两个步骤。

它们是极为对立的。所以,是的,差别很大

分配内存是指占用内存空间来存储东西的过程

垃圾收集(或释放内存)是将内存释放回可用内存池的过程


当变量被声明/初始化并超出范围时,许多较新的语言会在后台为您执行这两个步骤。

一个简单的伪代码示例:

void myFoo()
{    
    LinkedList<int> myList = new LinkedList<int>();
    return;
}
void myFoo()
{    
LinkedList myList=新建LinkedList();
回来
}
这将在堆上请求足够的新空间来存储LinkedList对象。 但是,当函数体结束时,
myList
将消失,您再也不知道该链接列表存储在何处(内存地址)。因此,绝对没有办法告诉系统释放该内存,并在以后再次提供给您

Java垃圾回收器将自动为您完成这项工作,但要付出一定的性能代价,同时引入一些不确定性(您无法真正判断何时调用GC)


C++
中没有本机垃圾收集器(还没有?)。但是管理内存的正确方法是使用智能指针(例如,
std::auto_ptr
(在C++11中不推荐)、
std::shared_ptr
)等。

一个简单的伪代码示例:

void myFoo()
{    
    LinkedList<int> myList = new LinkedList<int>();
    return;
}
void myFoo()
{    
LinkedList myList=新建LinkedList();
回来
}
这将在堆上请求足够的新空间来存储LinkedList对象。 但是,当函数体结束时,
myList
将消失,您再也不知道该链接列表存储在何处(内存地址)。因此,绝对没有办法告诉系统释放该内存,并在以后再次提供给您

Java垃圾回收器将自动为您完成这项工作,但要付出一定的性能代价,同时引入一些不确定性(您无法真正判断何时调用GC)


C++
中没有本机垃圾收集器(还没有?)。但是管理内存的正确方法是使用智能指针(例如,
std::auto_ptr
(在C++11中不推荐)、
std::shared_ptr
)等。

内存分配要求计算机提供一些内存,以便存储数据。例如,在C++中:

int* myInts = new int[howManyIntsIWant];
告诉计算机给我分配足够的内存来存储一些整数

做同样事情的另一种方法是:

int myInts[6];
这里的不同之处在于,在第二个示例中,我们知道在编写和编译代码时我们需要多少空间-它是一个int的6*大小。这让我们可以进行静态内存分配(在所谓的“堆栈”上使用内存)

在第一个示例中,我们不知道编译代码时需要多少空间,我们只知道程序运行时需要多少空间,并且我们有howManyIntsIWant的值。这是动态内存分配,它在“堆”上获取内存

现在,使用静态分配,我们不需要告诉计算机何时完成内存分配。这与堆栈的工作方式有关;简短的版本是,一旦我们离开创建静态数组的函数,内存就会立即被占用

对于动态分配,这种情况不会发生,因此必须以其他方式清理内存。在某些语言中,您必须编写代码来释放内存,在另一种语言中,这是自动完成的。这就是垃圾收集——语言中内置的一些自动进程,它将扫描堆上所有动态分配的内存,找出哪些位没有被使用,并释放它们(即释放它们以供其他进程和程序使用)


所以:内存分配=为程序请求内存。垃圾收集=编程语言本身计算出哪些内存不再被使用并为您释放。

内存分配要求计算机提供一些内存,以便存储数据。例如,在C++中:

int* myInts = new int[howManyIntsIWant];
告诉计算机