提示:文章写完后,目录
在这里插入代码片
可以自动生成,如何生成可参考右边的帮助文档
JVM内存模型分析
java虚拟机在运行java程序的时候,会将内存划分为5个不同的内存空间,每个内存空间存放不同的数据,这5个区域也叫作运行时数据区,接下来将会介绍五个内存空间。
一、程序计算器
- 程序计数器的内存空间最小,它是字节码指令的行号指示器。
- 如果程序运行的是java方法,则程序计算器记录的是正在执行字节码指令的地址;如果程序运行的是native方法,则程序计算器为空。因为native方法是java的作用域达不到的,没有在字节码文件中。
- 程序计算器是5个内存空间中唯一一个不会出现OutOfMemoryerror(OOM)异常的内存空间。
- 程序计数器是线程私有的
二、方法区
- 用来存储被虚拟机加载的类信息、常量、静态变量和即时编译的代码块
- 线程共享
三、虚拟机栈
- 线程私有
- 每个方法执行的时候都会创建一个栈帧,栈帧用于存储局部变量表、操作数栈、动态链接、出口地址等信息
- 方法请求的栈深度超过虚拟机所允许的栈深度,将会报stackOverflow错误
- 如果虚拟机栈可以扩展深度,如果不能再申请足够的内存则将会报OOM异常
四、本地方法栈
- 其功能和虚拟机栈类似,区别在于虚拟机栈为虚拟机的java方法服务,而本地方法栈是为了给虚拟机的本地(navie)方法服务(即用C++或C语言写的方法)。
- 其同样可能会产生栈溢出和内存溢出的问题
- 线程私有
五、堆
- 内存中最大的一块,几乎所有的实例对象和数组都在堆上分配
- 线程共享