深入理解java虚拟机学习—运行时数据区域
2016-07-27 11:23
465 查看
参考资料:《深入理解java虚拟机》JVM高级特性与最佳实践第二版 周志明
java虚拟机运行时数据区域如下图:
其中 红色背景区域代表的是线程共享的内存区,而蓝色背景区域代表的是线程私有的内存区。
一、 线程共享的内存区域
1. 堆 Heap
这个区域是我们用到最多的内存区域,该区域在虚拟机启动时创建,对象实例以及数组(直观点就是使用new产生的)都在这个堆上分配,我们可以通过 -Xmx(堆最大可用内存)和 -Xms(堆初始分配内存)来控制,如果在堆中没有内存可以用来分配实例,同时堆也无法再扩展时,会抛出 OutOfMemoryError异常。
2. 方法区
这个区域用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,该区域包括了一个 运行时常量池区域,运行时常量池用于存放编译期生成的各种字面量(literal)和符号引用,这部分当内存不足时,会抛出 OutOfMemoryError异常。
二、线程私有的内存区域
1. 程序计数器
这是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,每条线程都需要有一个独立的程序计数器,各个线程之间计数器互不影响。当线程执行的是一个java方法时,计数器记录的是虚拟机字节码指令的地址;当线程执行的是Native方法时,这个计数器值为空。 此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
2. 虚拟机栈
每个方法在执行时都会创建一个栈帧,一个方法对应一个栈帧。栈帧用来存储局部变量表、操作数栈等(比如在一个方法里定义的局部变量就存在这里),每一个方法从调用直到执行完成的过程,就是这个方法对应的栈帧在虚拟机栈入栈到出栈的过程。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,那么在扩展时如果无法申请到足够的内存,就会抛出 OutOfMemoryError异常。
3. 本地方法栈
本地方法栈发挥的作用于虚拟机栈类似,只不过虚拟机栈为虚拟机执行java方法服务,而本地方法栈为虚拟机使用到的Native方法服务,本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。
java虚拟机运行时数据区域如下图:
其中 红色背景区域代表的是线程共享的内存区,而蓝色背景区域代表的是线程私有的内存区。
一、 线程共享的内存区域
1. 堆 Heap
这个区域是我们用到最多的内存区域,该区域在虚拟机启动时创建,对象实例以及数组(直观点就是使用new产生的)都在这个堆上分配,我们可以通过 -Xmx(堆最大可用内存)和 -Xms(堆初始分配内存)来控制,如果在堆中没有内存可以用来分配实例,同时堆也无法再扩展时,会抛出 OutOfMemoryError异常。
2. 方法区
这个区域用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,该区域包括了一个 运行时常量池区域,运行时常量池用于存放编译期生成的各种字面量(literal)和符号引用,这部分当内存不足时,会抛出 OutOfMemoryError异常。
二、线程私有的内存区域
1. 程序计数器
这是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,每条线程都需要有一个独立的程序计数器,各个线程之间计数器互不影响。当线程执行的是一个java方法时,计数器记录的是虚拟机字节码指令的地址;当线程执行的是Native方法时,这个计数器值为空。 此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
2. 虚拟机栈
每个方法在执行时都会创建一个栈帧,一个方法对应一个栈帧。栈帧用来存储局部变量表、操作数栈等(比如在一个方法里定义的局部变量就存在这里),每一个方法从调用直到执行完成的过程,就是这个方法对应的栈帧在虚拟机栈入栈到出栈的过程。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,那么在扩展时如果无法申请到足够的内存,就会抛出 OutOfMemoryError异常。
3. 本地方法栈
本地方法栈发挥的作用于虚拟机栈类似,只不过虚拟机栈为虚拟机执行java方法服务,而本地方法栈为虚拟机使用到的Native方法服务,本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。
相关文章推荐
- XP下使用虚拟机安装配置Solaris[多图]
- VirtualBox虚拟机XP与宿主机Ubuntu互访共享文件夹
- Linux下三大免费桌面虚拟机评测
- 当存储无可用空间时无法启动虚拟机
- Windows 8虚拟机不能全屏的解决方法
- 使用VMware Workstation虚拟机保护数据
- 用 GNOME Boxes 下载一个操作系统镜像
- Hyper-V虚拟机不能上网问题的解决方法
- win2008 r2 hyper-v虚拟机的安装使用图文教程第1/2页
- android 使用虚拟机安装apk(图文教程)
- Vmware虚拟机的安装及配置方法
- 深入解析java虚拟机
- Java虚拟机JVM性能优化(二):编译器
- 如何配置Apache服务器中的虚拟机
- apache虚拟机配置步骤和修改访问端口的方法(虚拟机端口映射)
- unity3d发布apk在android虚拟机中运行的详细步骤(unity3d导出android apk)
- 用C语言来实现一个简单的虚拟机
- 解析wamp5下虚拟机配置文档
- Java虚拟机JVM性能优化(三):垃圾收集详解
- Java虚拟机最多支持多少个线程的探讨