2.2 运行时数据区域
根据Java虚拟机规范,Java虚拟机所管理的内存包含以下几个运行时数据区域:
程序计数器,虚拟机栈,本地方法栈,Java堆,方法区。
线程共享:Java堆,方法区
线程私有:程序计数器,虚拟机栈,本地方法栈
1)程序计数器
1-程序计数器是一块较小的内存,可以看作是当前线程所执行的字节码的行号指示器
2-字节码解释器在工作时,就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
3-每条线程都需要有一个独立的程序计数器,互不影响,独立存储,这类区域的内存称为“线程私有”的内存
4-此内存区域是唯一在Java虚拟机规范中没有规定任何OOM情况的区域
2)Java虚拟机栈
1-与程序计数器一样,是线程私有的,它的生命周期和线程相同
2-虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口信息等
3-每一个方法从调用到执行结束的过程,都会对应着一个栈帧在虚拟机栈中的入栈和出栈的过程
4-Java虚拟机规范中,对这个区域规定了两种异常状态:
-StackOverflowError异常:
如果线程请求的栈深度超过虚拟机所允许的深度,则会抛出这个异常
-OutOfMemoryError异常:
如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,则会抛出这个异常
3)本地方法栈
1-本地方法栈的作用和虚拟机栈是相似的,它们之间的区别是,虚拟机栈是为Java方法服务,而本地方法栈为虚拟机使用到Native方法服务
2-sun HotSpot虚拟机把虚拟机栈和本地方法栈二合为一
3-本地方法栈也会抛出:
StackOverflowError
OutOfMemoryError
4)Java堆
1-Java堆是Java虚拟机所管理的内存中最大的一块,是线程共享的一块区域
2-此区域的唯一目的就是存放对象实例
3-Java堆还可以细分为:新生代和老年代;再细一点还可以分为:Eden空间,From Survior空间,To Survivor空间
4-根据Java虚拟机规范,Java堆可以处于物理上不连续的内存空间中,主要逻辑上是连续的即可;在实现上,可以实现成固定大小,也可以实现成可扩展
5-如果堆中没有内存完成实例分配,并且无法再扩展,则会抛出:
OutOfMemoryError
5)方法区
1-方法区与Java堆一样,是线程共享的内存区域
2-它用来存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等
3-在HotSpot虚拟机上的开发者,常常称这块为“永久代”
4-根据Java虚拟机规范,方法区可以是不连续的物理内存,可以固定大小或者可扩展,还可以选择不实现垃圾收集
5-当方法区无法满足内存分配时,则会抛出:
OutOfMemoryError
6)运行时常量池(方法区的一部分)
1-方法区的一部分
2-Class文件除了有类的版本,字段,方法,接口等描述信息外,还有一个项信息就是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载之后存放在方法区的运行时常量池中
3-对于方法区的运行时常量池,虚拟机没有做任何细节上的要求,一般来说,除了保存Class文件中描述的符号引用外,还会保存翻译出来的直接引用
2-当常量池无法在申请到内存时,则会抛出:
OutOfMemoryError
7)直接内存
1-不是虚拟机运行时数据的一部分,也不是Java虚拟机规范中定义的内存区域。
2-但是这部分内存比较频繁被使用,而且会导致OOM异常
3-直接内存分配不受Java堆大小的限制,但是既然是内存,肯定还是会受到本机总内存大小与物理寻址空间的限制
相关推荐
Tomcat内存溢出的三种情况及解决办法分析 Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。 这里根据平时遇到的情况和相关资料进行一个...
第28讲 Java内存区域-直接内存和运行时常量池 00:15:53 第29讲 对象在内存中的布局-对象的创建 00:21:19 第30讲 探究对象的结构 00:13:47 第31讲 深入理解对象的访问定位 00:08:01 第32讲 垃圾回收-...
第28节Java内存区域-直接内存和运行时常量池00:15:53分钟 | 第29节对象在内存中的布局-对象的创建00:21:19分钟 | 第30节探究对象的结构00:13:47分钟 | 第31节深入理解对象的访问定位00:08:01分钟 | 第32节垃圾...
第2章 Java内存区域与内存溢出异常 / 24 2.1 概述 / 24 2.2 运行时数据区域 / 25 2.2.1 程序计数器 / 25 2.2.2 Java虚拟机栈 / 26 2.2.3 本地方法栈 / 27 2.2.4 Java堆 / 27 2.2.5 方法区 / 28 2.2.6 运行...
第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行时常量池 2.2.7 直接内存 2.3 HotSpot...
直接内存:不受JVM GC管理,直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中定义的内存区域。在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/...
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,...
第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有,虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,存储局部变量表、操作数...
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法...
2.2 公用语言运行时环境与公用语言规范.13 2.3 开 发 工 具 .17 2.4 小 结 .19 第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 ...