在执行一个程序它的内存发生了什么变化?
首先知道 :
- 栈:特点 先进后出,一个连续的内存空间 ,在底层实现中是用来作为一个 方法执行的内存模型 ,每个方法被调用都会在
栈中chua创建一个栈帧(存储 局部变量,方法出口 等)。jvm 每个线程创建一个栈 - 堆:在JVM中只有一个堆,被所有线程共享
只存储创建好的对象和数组(数组也是对象)
不连续的存储空间,分配灵活,速度慢。 - 方法区(静态区):只有一个方法区,被所有线程共享 (包含在堆中,实际也是堆)
用于存储 类 常量 相关信息。
用来存放程序中不会改变的信息 如: 类对象(Class对象),静态快,字符串常量等。
执行流程相应变化:
一个程序 首先 是 类 加载 该类的信息存放在 方法块中 (存储了相关的字符串常量等相关信息)
然后 执行程序入口 (main()),在栈中创建 main的栈帧
接着 需要 创建对象 ,在栈中创建一个栈帧 (通过默认构造方法创建对象)执行对象创建(用完就会清空栈帧)
堆中相应的在一个地址上创建 该对象的信息。
调用对象的方法 和 变量。(调用堆中的地址 进行相应操作)。
程序执行 结束 通过JVM 回收机制 内存清空。