1.内存的分配和回收

  • 栈内存由系统自动分配和管理。变量一旦超出局部作用域就会被回收,不会出现内存泄漏
  • 堆内存由应用程序自己来分配和管理。没有正确释放堆内存,会出现内存泄漏
  • 只读段,包括程序的代码和常量,由于是只读的,不会再去分配新的内存,所以也不会产生内存泄漏。
  • 数据段,包括全局变量和静态变量,这些变量在定义时就已经确定了大小,所以也不会产生内存泄漏。
  • 内存映射段,包括动态链接库和共享内存,其中共享内存由程序动态分配和管理。如果程序在分配后忘了回收,就会导致跟堆内存类似的泄漏问题

内存泄漏危害:

  • 内存泄漏的危害非常大,这些忘记释放的内存,不仅应用程序自己不能访问,系统也不能 把它们再次分配给其他应用。内存泄漏不断累积,甚至会耗尽系统内存。
  • 系统最终可以通过 OOM (Out of Memory)机制杀死进程,但进程在 OOM 前,可能已经引发了一连串的反应,导致严重的性能问题。
  • 其他需要内存的进程,可能无法分配新的内存;内存不足,又会触发系统的缓存回 收以及 SWAP 机制,从而进一步导致 I/O 的性能问题等等