栈的特点:
- 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧,存储局部变量、操作数、方法出口;
- JVM 为每一个线程创建一个栈,存放该线程执行方法的信息;
- 栈属于私有,线程间不共享;
- 先进后出,系统自动分配,速度快,存储空间连续。
堆的特点:
- 堆用于存储创建好的对象(数组也是对象);
- JVM 只有一个堆,被所有线程共享;
- 堆是一个不连续的内存空间,分配灵活,速度慢;
- 堆上的区域被垃圾回收器做进一步划分:新生代、老年代等。
方法区(也是堆)的特点:
- 方法区是JAVA虚拟机规范,有不同实现(jdk8 以后是元数据空间和堆结合起来实现);
- JVM 只有一个方法区,被所有线程共享;
- 方法去其实也是堆,只是用来存储类、常量相关信息;
- 用来存放程序中永远不变或者唯一的内容(类信息、静态变量、字符串常量等);
- 常量池只要存放常量:文本字符串、final常量值等。