线程共享:Java堆,方法区
线程私有:本地方法栈,Java虚拟机栈,程序计数器
Java堆:存放的就是我们new出来的对象和数组。根据GC可划分为新生代和老年代,新生代又可划分为eden,from survior,to survior区域(配置比列大概是8:1:1)。
方法区:存放的就是虚拟机加载的类信息,常量,静态变量,即使编译器编译的代码等数据。运行时常量池。此处发生GC主要是对常量的GC。
Java虚拟机栈:当一个JVM进程启动时,就建立了一个Java虚拟机栈(大小由我们分配的参数而定)。在运行方法时,每个方法是以栈帧的形式入栈,每个栈帧由局部变量表,返回地址,操作符号表组成。局部变量表是在编译时确定的,由方法参数和局部变量的内存大小可确定局部变量表的大小,且一旦确定就不再改变。如果栈帧不断加深,当方法栈的内存不够用的时候将抛出StackOverflowError。如果允许动态扩展,则会一直扩展,直到超出了给当前程序分配的最大内存,抛出OutOfMemoryError。
本地方法栈:同Java方法栈类似,只不过调用的是native方法。
程序计数器:我们知道进程是CPU分配资源的单位,线程则是CPU调度的单位。所以每个线程必须要有自己的程序计数器,才能保存当前环境,知道当前线程运行到了那一步,从而切换回当前线程执行的时候,能从正确的位置恢复执行。
网友评论