Java多线程的线程会切换,为了保存线程切换前的正确执行位置,每个线程都应该有程序计数器,因此程序计数器是线程私有的线程执行Java方法时,程序计数器记录的是正在执行的虚拟机字节码指令地址线程执行本地方法时...a入栈,常数2入栈,执行相加的字节码指令,它们都出栈,然后把和再入栈)操作数栈中的数据类型必须与字节码指令匹配(比如 a=a+2都是Int类型的,字节码指令应该是iadd操作int类型相加,而不能出现不匹配的情况...(程序计数器的值)异常调用完成: 遇到异常未捕获(未搜索到匹配的异常处理器)以异常调用完成方式退出方法,不会在栈帧中保存信息,通过异常处理器来确定附加信息增加一些《Java虚拟机规范》中没有描述的信息在栈帧中...异常关于栈的两种异常线程请求栈深度大于JVM允许深度,抛出StackOverflowError异常栈扩展无法申请到足够内存 或 创建线程无法申请到足够的内存时,抛出OOM异常测试StackeOverflowError...堆的目的就是为了存放对象实例数据生命周期因为大部分对象实例都是存放在堆中,所以JVM启动时,堆就创建了 (注意这里的大部分,不是所有对象都存储在堆中)又因为线程都要去用对象,因此堆是线程共享的堆内存堆的内存在物理上是可以不连续的