java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下:

其中方法区和堆是由所有线程共享的数据区。

Java虚拟机栈,本地方法栈和程序计数器是线程隔离的数据区。

(1).程序计数器:

是一块较小的内存空间,其作用可以看作是当前线程所执行的字节码的行号指示器,字节码解析器工作时通过改变程序计数器的值来选取下一条需要执行的字节码指令。程序的分支、循环、跳转、异常处理以及线程恢复等基础功能都是依赖程序计数器来完成。

Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间片来实现,在任何一个时刻,一个处理器只会执行一条线程指令,因此,为了确保线程切换之后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,因此程序计数器是线程私有的内存。

程序计数器是java虚拟机中唯一一个没有规定任何内存溢出OutOfMemoryError的内存区域。

(2).java虚拟机栈:

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

Java虚拟机栈的局部变量表存放了编译器可知的8种java基本类型数据、对象引用(注意不是对象实例本身)、方法返回地址returnAddress。

Java虚拟机栈的局部变量表空间单位是槽(Slot),其中64位长度的double和long类型会占用两个slot,其余的数据类型只占用一个slot。局部变量表所需内存空间在编译期间完成分配,当进入一个方法时,该方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

Java虚拟机栈有两种异常状况:如果线程请求的栈深度大于虚拟机所允许的最大深度时,抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,当扩展时无法申请到足够内存时会抛出OutOfMemoryError异常。

(3).本地方法栈:

本地方法栈与java虚拟机栈作用非常类似,其区别是:java虚拟机栈是为虚拟机执行java方法服务,而本地方法栈是为虚拟机调用的操作系统本地方法服务。

Java虚拟机规范没有对本地方法栈的实现和数据结构做强制规定,Sun HotSpot虚拟机直接把java虚拟机栈和本地方法栈合二为一。

与java虚拟机栈类似,本地方法栈也会抛出StackOverflowError异常和OutOfMemoryError异常。

(4).堆:

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

Java堆是垃圾收集器管理的主要区域,从垃圾回收的角度看,由于现在的垃圾收集器基本都采用的是分代收集算法,因此java堆还可以初步细分为新生代和年老代。

Java虚拟机规范规定,堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。在实现上即可以是固定大小的,也可以是可动态扩展的。如果在堆中没有内存完成实例分配,并且堆大小也无法在扩展时,将会抛出OutOfMemoryError异常。

(5).方法区:

方法区与堆一样,是被各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。虽然java虚拟机规范把方法区描述为堆的一个逻辑部分,但是方法区却有一个别名叫Non-Heap(非堆)。

Sun HotSpot虚拟机把方法区叫永久代(Permanent Generation),方法区中最重要的部分是运行时常量池。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面变量、符号引用、直接引用等,这些内容将在类加载后存放到方法区的运行时常量池中,另外在运行期间也可以将新的常量存放到常量池中,如String的intern()方法。

方法区和运行时常量池在无法满足内存分配时,也会抛出OutOfMemoryError异常。

(6).直接内存:

直接内存并不是java虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但是在java开发中还是会使用到。

JDK1.4中新引入的NIO(new I/O),引入了一种基于通道(Channel)和缓冲区(Buffer)的I/O方式,可以使用操作系统本地方法库直接分配堆外内存,然后通过一个存储在java堆里面的DirectByteBuffer对象作为堆外直接内存的引用进行操作,避免了java堆内存和本地直接内存间的数据拷贝,可以显著提高性能。

虽然直接内存并不直接收到java虚拟机内存影响,但是如果java虚拟机各个内存区域总和大于物理内存限制,从而导致直接内存不足,动态扩展时也会抛出OutOfMemoryError异常。

java虚拟机内存结构中的程序计数器、虚拟机栈和本地方法栈这三个区域随线程创建而生,随线程销毁而灭,因此这三个区域的内存分配和回收是确定的,java垃圾收集器重点关注的是java虚拟机的堆内存和方法区内存。

(转)《深入理解java虚拟机》学习笔记1——Java内存结构的更多相关文章

  1. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

  2. 《深入Java虚拟机学习笔记》- 第16章 控制流

    <深入Java虚拟机学习笔记>- 第16章 控制流

  3. 《深入Java虚拟机学习笔记》- 第17章 异常

    <深入Java虚拟机学习笔记>- 第17章 异常

  4. 《深入Java虚拟机学习笔记》- 第13章 逻辑运算

    <深入Java虚拟机学习笔记>- 第13章 浮点运算

  5. 《深入Java虚拟机学习笔记》- 第14章 浮点运算

    <深入Java虚拟机学习笔记>- 第13章 浮点运算

  6. 《深入Java虚拟机学习笔记》- 第8章 连接模型

    Java虚拟机学习笔记(八)连接模型

  7. 《深入Java虚拟机学习笔记》- 第4章 网络移动性

    Java虚拟机学习笔记(四)网络移动性

  8. 《深入Java虚拟机学习笔记》- 第2章 平台无关

    Java虚拟机学习笔记(二)平台无关

  9. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

  10. 深入理解Java虚拟机 - 学习笔记 1

    Java内存区域 程序计数器 (Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过 ...

随机推荐

  1. Installing MySQL Connector/Python using pip v1.5

    The latest pip versions will fail on you when the packages it needs to install are not hosted on PyP ...

  2. oracle 自增列设置

    序列 create sequence sq_1 minvalue maxvalue start increment cache ; 触发器 create or replace trigger 触发器名 ...

  3. ubuntu14_gtk 安装

    1:apt-get install build-essential2:apt-get install gnome-devel gnome-devel-docs

  4. javaweb学习总结二十二(servlet开发中常见的问题汇总)

    一:web应用的映射问题 通常我们从别人那里拷贝来的代码,自己会修改应用的名称,但是web映射的访问路径并没有修改,还是原来的映射. 解决方法: 工程右键--properties--myeclipse ...

  5. 关于Eclipse生成和导入Patch文件.

    & 生成的文件如下: 如果系统对这个patch文件有识别的话是一个带有问号的icon文件. diff --git a/main/plugins/org.talend.designer.core ...

  6. Windwos下Apache的缓存设置

    1.打开httpd.conf,找到以下几个Module并将其启用(如果没有,可以自行添加)              mod_proxy.so(module_proxy)              m ...

  7. (转).net项目技术选型总结

    原文作者:mcgrady 原文地址:.net项目技术选型总结 做.net开发已经几年了,也参与开发了很多大大小小的项目,所以现在希望总结出一套开发.net项目的常用技术,也为以后做项目技术选型的时候作 ...

  8. Bootstrap简单Demo(2015年05月-18日)

    Bootstrap的简单使用 1.Bootstrap是什么? 这是Bootstrap官网上对它的描述:Bootstrap是最受欢迎的HTML.CSS和JS框架,用于开发响应式布局.移动设备优先的WEB ...

  9. 【转】Github入门教程

    原文 http://www.eoeandroid.com/thread-274556-1-1.html [初识Github] 首先让我们大家一起喊一句“Hello Github”.YEAH!就是这样. ...

  10. OpenMP多线程linux下的使用,简单化

    http://hi.baidu.com/diwulechao/item/bc6d865c411b813c32e0a932 http://www.cnblogs.com/yangyangcv/archi ...