主要分为栈,堆,方法区,程序计数器
1.程序计数器
2.栈(stack)
①虚拟机栈:每个线程独生成一个栈,线程中每调用一个方法生成一个栈帧,栈帧依次压栈
栈帧中存放了每个方法的基本数据变量,对象的引用,操作指令,出口信息等
②本地方法栈:存放的是native方法(其他语言写的),其他和虚拟机栈一样
可能出现的异常:如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError(栈溢出异常,单线程递归容易出现,个人觉得叫栈帧溢出比较好);
如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError(内存溢出异常,多线程递归的时候容易出现)
栈的优点:a.访问速度比堆快,仅次于cpu的寄存器
劣势:只有单个stack的数据可以共享
3.堆(heap)
jvm中最大的一块内存,线程共享的,存放对象实例,不被引用的对象,会被GC清理,释放内存
可能出现的异常:OutOfMemoryError
4.方法区(method)
和堆一样被所有线程共享,存放了所有class ,static变量,final变量,存放着程序中唯一
还有主内存和工作内存