运行时数据区域
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,以及创建和销毁的 时间,有的趋向于随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而创建和销毁。根据《java虚拟机规范(javaSE7版)》的规定。java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图:
接下来详细介绍每个区域的作用,及存储什么类型的数据
程序计数器
简介:程序计数器是一块较小的内存空间,可以看做事当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程回复等基础功能都需要依赖这个计数器完成。
功能:存放下一条指令所在单元的0地址。
特点:线程私有,安全的。
java虚拟机栈
简介:java方法执行的内存模型。
功能:每个方法在执行的时候都会创建一个栈帧用于存放局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用
直至执行完成的过程,就对应这一个栈帧在虚拟机栈中的入栈和出栈的过程。其中局部变量表存放了编译期间可知的各种基本数据类型(int、byte、long、short、boolean、float、double、char)、对象引用类型,其中long和double类型的数据会占用两个局部变量空间。
特点:它也是线程私有的,他的生命周期与线程相同。
本地方法栈
简介:本地方法栈与虚拟机栈的功能类似,他的作用就是为虚拟机使用到的本地方法服务。有的虚拟机也会将本地方法栈与虚拟机栈合并,例如 S丶HotSpot 虚拟机。
功能:为虚拟机使用到的本地方法服务。
特点:与java虚拟机栈类似,单线程,生命周期与线程相同。
java堆
简介:java堆是java虚拟机所管理的内存中最大的一块,几乎所有的对象实例都在这里分配内存。同时,java堆也是垃圾收集器管理的主要区域,很多时候也会被称为“GC堆”(Garbage Collected Heap)。
功能:存放对象,数组实例,垃圾收集器管理。
特点:java堆是被所有线程共享的一块内存区域。java堆可以存放在物理地址不连续的一块内存中,只要逻辑上是连续的即可。
方法区
简介/功能:用于存放虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码(.class文件)等数据。
特点:与java堆一样,也是各个线程共享的你内存区域,属于堆的一个逻辑部分,但是在JDK1.7的HotSpot中将原本放在永久代的字符串常量池移出,顾字符串常量池单独存在。
所以在了解了这些后,我把博客开篇的图片整理了一下,如下图: