本文主要是介绍深入理解Java虚拟机——Java内存区域,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
- 一、Java内存区域——简介
- 二、Java内存区域——程序计数器
- 三、Java内存区域——java虚拟机栈
- 3.1、虚拟机栈
- 3.2、栈帧
- 3.3、局部变量表
- 3.4、虚拟机栈大小
- 四、Java内存区域——本地方法栈
- 五、Java内存区域——java堆
- 六、Java内存区域——方法区
- 七、Java内存区域——直接内存和运行时常量池
-
一、Java内存区域——简介
二、Java内存区域——程序计数器
- 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。
- 程序计数器处于线程独占区。
- 如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是native方法,这个计数器的值为undefined。
- 此区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域
三、Java内存区域——java虚拟机栈
3.1、虚拟机栈
3.2、栈帧
- 每个方法执行,都会创建一个栈帧,伴随着方法从创建到执行完成。用于存储局部变量表,操作数栈,动态链接,方法出口等。
3.3、局部变量表
- 存放编译期可知的各种基本数据类型,引用类型,renturnAddress类型。
- 局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧中分配多少内存是固定的,在方法运行期间是不会改变局部变量表的大小。
3.4、虚拟机栈大小
- 超出虚拟机栈大小,会报如下错误
StackOverflowError
OutOfMemory
四、Java内存区域——本地方法栈
- 虚拟机栈为虚拟机执行java方法服务。
- 本地方法栈为虚拟机执行native方法服务。
五、Java内存区域——java堆
- java堆用于存放对象实例。
- java堆是垃圾收集器管理的主要区域。
- 超出堆的大小会报OutOfMemory。
- 调整堆的大小参数 -Xmx和-Xms。
六、Java内存区域——方法区
- 方法区存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。类的信息包括类的版本、字段、方法、 接口等。
- 超出方法区大小会报 OutOfMemoryError错误。
七、Java内存区域——直接内存和运行时常量池
7.1、直接内存
- 直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中所定义的内存区域,但是它是确实存在的一块区域,并且被频繁使用。
- 在jdk1.4新增了NIO,引入了基于通道与缓冲区IO方式,可以使用netty函数库分配堆外内存,然后通过存储在java堆中的 DirectByteBuffer对象作为这块内存的引用进行操作,也就是说可以分配堆外内存,不受制于java虚拟机的制约,但会受到当前操作系统内存制约。
7.2、运行时常量池
- 运行时常量池属于方法区的一块区域,存储编译期生成的各种字面量以及符号引用,这部分内容在类加载后进入方法区
的运行时常量池中。
这篇关于深入理解Java虚拟机——Java内存区域的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!