Appearance
内存管理
垃圾回收
垃圾回收(Garbage Collection, GC)是一种自动进行的内存管理机制,它的核心任务是在程序运行期间监测和回收那些不再被使用的对象,从而防止内存泄漏并提升内存使用效率。这种技术在诸如Java、Python和Go等编程语言中得到了广泛应用,而在C、C++和Rust等语言中则通常不提供垃圾回收功能,内存的分配与释放需要程序员显式控制
关于垃圾
针对垃圾的定义,其实指那些程序中已经分配出去但不再被引用的内存空间。这些无用的内存如果未被及时清理,就会逐渐积累,最终可能导致内存资源的浪费和程序性能的下降。 垃圾主要产生于程序运行过程中的内存分配与回收不当。在现代操作系统中,每个进程都拥有独立的虚拟内存空间,这些空间被划分为不同的内存段,包括代码段、数据段、BSS段、堆段、文件映射段和栈段。其中,堆和栈是存储动态分配内存的两个关键区域。
堆(Heap)
- 堆是用于存储程序运行时动态创建的对象和数据结构的内存区域。
- 堆内存的分配是动态的,由程序员通过特定的内存分配函数(如C/C++中的malloc或new)进行。
- 堆内存的回收通常由垃圾回收器(Garbage Collector, GC)负责,它会自动追踪并回收不再被程序使用的对象,防止内存泄漏。
栈(Stack):
- 栈用于存储局部变量、函数调用的上下文等。
- 栈内存的分配和回收是自动的,由编译器管理,其生命周期与函数调用的作用域紧密相关。
- 栈的大小通常是固定的,但可以通过系统参数进行调整。
全局/静态数据区:
- 这些区域存储程序启动时分配的数据,如全局变量和静态变量。
- 它们的生命周期与程序的运行周期一致,因此不需要垃圾回收器管理。 在编程实践中,不同语言对内存管理采取不同的策略。C++等语言要求开发者负责手动分配和释放堆内存,这增加了内存管理的复杂性,并要求开发者警惕内存泄漏的问题。相比之下,Go等语言通过内置的垃圾回收机制,允许自动管理堆内存,从而简化了内存管理流程,减少了内存泄漏的风险。这种自动内存管理技术是现代编程语言的一个重要特性,它通过回收不再使用的内存空间,确保了内存资源的高效利用,并让开发者能够专注于程序逻辑的实现。
内存逃逸
在Go语言中,内存泄露是指程序中已动态分配的堆内存在不再需要使用后未被释放,导致整个程序运行过程中占用的内存持续增加,这是一种资源浪费。
逃逸分析
内存逃逸分析是编译器在编译优化时,用来决定变量应该分配在堆上还是栈上的工具。
了解内存逃逸分析的原理后,就能够理解什么样的变量会被分配在栈上、什么样的变量会被分配在堆上。 当你的程序对性能非常敏感,就可以使用内存逃逸工具的分析,查看哪些变量逃逸到了堆上,哪些没有逃逸。然后调整代码,再次提高你的程序性能。 go在编译时会进行内存逃逸分析,同样也给开发人员开放了内存逃逸信息。
在编译时增加-m标志,就会输出内存逃逸信息。 go build -gcflags="-m"