CPU执行程序的大致过程
1.把程序从磁盘加载到内存;
2.CPU从内存中读取指令;
3.CPU执行指令,到内存中获取数据;
4.执行结束,释放内存;
整个过程如下图:
程序运行时的栈(栈帧)和堆
假设有这样一段程序
public class Test {
public static void main(String[] args) {
Object obj = new Object();
method();
}
}
栈和栈帧
当程序运行后,会创建一个线程,这个线程会申请线程栈,每调用一个方法,都会往这个线程栈里添加一个栈帧(Stack Frame),方法里的变量就是存放在栈帧里的。每当一个方法执行完毕,就会弹出一个栈帧,直到栈帧为空,线程执行完毕。
堆
当方法中出现了new Object(),这时,新new出来的Object就会被放入内存中,接着,再把引用指向内存中该对象。
上面程序对应的栈和堆的示意图如下:
垃圾回收
当线程执行完毕后,线程栈里的变量全部都会被清空,相当于对象的引用不存在了,这时,堆里没有被引用的对象就已经相当于“死亡了”,只是考虑到效率,不会立马回收,而是通过垃圾收集器在特定的时机来做。