java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关。线程最基本的执行行为就是函数的调用。每次函数调用其实是通过java栈传递数据的。
数据结构中的栈的特性:先进后出,后进先出。FIFO.
java内存中的栈跟数据结构中的特性相似也是FIFO.但是只支持进栈和出栈操作。
java栈中保存的主要内容是栈帧。每一次函数调用都会有对应的栈帧被压进去java栈,执行完毕的时候被弹出java栈。如下图所示。
函数1对应栈帧1,函数2对应栈帧2.函数3对应栈帧3.以此类推。
函数1调用函数2,函数2调用函数3,函数3调用函数4,以此类推。
函数1被调用的时候栈帧1入栈,函数2被调用的时候栈帧2入栈,以此类推。
所以最后被调用的函数在栈顶,也是最先被弹出栈的。
每一个栈帧保存着函数的局部变量、中间运算结果等数据。
函数返回的时候,栈帧从java栈弹出。什么时候函数返回呢?两种情况:
1.正常的return的时候。
2.程序抛出异常。
在一个栈帧内,至少包含局部变量表、操作数帧和帧数据区几部分。
思考的问题:没一次函数调用生成栈帧,从而肯定会占用一定的栈空间。所以栈空间内存不足的时候,函数调用无法进行。当请求的栈深度大于最大栈深度的时候系统会抛出StackOverflowError异常。(内存溢出会在以后的章节深入的讲解和汇总)
java虚拟机制定线程的最大栈空间参数为-Xss,这个参数决定了函数调用的最大深度。
下面一段代码说明,是一个没有出口的递归。这段代码可能会栈溢出错误。如下所示:
- private static int count=0;
- public static void recursion(){
- count++;
- recursion();
- }
- public static void main(String[] args) {
- try {
- recursion();
- } catch (Exception e) {
- System.out.println("deep of calling="+count);
- e.printStackTrace();
- }
- }
使用参数-Xss128K执行代码,结果如下:
- deep of calling=2020
- Exception in thread "main" java.lang.StackOverflowError
- at cn.xhgg.test.TestStackDeep.recursion(TestStackDeep.java:6)
使用参数-Xss256K执行代码,结果如下:
- count=3665
- Exception in thread "main" java.lang.StackOverflowError
- at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)
两次内存不同对比:
内存增大很明显调用次数增加了。
结论:
函数嵌套的层数很大程度上有栈的大小决定的。栈越大,函数调用的次数就越多。
什么因素影响函数在栈中内存大大小呢?下一个章节介绍(java虚拟机jvm局部变量表)
相关推荐
本文将深入探讨Java中堆内存与栈内存的分配机制,并通过对比分析它们之间的差异,帮助读者更好地掌握Java内存管理的核心概念。 #### 二、堆内存与栈内存概述 ##### 1. 堆内存 堆内存是Java虚拟机(JVM)用于存储...
Java中栈内存和堆内存详解,非常容易理解
### Java中堆内存和栈内存详解 #### 一、引言 Java作为一种广泛使用的编程语言,其内存管理机制是...通过本文的学习,读者应该能够更深入地理解Java内存管理的基本概念,并能够根据实际需求选择合适的内存使用策略。
在Java中,栈可以用于实现各种算法和功能,如表达式求值、递归调用、内存管理等。 在Java中,有两种主要的方式来实现栈: 1. **ArrayDeque类**:Java集合框架提供了一个双端队列`ArrayDeque`,它可以被用作一个...
Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: 1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间...
Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过...
在 Java 中,内存被分为两种:栈内存和堆内存。 栈内存是指在函数中定义的一些基本类型的变量和对象的引用变量。这些变量在函数的栈内存中分配,当超过变量的作用域后,Java 会自动释放掉为变量分配的内存空间,该...
### 深层解析Java虚拟机中的栈与堆:对象的内存分布 #### 核心概念:栈与堆的本质及作用 在Java编程语言中,理解栈(stack)和堆(heap)的概念及其工作原理对于深入掌握Java虚拟机(JVM)如何管理内存至关重要。栈和堆...
Java内存管理是编程过程中的重要概念,涉及到程序的性能和稳定性。在Java中,内存主要分为四个区域:寄存器、栈、堆和方法区(包括常量池)。以下是这四个区域的详细说明: 1. **寄存器**: 这是计算机硬件的一部分...
Java内存管理是编程中至关重要的一个环节,尤其是对于大型、长时间运行的应用来说,内存泄漏和内存无法回收可能导致系统性能下降,甚至导致系统崩溃。本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并...
Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了程序中各个线程如何访问和修改共享变量,以及如何确保数据的一致性。深入理解Java内存模型对于编写高效的并发程序至关重要。本文...
Java内存管理是Java编程中的核心概念,它涉及到程序运行时数据的存储、分配以及回收。在Java中,内存主要分为堆内存(Heap)和栈内存(Stack),还有方法区(Method Area)、程序计数器(PC Register)以及本地方法...
### Java内存机制学习和使用 #### 一、Java内存机制概览 Java内存管理是Java开发人员必须掌握的核心概念之一。良好的内存管理不仅能够提升应用性能,还能避免常见的内存泄漏问题。本文旨在深入探讨Java内存机制,...
Java内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)五大部分: 1. **堆**:Java对象主要存储在堆中,它是所有线程共享的一块区域。...
Java内存结构可以分为六个部分:寄存器、栈、堆、静态存储、常量存储和非RAM存储。其中,堆和栈是Java程序运行时最重要的两个存储区域。 堆(Heap)是Java程序运行时的主要存储区域,用于存储对象实例和数组。堆的...
Java内存模型主要分为三个区域:堆内存(Heap)、栈内存(Stack)和方法区(Method Area),在Java 8及以后版本,还包含了元空间(Metaspace)。每个区域都有其特定的用途: 1. **堆内存**:存储所有对象实例和数组...