`

Java堆(heap)与栈(stack)

 
阅读更多
1.1 Java栈
Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放。
StackOverflowError:如果在线程执行的过程中,栈空间不够用,那么JVM就会抛出此异常,这种情况一般是死递归造成的。
1.2 堆
Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等。



1.Java自动管理堆(heap)和栈(stack)

堆(heap)与栈(stack)都是Java用来在内存中存放数据的地方。与C++不同,Java自动管理堆(heap)和栈(stack),程序员不能直接地设置栈(stack)或堆(heap)。

2. 栈快堆慢,栈静堆动,栈左堆右

栈(stack)的优势是,存取速度比堆(heap)要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈(stack)中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈(stack)数据可以共享,详见第3点。堆(heap)的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

3. 基本类型存在于栈(stack)中,数据可以共享

Java中的数据类型有两种。一种是基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是,自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈(stack)中。另外,栈(stack)有一个很重要的特殊性,就是存在栈(stack)中的数据可以共享。假设我们同时定义:
int a = 3; 
int b = 3; 

编译器先处理int a = 3;首先它会在栈(stack)中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈(stack)中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。
特别注意的是,这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也即刻反映出这个变化。相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例,我们定义完a与b的值后,再令a=4;那么,b不会等于4,还是等于3。在编译器内部,遇到a=4;时,它就会重新搜索栈(stack)中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
分享到:
评论

相关推荐

    java中堆(heap)和堆栈(stack)有什么区别

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...

    堆(heap)与栈(stack)的区别

    堆(heap)与栈(stack)是计算机内存管理中的两种基本数据结构,用于存储程序运行时产生的临时变量。在C语言中,这两种内存区域有非常明确的区分,对于理解程序的内存分配和回收具有重要意义。 首先,栈是一种特殊...

    Java中堆内存与栈内存分配浅析

    程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的工作原理及其区别对于优化程序性能、避免内存泄漏等问题至关重要。本文将深入探讨Java中堆内存与栈内存...

    Java中堆内存和栈内存详解

    本文将深入探讨Java中的两种主要内存区域:堆内存(Heap Memory)和栈内存(Stack Memory)。这两种内存分别承担着不同的角色,对于程序员理解和优化Java程序至关重要。 #### 二、栈内存 栈内存主要用于存储方法的...

    详解java堆和栈

    在Java编程中,理解堆(Heap)和栈(Stack)的概念及其区别对于程序员来说至关重要。本文将深入剖析这两个概念,并探讨它们之间的差异以及如何影响程序的运行。 #### 二、Java中的栈(Stack) Java中的栈主要用于...

    Java中堆与栈的内存分配.pdf

    在Java中,内存被分为两部分:堆(Heap)和栈(Stack)。堆是用来存放对象的,它是由Java虚拟机(JVM)管理的。栈是用来存放基本类型的变量和对象的引用变量的,它是由Java编译器管理的。 2. 堆的内存分配 在Java...

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area),其中堆是用于存储对象实例的主要区域,当堆空间不足时,就会抛出`OutOfMemoryError: Java heap space`。 1. **调整JVM堆大小**:可以...

    关于Java栈与堆的思考

    在Java中,栈(Stack)与堆(Heap)是用于存储数据的主要区域,它们各自承担着不同的职责,对于理解Java程序的运行机制至关重要。 ### 一、栈与堆的概念及特点 #### 1. 栈(Stack) 栈是一种先进后出(LIFO,Last...

    java 栈和堆,Java自动管理栈和堆

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    java 虚拟机 内存和栈 分析工具 ha456.rar

    Java内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)五大部分: 1. **堆**:Java对象主要存储在堆中,它是所有线程共享的一块区域。...

    关于Java栈与堆的思考-

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    区别Java中的堆与栈

    与堆不同,Java的栈用于存储基本类型变量和对象的引用。栈是一种线性的数据结构,遵循先进后出(LIFO)的原则。当函数调用发生时,相应的局部变量和参数会被压入栈中;当函数返回时,这些数据将从栈中弹出,释放所占...

    记录java.lang.OutOfMemoryErrorJava heap space的情况.docx

    在Java程序中,`java.lang.OutOfMemoryError: Java heap space` 是一个常见的错误,意味着程序在运行过程中耗尽了JVM分配的堆内存。这个错误通常发生在创建大量对象或者单个对象占用过多内存时。 一、问题描述与...

    Java中堆与栈的区别[参考].pdf

    Java编程语言中的堆和栈是两种不同的内存区域,它们各自有着特定的作用和特点。栈主要负责存储基本类型变量和对象的引用,而堆则用于存储对象实例。 1. 栈(Stack): 栈是一种线性数据结构,具有后进先出(LIFO)...

    Java中堆与栈的区别.pdf

    Java编程语言中,堆(Heap)和栈(Stack)是两种不同的内存区域,它们各自具有特定的功能和使用场景。理解这两者之间的区别对于优化代码性能和避免内存问题至关重要。 栈主要存储基本数据类型(如int、float、...

    java中堆和栈的区别.pdf

    Java中堆和栈的区别 Java是一种面向对象的编程语言,它的内存管理机制是自动化的,程序员不需要手动地分配和释放内存。Java中堆和栈是两个重要的概念,它们都是Java用于在RAM中存放数据的地方。 栈(Stack)是一块...

    The Run-time Heap and Stack

    在IT领域,尤其是在操作系统与编程语言的运行时环境中,“运行时堆和栈”(The Run-time Heap and Stack)是理解程序内存管理的核心概念。本文旨在深入解析这一主题,结合提供的部分文档内容,详细阐述堆和栈的区别...

Global site tag (gtag.js) - Google Analytics