java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个区域,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖着用户的线程的启动和结束而建立和销毁。根据java 虚拟机规范的规定,java虚拟机所管理的内存将会包括以下几个运行时数据区域。

如下图所示:

java虚拟机运行时数据区可以分为:

程序计数器  堆  方法区  运行时常量池  本地方法栈  java虚拟机栈。其中程序计数器、java栈、本地方法栈,是根据线程的启动而创建的;而堆、方法区、运行时常量池是随着jvm的启动而创建的,其中的数据是可以被各个线程所共享的。

(图片摘自:http://286.iteye.com/blog/1928180,个人觉得比《深入理解java虚拟机》上的那张图要清晰)

1,程序计数器

  程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都会只执行一条线程中的指令。因此为了线程切换后都能恢复正确的执行位置,每个线程都有一个独立的程序计数器。如果线程正在执行的是一个java方法,这个计数器记录的就是正在执行的虚拟机字节码指令的地址;如果正在执行的是native方法,这个计数器值则为空。

2,java虚拟机栈

  java虚拟机栈也是线程私有的,它的生命周期与线程相同的。虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(stack frame)。用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直到执行完成的过程,就对应着一个栈帖在虚拟机中入栈到出栈的过程。java虚拟机栈用来存储栈帧,而栈帧持有局部变量和部分结果以及参与方法的调用与返回。

帧用于存储局部变量表、操作数栈、动态链接、方法出口和投递异常等信息。当方法调用结束结束时,帧才会被销毁;帧由创建帧的线程的java栈分配空间,每个帧都拥有自己的本地变量数组、操作数栈、以及运行常量池的引用

3,本地方法栈

  本地方法栈(native method stack)与虚拟机发挥的作用是非常类似的,它们之间的区别不过是虚拟机栈执行的是java方法,而本地方法栈则为java虚拟机所使用到native方法服务。

4,java堆

  对于大多数应用来说,java(堆)是java虚拟机所管理内存中的最大的一块。java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。它的主要目的就是为了创建对象实例,向乎所有对像的实例都是在这里分配。

5,方法区

  方法区与java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

运行时常量池是方法区的一部分.Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池用于存储编译期生成的各种字面量以及符号引用。

---恢复内容结束---

Java Runtime Data Area的更多相关文章

  1. Java Run-Time Data Areas

    前言 本文主要介绍JVM的运行时数据区 来自Oracle文档 Java Virtual Machine Specification -- Chapter 2. The Structure of the ...

  2. JVM Run-Time Data Areas.

    Ref: JVM Run-Time Data Areas class SimpleThread extends Thread { public SimpleThread(String name) { ...

  3. JVM Run-Time Data Areas--reference

    http://www.programcreek.com/2013/04/jvm-run-time-data-areas/ This is my note of reading JVM specific ...

  4. Mac安装Elasticsearch时提示:No Java runtime present, requesting install.

    没有安装java的童鞋可以先去安装一下,地址:https://www.java.com/zh_CN/ 安装之后还是提示如下错误: ➜ elasticsearch-2.4.3 bin/elasticse ...

  5. Eclipse中启动Tomcat报错:[There is insufficient memory for the Java Runtime Environment to continue.]的解决方案

    1,报错截图 2,报错信息 五月 08, 2018 9:57:58 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [Se ...

  6. java: Runtime和Process调用本机程序

    java: Runtime和Process调用本机程序 调用纸牌程序,Process用来销毁程序 import java.io.IOException; public class RunTimeDem ...

  7. Java Runtime.availableProcessors()方法

    Java Runtime.availableProcessors()方法用法实例教程.   描述 java.lang.Runtime.availableProcessors() 方法返回到Java虚拟 ...

  8. A fatal error has been detected by the Java Runtime Environment(jdk 1.6的一个BUG)

    几天做项目,生成一堆注解的实体,当实体数超过86个时,jvm报错: # # A fatal error has been detected by the Java Runtime Environmen ...

  9. eclipse解压后启动弹出A Java Runtime Evironment(JRE) or Java Development Kit(JDK)....

    系统环境:win7 64bit JDK:jdk-7u79-windows-x64 Eclipse:eclipse-jee-helios-win32 启动eclipse:弹出A Java Runtime ...

随机推荐

  1. 我所理解的 KMP(Knuth–Morris–Pratt) 算法

    假设要在 haystack 中匹配 needle . 要理解 KMP 先需要理解两个概念 proper prefix 和 proper suffix,由于找到没有合适的翻译,暂时分别称真实前缀 和 真 ...

  2. 微信开发 提示 Redirect_uri参数错误解决方法

    出现这个问题有多种原因: 1.没有配置网页授权 我们可以根据微信的开发者文档http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d ...

  3. Android开发艺术探索(三)——View的事件体系

    一.View基础知识 主要介绍内容有:View的位置参数.MotionEvent和TouchSlope对象.VelocityTracker.GestureDetector和Scroller对象 1.什 ...

  4. JGit与远程仓库链接使用的两种验证方式(ssh和https)

    JGit是使用JAVA的API来操控Git仓库的库,由Eclipse公司维护.他提供的API分成两个层次,底层命令和高层命令.底层API是直接作用于低级的仓库对象,高层的API是一个面向普通用户级别功 ...

  5. SharePoint PerformancePoint Service-PowerShell

    1. 配置托管服务账户 Set-SPPerformancePointSecureDataValues -ServiceApplication "PerformancePoint Servic ...

  6. 七周七语言——Prolog(二)

    1  递归 首先来看一个知识库: father(zeb,john_boy_sr). father(john_boy_sr,john_boy_jr). ancestor(X,Y):-father(X,Y ...

  7. HDOJ--4786--Fibonacci Tree【生成树】

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给出n个点,m条边,和边的信息. 边有两种颜色,白色和黑色.现要求构造一个生成树.看是否能满足 ...

  8. classpath多个包添加

    转的: 把某目录下的所有子目录和子目录下面的下层和更下层目录也添加到CLASSPATH里面,更具需求写了两句,发上来分享,备忘. 在Linux下可以通过这样的方法把/opt/.../lib目录下的所有 ...

  9. CentOS更换python版本后,yum不可用的问题

    因为yum调用了python,他的启动程序/usr/bin/yum就是一个python脚本 yum是不兼容 Python 2.7的,所以yum不能正常工作,我们需要指定 yum 的Python版本 将 ...

  10. JS获取URL的参数

    function request(paras) { var url = location.href; , url.length).split("&"); var paraO ...