JVM知识点-JVM内存模型
注:更多文章,可以进入我的博客:筱白博客
JVM(Java Virtual Machine)是用来运行Java字节码的虚拟机。
1、JVM的内存区域划分
JVM的内存区域分为线程私有区域(程序计数器、Java虚拟机栈、本地方法栈)、线程共享区域(堆、方法区)。
1.1、线程私有区域
① 程序计数器
记录着当前线程执行的字节码位置,每个线程工作时都有独立的程序计数器,只为执行Java方法服务,如果执行 Native方法时,程序计数器为空。它是唯一没有Out Of Memory(内存溢出)的区域。
② Java虚拟机栈
又称方法栈,线程每执行一个方法时就会创建一个栈帧,这个栈帧包含该方法的局部变量表,操作数栈,动态链接,方法出口等信息,调用方法时执行入栈,方法执行完后执行出栈。当栈帧过多时(没有递归出口的递归操作),则会抛出SOF异常。
③ 本地方法栈
与Java虚拟机栈类似,也是用来保存执行方法的信息,执行Java方法是使用Java虚拟机栈,执行Native方法时则使用本地方法栈。
1.2 线程共享区域
① 堆
JVM内存管理最大的一块,几乎所有的对象实例都会放在这里(逃逸分析),当堆没有可用空间时,会抛出OOM异常。根据对象的存活周期不同,JVM把对象进行分代管理,可以划分为新生代和老年代。
②方法区
又称非堆区,用于存储被类加载器加载后的类信息、常量、静态变量等。
别称:JDK1.7 的永久代和1.8的元空间都是方法区的一种实现。