Java虚拟机的内存布局
JVM是Java提出的核心概念,其中的内存模型(JMM)是JVM的重点,需要我们重点了解掌握
JVM内存划分:
1、方法区 (线程共享) 常量 静态变量 JIT(即时编译器)编译后代码也在方法区存放
2、堆内存(线程共享) 垃圾回收的主要场地
3、程序计数器 当前线程执行的字节码的位置指示器
4、Java虚拟机栈(栈内存) :保存局部变量,基本数据类型以及堆内存中对象的引用变量
5、本地方法栈 (C栈):为JVM提供使用native方法的服务
(1)程序计数器(PC寄存器)
程序计数器的定义:程序计数器是一块较小的内存空间,是当前线程正在执行的哪一条字节码指令的地址,
若当前线程正在执行的是一个本地方法,那么此时程序计数器为Undefined
(2)Java虚拟机栈
描述Java方法运行过程的内存模型
主管Java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,
对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,生命周期和线程一致,是线程私有的。
(3)本地方法栈(C栈)
是为了JVM运行native方法准备的空间,由于很多native方法都是用C语言实现的,所以通常又叫C栈,
它与Java虚拟机栈实现的功能类似,只不过本地方法栈描述本地方法运行过程的内存模型.
(4)堆
堆是用来对象的内存空间,几乎所有的对象都存储在堆中
堆这块区域是JVM中最大的,应用的对象和数据都是存在这个区域,这块区域也是线程共享的,也是 gc 主要的回收区,
一个JVM实例只存在一个堆类存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,以方便执行器执行
(5)方法区
Java虚拟机规范中定义方法区是堆的一个逻辑部分,方法区存放以下信息 已被虚拟机加载的类信息 /常量 /静态变量 /即时编译后代码
线程共享.方法区是堆的一个逻辑部分,因此和堆一样,都是线程共享,整个虚拟机中只有一个方法区
本人才疏学浅,如有错误,烦请指出,谢谢!