程序计数器:
比较小的内存空间,可以看成是当前线程所执行的字节码的行号指示器
字节码解释器工作时就是通过改变它的值来选取下一条需要执行的字节码指令
为什么每个线程都要有一个独立的程序计数器?
因为任何一个确定的时刻,一个处理器只会执行一条线程中的指令,线程会一直切换,为了让线程切换后能恢复正确的执行位置
Java虚拟机栈:
每个方法被执行的时候,虚拟据会同步创建一个栈帧放到虚拟机栈中,调用入栈,执行完毕出栈
栈帧又包含了:局部变量表,方法出口,操作数栈,动态连接(后面两个什么鬼)等信息
局部变量表:八大基本数据类型以及对象引用reference
本地方法栈:
和虚拟机栈的区别:虚拟机栈是为虚拟机执行Java方法的(字节码服务)
本地方法栈则是为虚拟机使用到的本地方法服务Native!
native:java的作用范围达不到,会去调用底层的C语音的库
通过JNI调用本地方法接口
JNI的作用:融合不同的语言让java为所欲为
本地方法区:
用于存储以及被虚拟机加载的类信息,常量,静态变量(貌似有个常量池)
以前是用永久代实现方法区,所以很多人觉得永久代等于方法区
1.6常量池在方法区中,1.7常量池在堆中,1.8常量池在元空间(方法区)中
Java堆:
所有的对象实例和数组都是在里面分配内存,也称GC堆
分为元空间,Eden,Old