堆栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧,用来存储局部变量、操作数、方法出口等每个线程都有一个栈,用于存放该线程执行方法的信息栈属于线程私有,不能实现线程间共享栈的存储特点是先进后出、后进先出栈是由系统自动分配,速度快。栈是一个连续的内存空间
方法区对用于存储创建好的对象JVM中只有一个堆,被所有线程共享堆是一个不连续的内存空间,分配灵活,但是速度慢
对比方法区可以有不同的实现
(1)JDK7以前是“永久代”
(2)JDK7部分去除“永久代”,静态变量、字符串常量池都放到了堆内存中
(3)JDK8是“元数据空间”和堆的结合JVM只有一个方法区,被所有线程共享方法区的本质也是堆,但只用于存放类和常量等相关的信息用来存放程序中永远不变或唯一的内容,如:类信息、静态变量、字符串常量等
栈 1.存放局部变量 2.不可以被多个线程共享 3.空间连续,速度快
堆 1.存放对象 2.可以被多个线程共享 3.空间不连续,速度慢,但是灵活
方法区 1.存放类的信息:代码、静态变量、字符串常量等等 2.可以被多个线程共享 3.空间不连续,速度慢,但是灵活



