Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁时间。根据《Java虚拟机规范(Java SE 7版》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示。

程序计数器

程序计数器是一块较小的内存空间,它可以看做是当前线程(每个线程都有一个独立的程序计数器)所执行的字节码的行号指示器。

Java虚拟机栈

Java虚拟机栈也是也是线程私有的。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

我们平时把Java内存区分为堆内存栈内存,其中的栈内存就是虚拟机栈中的局部变量表部分。

(如果线程请求的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机可以动态扩展,扩展时仍无法申请到足够的内存,就会抛出OutOfMemoryError异常)

本地方法栈

本地方法栈与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。

Java堆

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

(如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常)

方法区

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

(当方法区无法满足内存分配的需求时,将抛出OutOfMemoryError异常)

运行时常量池(方法区的一部分)

Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

(当常量池无法再申请到内存时会抛出OutOfMemoryError异常)

直接内存

直接内存不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。Java NIO可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。

(这块区域也会在内存不足时,动态扩展出现OutOfMemoryError异常)

最新文章

  1. python快速生成注释文档的方法
  2. [转载] php用csv文件导出大量数据
  3. URL、URN、URI的区别?
  4. [Unity3D]Unity资料大全免费分享
  5. Android 录音器
  6. 关于蜂窝物联技术 NBIoT 的一些观点
  7. linux线程同步(2)-条件变量
  8. C# winform多线程的小例子
  9. TOMCAT启动时报错:the CATALINA_HOME environment variable is not defined correctly
  10. Eclipse中导入外部jar包(zhuan)
  11. JQuery ajax请求一直返回Error(parsererror)
  12. 阿里技术保障-KeepAlive
  13. iis7.5 应用程序池 经典模式和集成模式的区别
  14. StartSSL免费SSL证书成功申请-HTTPS让访问网站更安全
  15. android 开源项目学习
  16. 玩转Eclipse--如何使用eclipse可以更好的提高我们的工作效率
  17. python笔记--2--字符串、正则表达式
  18. JSONP方法简单封装
  19. centos6.5安装ganglia-gmond
  20. Java中对List集合的常用操作

热门文章

  1. 结巴分词demo
  2. vscode 对于 md的编写 左侧 大纲 很重要!!
  3. this.current = params.page || 1 (前提是params对象一定要存在)
  4. 迷你记事本 https://vladocar.github.io/Minimal-Notes/
  5. LSTM + linear-CRF序列标注笔记
  6. 安卓App自动化测试环境
  7. oracle中plsql练习题----查询姓为“SMITH”的员工信息,并输出其员工号、姓名、工资、部门号。 – –如果该员工不存在,则插入一条新记录,员工号为2012,员工姓名为“Smith”,工资为7500元,入职日期为“2002年3月5日”,部门号为50。 – –如果存在多个名“Smith”的员工,则输出所有名为“Smith”的员工号、姓名、工资、入职日期、部门号L。
  8. FFmpeg SDK for iOS
  9. tomcat源码分析01-启动过程概览
  10. 第七周java实验作业