程序计数器
线程私有的,随着线程创建和销毁。
指当前线程正在执行的字节码地址(行号)。Java是多线程的,意味着有线程切换,确保多线程下程序能够正常执行。
虚拟机栈
线程私有的,随着线程创建和销毁。
为什么使用栈结构,因为符合方法间的调用,例如:A方法调用B,B调用C,最后是C结束,B结束,A结束,先进后出的顺序。
每个方法执行的时候,会创建一个帧栈,帧栈可以分为:局部变量表,操作数栈,动态链接,返回地址。
局部变量表存放基本数据类型,引用变量等;操作数栈进行的是一些操作,比如count++;动态链接最主要的是实现多态,动态绑定;返回地址是调用该条字节码指定的下一条地址。可以通过javap –v xxx.class >1.txt,反编译class文件,得到一个jvm执行的文件。
如果递归调用,没有结束条件的情况下,会报栈溢出的异常,StackOverFlowError。
本地方法栈
线程私有,随着线程创建和销毁。
当java调用native方法的时候,虚拟机不再创建方法帧栈,而是用动态链接,直接调用native方法。
堆
方法区
线程共享。
存放类信息,静态变量,常量,jit即时编译后的代码。
堆
线程共享。
主要存放对象和数组。