jvm在运行时,数据区域通常划分为:堆、栈、本地方法栈、程序计数器、方法区,如图
-
程序计数器
也被称作PC寄存器,用于存储程序将要执行的指令代码,由执行引擎读取下一条指令
它是程序执行流程的指示器,分支、循环、跳转等基础功能都要依赖这个计数器完成
程序计数器内存空间较小,但运行速度是最快的
每个线程都有其自己的程序计数器,并且是线程私有的,生命周期与线程生命周期一致
由于它仅存储执行指令,它是唯一一个在 JVM 中没有 OutOfMemoryError 的情况的区域
我们可以通过 javap -v .class 反编译字节码文件
-
Java栈
也被称作虚拟机栈:保存局部变量以及部分结果,并参与方法的调用与返回
栈是一种快速有效的分配存储的方式,访问速度仅次于程序计数器
栈操作只有两种:方法执行时进栈;方法结束后出栈
栈解决程序运行的问题,程序如何执行,怎么处理数据等等
每个线程,都会创建一个虚拟机栈,并且是线程私有的,其内部保存栈帧,对应着方法调用
-
Java堆
存储实体,即创建的对象(首地址存放在栈中)
堆解决数据存储的问题,数据如何存,存哪里
堆内存的变量都有默认初始化值,不同类型不一样
当实体不再使用时,就会被垃圾回收机制处理
-
本地方法栈
本地方法栈,用于管理本地方法的调用,线程私有
本地方法是使用C或C++语言实现的方法,是非Java语言开发的Java方法,通过接口实现
-
方法区
是被线程共享的区域,JVM在装载类文件时,用于存储类型信息,即类的描述信息:类的基本信息(类的限定名,类的直接父类的限定名,类的类型如接口,类的访问修饰符,直接超接口的全限定名的有序列表),已加载的类的详细信息(运行常量池,字段信息,静态变量,到类classloader的引用,到类class的引用等)