JVM
首先JVM分为五大部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区;
线程共享:堆、方法区;
线程隔离:程序计数器、虚拟机栈、本地方法栈;
-
程序计数器:字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成;
注意点:如果线程执行的java程序,计数器记录的虚拟机字节码指令的地址,如果是Native()则为空;
这是JVM中唯一一块不会出现OOM的区域; -
虚拟机栈:描述java方法执行的内存模型
每个方法被执行时都会创建一个栈帧来记录局部变量表,操作数栈,方法出口,动态链接等…方法的调用相当于一个栈帧从虚拟机栈中入栈到出栈的过程;
常见异常:
StackOverFlowError:线程请求的栈深度大于虚拟机栈允许的栈深度;
OOM:当动态拓展无法申请到足够的内存空间; -
本地方法栈:为虚拟机使用到的native方法服务,底层调用的可能是c或者c++,也会有常见的SOFE和OOM异常;
-
堆:虚拟机中管理内存最大的一块区域,主要存放的是对象实例和数组;
-
方法区:存放的是被虚拟机加载的类信息、常量、静态变量等;
下一篇介绍堆中的垃圾回收;