编程语言中的堆栈和垃圾回收

简介: 编程语言中的堆栈和垃圾回收

一、前菜:数据结构中的堆栈

用两个图,一看就能明白:
image.png



image.png


堆是一种常用的树形结构,是一种特殊的完全二叉树,当且仅当满足所有节点的值总是不大于或不小于其父节点的值的完全二叉树被称之为堆。堆的这一特性称之为堆序性。因此,在一个堆中,根节点是最大(或最小)节点。如果根节点最小,称之为小顶堆(或小根堆),如果根节点最大,称之为大顶堆(或大根堆)。堆的左右孩子没有大小的顺序。

问:现在我有一个十万大小的数据集,要从中寻找选出最大的10个元素,怎么做呢?

答:用堆。分治递归。

树,二叉树(从左到右垂直有序),平衡二叉树(左右高度限制),b树,b+树,完全二叉树,堆(上下每一层大小是有序的,左右大小无序),大根堆,小根堆。

b树:mysql的索引数据结构。

然而,数据结构中的堆栈和编程里的内存堆栈似乎是两码事。

二、堆内存和栈内存

栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等;

堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为C使用new申请的堆内容;

静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

一般是系统自动回收堆空间。 像JAVA这种常驻内存或者C 中的malloc和new申请堆内存,需要手动回收机制的语言需要特别注意内存的手动释放,如果占用太多不释放很容易内存泄漏。

对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。

例子说明:

1、如果你用new来生成的对象都是放在堆中的,而直接定义的局部变量都是放在栈中的,全局和静态的对象是放在数据段的静态存储区。

例如: Class People;People p;//栈上分配内存

People* pPeople;pPeople = new People;//堆上分配内存

2、PHP中对象名称存在栈内存。

p1=new Person();

对于这个条代码,$p1是对象名称在栈内存里面new Person()是真正的对象是在堆内存里面的。每new一次开辟一个堆空间。

3、C中:

image.png

image.png

4、swoole开发注意内存泄漏
image.png

因为常驻内存不释放,又一直在累加导致coredump


swoole中尽量少用全局变量:
image.png

本来静态变量是为了调用方便,不用实例化,提升效率,节省空间。但是如果执行完内存不释放,而且每次运行数据都在不断叠加的,如图1,要等work进程退出后才释放,不断占用内存空间导致泄露。反而得不偿失!!!

image.png

相关文章
|
存储 算法 Java
大数据开发基础的编程语言的Java的JVM虚拟机的GC垃圾回收
Java虚拟机(JVM)是Java语言的核心,它是一个虚拟的计算机,可以在不同的操作系统上运行Java程序。在Java中,垃圾回收(GC)是JVM的重要组成部分,它负责回收无用的对象,从而释放内存资源。本文将介绍Java的GC垃圾回收和常见问题。
77 0
|
5月前
|
算法 Java
JVM GC和常见垃圾回收算法
JVM GC和常见垃圾回收算法
83 0
|
5月前
|
Java Go
Golang底层原理剖析之垃圾回收GC(二)
Golang底层原理剖析之垃圾回收GC(二)
102 0
|
11天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
16天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制(GC)
本文将探讨Java的自动内存管理核心——垃圾回收机制。通过详细解析标记-清除算法、复制算法和标记-整理算法等常用垃圾回收算法,以及CMS、G1等常见垃圾回收器,帮助读者更好地理解Java应用的性能优化和内存管理。同时,探讨分代收集、分区收集等策略在实际项目中的应用。结语部分总结了垃圾回收机制在Java开发中的重要性,并展望了未来可能的发展。
19 0
|
2月前
|
缓存 监控 Java
"Java垃圾回收太耗时?阿里HBase GC优化秘籍大公开,让你的应用性能飙升90%!"
【8月更文挑战第17天】阿里巴巴在HBase实践中成功将Java垃圾回收(GC)时间降低90%。通过选用G1垃圾回收器、精细调整JVM参数(如设置堆大小、目标停顿时间等)、优化代码减少内存分配(如使用对象池和缓存),并利用监控工具分析GC行为,有效缓解了高并发大数据场景下的性能瓶颈,极大提升了系统运行效率。
53 4
|
2月前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
3月前
|
监控 算法 Java
Java面试题:如何在Java中触发一次Full GC?请详细解释垃圾回收机制和知识
Java面试题:如何在Java中触发一次Full GC?请详细解释垃圾回收机制和知识
258 4
|
4月前
|
算法 Java
垃圾回收机制(Garbage Collection,GC)是Java语言的一个重要特性,它自动管理程序运行过程中不再使用的内存空间。
【6月更文挑战第24天】Java的GC自动回收不再使用的内存,关注堆中的对象。通过标记-清除、复制、压缩和分代等算法识别无用对象。GC分为Minor、Major和Full类型,针对年轻代、老年代或整个堆进行回收。性能优化涉及算法选择和参数调整。
54 3
|
4月前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
61 3