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文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池用于存储编译期生成的各种字面量以及符号引用。

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

最新文章

  1. linux系统下根据端口查看进程
  2. 热烈庆祝华清远见成功自主研发Farsight TV 智能机顶盒
  3. 20145225《Java程序设计》 实验四 Android开发基础
  4. unity3d拓展编辑器Editor的使用
  5. Kafka原理与java simple producer示例
  6. OAF_MDS系列2_OAF页面的通过MDS多语言开发国际化(案例)
  7. Win8、Win10进入SQL server配置管理器
  8. firefox ie chrome 设置单元格宽度 td width 有bug,不能正常工作。以下方式可以解决
  9. 23个.NET开源项目
  10. 第 15 章 组合模式【Composite Pattern】
  11. 【设计模式 - 15】之解释器模式(Interpreter)
  12. css层叠机制说明
  13. Linux 07 故障恢复
  14. hdu1151 Air Raid,DAG图的最小路径覆盖
  15. windows任务设置定时
  16. scala实现快速排序
  17. HTTP协议详解以及URL具体访问过程
  18. 设计模式:基于线程池的并发Visitor模式
  19. Android的ImageView介绍-android学习之旅(二十二)
  20. Centos7上安装mariadb

热门文章

  1. 神经网络中误差反向传播(back propagation)算法的工作原理
  2. Dynamic Library Design Guidelines
  3. 再次分享 pyspider 爬虫框架 - V2EX
  4. python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客
  5. hdoj 2795 Billboard【线段树区间最大值】
  6. Hibernate查询之HQL查询
  7. lcx源代码以及免杀的研究
  8. 应用程序无法正常启动0xc0150002 解决方式
  9. 绿色tftpserver:tftpd32的配置
  10. android 判断应用程序是否已安装