龙空技术网

答读者问:Java 里的堆内存和栈内存是什么意思?

小匚 544

前言:

如今兄弟们对“java的堆外内存”大致比较关心,姐妹们都想要学习一些“java的堆外内存”的相关内容。那么小编在网络上汇集了一些关于“java的堆外内存””的相关资讯,希望小伙伴们能喜欢,我们一起来学习一下吧!

写作的意义在于分享,在于遇见。

昨天发文后,我收到了一条评论,问我不知道什么是堆内存和栈内存。 因此,才有了今天这篇文章。

数据结构里的栈和堆

如果学过数据结构这门课,一定对“栈”和“堆”这两个词不陌生。

栈表示一种先进后出(LIFO,last in first out,后进先出)的数据结构。类比生活中,就像是训练有素的服务员堆脏盘子,理应按照从下面开始堆上去的反方向,也就是从上往下开始洗盘子。这里的堆盘子和洗盘子,就是数据的存和取。

堆在数据结构里,是一种特殊的树结构:一般有最大堆和最小堆。如下图。最小堆根结点都不大于左右孩子。最大堆的根结点都不小于左右孩子。

除了表示一种数据结构,还可以表示内存分配的通用空间。而堆内存,则指的就是后者的含义。

Java 为什么会有两种内存分配方式呢?

栈来存数据时,你只能取出你最后加进去的。这种方式对局部变量来说就刚刚好。因为他们会随着函数的调用,就来了,函数结束,就要消失。栈让追踪变得很简单,因为最后保存的一定是最先被释放的。

但是栈并不适合一些随意的数据,这些数据的生命周期并不遵循单独的函数那样。这时,堆内存就可以允许你任意去添加或删除这些数据。

所以栈在内存中占的空间,比 Java 堆空间少太多了。因为方法一结束,在这个方法里创建的所有变量都会被永久清除掉。

Java 中的栈内存用于静态内存分配和线程的执行。如果栈内存满了,会抛出异常:java.lang.StackOverFlowError 。而且是线程安全的,因为线程之间是被隔离开来的。

Java 中的堆内存为 Java 对象和 JRE 类动态分配内存。如果堆内存满了,抛出的异常是: java.lang.OutOfMemoryError。

栈内存和堆内存的不同主要体现在以下几点:程序应用上:栈内存是在执行栈帧的时候,被方法所使用,堆内存是被整个应用在所有运行时间使用。存储的东西:栈内存只存主要变量和堆中创建的对象的引用,堆内存存所有被创建的对象。使用顺序:栈内存就是用 LIFO 的顺序管理的,堆内存则是通过复杂的内存管理技术来存取的(之前文章提过的年轻代、年老代和永久代)。效率上:栈内存要比堆内存快。分配和回收:方法被调用的时候,栈内存就被开辟了,方法返回时,就被回收;

当新对象被创建的时候,堆内存被开辟,如果没有任何引用了,就会被垃圾回收器回收掉。

参考链接:

标签: #java的堆外内存 #java 堆 栈 内存 怎么理解