美文网首页测试开发那些事儿
JVM中的堆和栈到底存储了什么

JVM中的堆和栈到底存储了什么

作者: 测试开发Kevin | 来源:发表于2020-03-16 10:52 被阅读0次

JVM数据区

先上一张Java虚拟机运行时数据区中堆、栈以及方法区存储数据的概要图,如下所示:

然后我们来具体解析一下堆和栈

堆是存储时的单位,对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组。

栈是运行时的单位,Java 虚拟机栈,线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。

局部变量表:存放了编译期可知的各种基本类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型)和 returnAddress 类型(指向了一条字节码指令的地址)

堆和栈的对比

一、栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

二、栈因为是运行单位,因此里面存储的信息都是跟当前线程相关的信息。包括:局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。

三、在方法中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。堆内存用于存放由new创建的对象和数组。

四、在Java中一个线程就会相应有一个线程栈与之对应,这点保证了程序的并发运行。

而堆则是所有线程共享的,也可以理解为多个线程访问同一个对象,比如多线程去读写同一个对象的值

五、栈内存溢出包括StackOverflowError和OutOfMemoryError。StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度。OutOfMemoryError:如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存;堆内存溢出是OutOfMemoryError。如果堆中没有内存完成实例分配,并且堆也无法再扩展时,抛出OutOfMemoryError异常。

代码分析

最后,借助网上看到的一个例子帮助对栈内存,堆内存的存储进行理解:

对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化:

1. main

方法开始执行:int date = 9;

date

局部变量,基础类型,引用和值都存在栈中。

2. Test test = new Test();

test

为对象引用,存在栈中,对象(new Test())存在堆中。

3. test.change(date);

调用change(int i)方法,i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。

4. BirthDate d1= new BirthDate(7,7,1970);

调用BIrthDate类的构造函数生成对象。

d1为对象引用,存在栈中;

对象(new BirthDate())存在堆中;

其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中;

day,month,year为BirthDate对象的的成员变量,它们存储在堆中存储的new BirthDate()对象里面;

当BirthDate构造方法执行完之后,d,m,y将从栈中消失。

5.main方法执行完之后。

date变量,test,d1引用将从栈中消失;

new Test(),new BirthDate()将等待垃圾回收器进行回收。

相关文章

  • JVM中的堆和栈到底存储了什么

    JVM数据区 先上一张Java虚拟机运行时数据区中堆、栈以及方法区存储数据的概要图,如下所示: 然后我们来具体解析...

  • JVM学习——运行时数据区

    一,JVM内存结构 JVM内存主要分为:堆内存、方法区和栈 堆内存存储对象实例,由新生代和老年代组成 方法区存储类...

  • Java对象内存模型和GC机制

    JVM中的堆和栈,方法区 1.栈是运行时的单位,堆是存储的单位。2.栈解决程序的运行问题,即程序如何执行,如何处理...

  • Java大佬之学习历程(一)

    基础篇 JVM: ①JVM内存结构: 堆、栈、方法区、直接内存、堆和栈区别, ②JVM参数及...

  • JAVA与JVM

    JVM(JAVA虚拟机) 虚拟机分为栈和堆: 堆:回收:堆是由GC来负责回收的。存储类型:主要存储对象、静态成员变...

  • JVM内存模型和GC的解析

    JVM调优是调整:方法区和堆(主要是堆) 栈管运行,堆管存储 堆和方法区是所有线程共享的内存区域;栈和程序计数器是...

  • JAVA内存模型-深入理解CPU-STACK内存走向

    JAVA 内存模型-堆和栈: 堆栈存储结构 堆 存放运行时创建的对象、数组。为JVM的主内存,为所有线程共享。 栈...

  • JVM调优

    一、理解堆和栈的区别1:堆是存储数据的,栈中是存储程序的执行逻辑2:堆中存放基本数据类型以及对象的引用,栈中存储对...

  • JAVA面试问题

    1.Java中堆和栈有什么不同? 每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变...

  • JVM基础结构与字节码执行引擎

    JVM基础结构 JVM内部结构如下:栈、堆。 栈 JVM中的栈主要是指线程里面的栈,里面有方法栈、native方法...

网友评论

    本文标题:JVM中的堆和栈到底存储了什么

    本文链接:https://www.haomeiwen.com/subject/ctnwehtx.html