一 基本结构
二 程序计数器(PC)
PC 寄存器是每个线程的私有空间,JAVA虚拟机会为每一个JAVA线程创建PC寄存器。任意时刻,一个JAVA线程总是在执行一个方法,这个方法被称为当前方法,如果当前方法不是本地方法,PC 寄存器就会指向当前正在被执行的指令。如果当前方法是本地方法,那么PC寄存器的值就是undefined。
三 堆
JAVA堆是和JAVA应用程序关系最为密切的内存空间,几乎所有的对象都放在堆中。
堆空间的一般结构 如下图
在绝大多数情况下,对象首先分配在eden区,在一次新生代回收后,如果对象还存活,则会进入S0 或者S1,之后,每经过一次新生代回收,如果对象存活,它的年龄就会加1。当对象的年龄到达一定条件后,就会被认为老年对象,从而进入老年代。
四 栈
栈的结构 如下图
由于每次函数调用都会生产对应的栈帧,从而占用一定的栈空间,因此,如果栈空间不足,那么函数调用自然无法进行下去,当请求的栈深度大于最大可用栈深度时,系统就会抛出StackOverflowError栈溢出错误。
局部变量表
局部变量表示栈帧的重要组成部分之一。用于保存函数的参数以及局部变量。如果函数的参数和局部变量较多,会使得局部变量膨胀,从而每一次函数调用就会占用更多的栈空间
操作数栈
用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。
帧数据区
保存着访问常量池的指针,方便程序访问常量池。
五 方法区
方法区是一块所有线程共享的内存区域。他用保存系统的类信息,比如类的字段,方法,常量池等。方法区的大小决定了系统可以保存多少类,导致方法区溢出。在JDK 6,7中可以理解为永久区。如果系统使用了一些动态代理,那么有可能在运行时生产大量的类。如果这样就需要设置一个合理的永久