java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干不同区域:有些是依赖用户线程的启动和结束而创建和销毁的,有的则是随着虚拟机进程的启动而存在。
线程共享区域:方法区 、堆。
线程隔离(各个线程独有区域)虚拟机栈、本地方法栈、程序计数器。
方法区 | 虚拟机栈 | 本地方法栈 |
堆 | 程序计数器 | 程序计数器 |
线程共享区域 | 线程隔离 | 线程隔离 |
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量
堆:存放对象实例(几乎所有的对象)
虚拟机栈:描述的是java方法执行的内存模型,也就是每个方法执行时都会创建一个栈帧(stack frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法的调用直至执行完成的过程就是一个栈帧在虚拟机中的入栈到出栈的过程(划分内存)。(涉及到创建栈帧,划分内存。所以会有两种异常StackOverflowError,OutOfMemoryError)
本地方法栈:虚拟机native方法执行内存。
程序计数器:线程执行字节码行号指示器(当做路灯或者节点开关:也就是多线程切换分配处理器后的执行位置的指示)