Java基础:JVM中的堆和栈的理解

【摘要】 问题:栈是什么?
栈是一种数据结构,特性是先进后出。栈是配合程序(线程)执行的结构体,也就是说程序的执行不能没有栈,但是可以没有堆。程序执行时,栈的作用流程:执行下面代码时,栈的操作流程
int add(a, b){ return a+b;}
int a = 1;
int b = 2;
int c = add(a,b);
1234

1和2进行压栈。预留…

问题:栈是什么?

  • 栈是一种数据结构,特性是先进后出。
  • 栈是配合程序(线程)执行的结构体,也就是说程序的执行不能没有栈,但是可以没有堆。
  • 程序执行时,栈的作用流程:执行下面代码时,栈的操作流程
int add(a, b){ return a+b;} 
int a = 1; 
int b = 2; 
int c = add(a,b); 

  
 

在这里插入图片描述

  1. 1和2进行压栈。
  2. 预留c的值位置压栈。
  3. 调用程序,预留返回位。
  4. 将传入的值压栈,计算出值后,将值赋到c上。
  5. 返回指针位(不删除数据,而是调整指针位进行覆盖)。

问题:堆是什么?

  • 最关键的概念:JVM中的堆并不是一种数据结构,而是所有数据结构存放的地方。而数据结构中的堆是一种树状数据结构(最小堆、最大堆)。
  • JVM中的堆提供了存储数据的能力(申请内存、回收内存、托管内存)。
  • GC是堆的管控者。

问题:堆和栈的关系是什么?

  • 栈中的引用会指向堆中的实例,但是栈并非不能放数据,它是可以存放临时数据(很小的数据)。
  • 内存分配层面:堆从低位到高位分配内存,栈从高位到低位分配内存,中间部分就是未被分配的可分配空间。
    在这里插入图片描述

问题:JVM中的内存布局是怎样的?

  • 栈中引用的数据存放在栈中。
  • 栈中的对象实例的元数据(类信息、编译后的代码、常量)存放在方法区(旧意义上的永久代)。
  • 本地内存主要存放的是:引用的Native对象(C/C++中的数据),对象和操作系统内核间通过内存映射构造的缓冲区。

在这里插入图片描述

文章来源: blog.csdn.net,作者:萌白在努力,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/k295330167/article/details/115912783

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享