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. CMDB处理数据流程

    客户端代码执行流程: 服务器端接收并处理数据流程:

  2. 为什么 UDP 有时比 TCP 更有优势

    随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单.传输快的优势,在越来越多场景下取代了TCP,如网页浏览.流媒体.实时游戏.物联网. 1.网速的提升给UDP稳定性提供可靠网络保障 CD ...

  3. [转]在 Mac OS X 终端里使用 Solarized 配色方案

    相信长期浸泡在终端和代码的小伙伴们都有一套自己喜爱的配色方案.以前一直在用简单.适合阅读的 Terminal.app 配色方案,换到 MacBook Pro with Retina display 后 ...

  4. STL源码剖析之list的sort函数实现

    SGI  STL的list的函数的实现源码大致如下: //list 不能使用sort函数,因为list的迭代器是bidirectional_iterator, 而sort //sort函数要求rand ...

  5. Zend Framework 2参考Zend\Authentication(摘要式身份验证)

    Zend Framework 2参考Zend\Authentication(摘要式身份验证) 介绍 摘要式身份验证是HTTP身份验证的方法,提高了基本身份验证时提供的方式进行身份验证,而无需在网络上以 ...

  6. 使用js实现html锚功能,可以任意定位锚的位置,比锚更加灵活

    今天记录一个js功能,发现该功能很实用,拿出来跟大家分享. 这里我使用js的window.scrollTo()函数,该函数的用法给大家重复一下,语法为scrollTo(x,y),这里x表示在窗口文档显 ...

  7. Http 缓存

    常用Http缓存页asp.net 页面上加上 <%@ OutputCache Duration="10" VaryByParam="None" %> ...

  8. [Node] 逃离回调地狱

    逃离Node回调地狱 Background : 在Node中,函数的返回结果大多利用回调的方式处理.如简单的判断文件是否存在并读取内容: var fs = require('fs'); fs.exis ...

  9. saveFileDialog

    saveFileDialog1.ShowDialog saveFileDialog.FileName 设置的时候是一个字符串. 如: 新建 RTF 文档.rtf 获得的时候 则为一个完整的路径. 如: ...

  10. 【剑指Offer学习】【面试题14 :调整数组顺序使奇数位于偶数前面】

    题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位予数组的后半部分. 这个题目要求把奇数放在数组的前半部分, 偶数放在数组的后半部分,因此全部的奇 ...