Java运行时区主要分为线程独占区和线程共享区。我们看下网上找来的这个图。
image.png
网上的图很多,找了张,其中蓝色的区域就是线程共享。绿色的区域就是线程独享的。
1、线程共享的区域随着虚拟或者GC的创建和销毁。
2、线程独占的区域随着线程的生命周期创建和销毁。
我们看下其中的具体都是什么作用。
1、方法区
方法区中存储的JVM加载进来的类信息、常量、静态变量、编译的代码等数据,是JVM的一个逻辑规划区,不同的虚拟机有不同的实现,JAVA7中方法区是放在永久带,JAVA8中方法区是放在元数据区。这块内存区是又GC进行回收,无法回收的话会出现OOM。
2、堆区
堆区和方法区一样也是线程共享的,他也是在JVM启动的时候创建,GC主要的管理区域,主要存放的是代码运行时候创建的对象,如果没有及时回收的话会出现OOM,堆内存又可以细分为老年代(Old)和新生代(Eden、From Survivor、To Survivor),新创建的对象堆放在Eden内存GCd的时候进行回收,达到一定的回收次数的时候若该对象还存活就放进老年代。采用的是复制回收算法。
3、虚拟机栈
虚拟机栈是线程独占的区域了,每个线程都会执行一个或多个方法,每执行一个方法就会创建一个栈帧,栈帧中记录有局部变量表,操作数栈,动态链接,方法返回地址和附加的信息,JVM给虚拟机栈初始化的大小是1M,超出就会出现OOM。
4、程序计数器
程序计数器也是线程独享的内存区域,记录的是下一个CPU要执行的指令的地址,如果线程执行的是native方法的话他里面记录的是default。在字节码解释器的工作原理中就是通过改变这个程序计数器中的值来获取下一条需要执行的指令的。他里面只有一条指令所以占用的内存很小而且是唯一没有OOM的内存区域。
5、本地方法栈
和Java虚拟机栈很类似,不同的是本地方法栈为Native方法服务。
网友评论