jvm虚拟机按运行时内存使用区域划分:
1、方法区
2、堆
3、本地方法栈
4、虚拟机栈
5、程序计数器
其中方法区和堆是线程共享的,而:本地方法栈、虚拟机栈、程序计数器是线程隔离的(即:jvm虚拟机为每个线程创建)
程序计数器:
1、程序计数器就是记录当前线程执行程序的位置,改变了值就指向了下一个指令的位置,比如循环,方法跳转,异常处理,程序恢复等。
2、java虚拟机多线程是通过线程轮换并分配执行时间的方式来实现的,为了保证线程切换中能恢复到正确的位置,每个线程都有一个独立的程序计数器,所以程序计数器是私有的。
3、本区域是唯一一个不会出现OutOfMemMemoryError的区域。
4、如果正在执行的是一个java线程,那么计数器存储是虚拟机字节码指令地址;如果是native方法,则为空
虚拟机栈:
1、虚拟机执行java程序的时候,每个方法都会创建一个栈帧,栈帧存放在虚拟机栈内,通过压栈出栈的方式进行方法调用
2、所以虚拟机栈也是私有的,虚拟机栈生命周期和线程相同,
3、栈帧包含了方法的局部变量表、操作数栈、返回地址、动态链接等 (https://blog.csdn.net/wb_snail/article/details/80610676)
本地方法栈(native method stack):
1、虚拟机调用本地方法服务。
2、作用类似于虚拟机栈,存储本地方法的局部变量表、操作数栈、返回地址、动态链接。
3、线程私有的
堆:
1、虚拟机启动时创建的、是所有线程共享的
2、存储的是对象的实例
3、平时所说的垃圾回收说的就是堆
方法区:
1、方法区也是线程共享的的区域
2、用来存储虚拟机加载的类信息、静态变量、常量等数据
直接内存(Direct Memory):
1、不是虚拟机运行时数据区的一部分,
2、也不是Java虚拟机规范中定义的内存区域,
3、但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError异常出现。