C++和Java之间有堵由内存动态分配和垃圾收集技术所围成的墙,墙外的人想进去,墙内的人却想出去 ---《深入理解Java虚拟机》
程序计数器
- 每一个Java线程都拥有自己的程序计数器,用于记录当前正在执行的字节码指令的地址
- 如果一个线程正在执行的是本地方法(Native),则程序计数器的值为空(Undefined)。
Java虚拟机栈(单位是slot)
栈帧:
用于存储局部变量表,操作数栈,动态连接,方法出口等
局部变量表:
- 八种基本数据类型:bool,byte,short,char,int,float,double,long,(其中long和double会占据两个变量槽--slot)
- 对象的引用(例如在方法当中new一个对象,会将引用存放局部变量表中)
并且,栈帧的大小在编译器就确定了大小(slot的数量)
slot的大小是由jvm决定的
关于异常
栈帧过深:抛出StackOverflowError,表明栈的深度超出了虚拟机的所允许的深度
内存不够:抛出OutOfMemoryError,表明无法申请到新的内存
本地方法栈
主要用于为本地方法(Native)服务
同时也会像java虚拟机栈一样报出StackOverflowError和OutOfMemoryError
Java堆
存放所有的对象,数组
在《Java虚拟机规范》中,堆可以处于物理上不连续的内存空间,但在逻辑上应该是连续的。
方法区
用于存储已加载的类型信息,常量,静态变量,即使编译器编译后的代码缓存