问题:栈是什么? 栈是一种数据结构,特性是先进后出。栈是配合程序(线程)执行的结构体,也就是说程序的执行不能没有栈,但是可以没有堆。程序执行时,栈的作用流程:执行下面代码时,栈的操作流程 int add(a, b){ return a+b;} int a = 1; int b = 2; int c = add(a,b); 1和2进行压栈。预留c的值位置压栈。调用程序,预留返回位。将传入的值压栈,计算出值后,将值赋到c上。返回指针位(不删除数据,而是调整指针位进行覆盖)。 问题:堆是什么? 最关键的概念:JVM中的堆并不是一种数据结构,而是所有数据结构存放的地方。而数据结构中的堆是一种树状数据结构(最小堆、最大堆)。JVM中的堆提供了存储数据的能力(申请内存、回收内存、托管内存)。GC是堆的管控者。 问题:堆和栈的关系是什么? 栈中的引用会指向堆中的实例,但是栈并非不能放数据,它是可以存放临时数据(很小的数据)。内存分配层面:堆从低位到高位分配内存,栈从高位到低位分配内存,中间部分就是未被分配的可分配空间。 问题:JVM中的内存布局是怎样的? 栈中引用的数据存放在栈中。栈中的对象实例的元数据(类信息、编译后的代码、常量)存放在方法区(旧意义上的永久代)。本地内存主要存放的是:引用的Native对象(C/C++中的数据),对象和操作系统内核间通过内存映射构造的缓冲区。