Java虚拟机之内存区域(1)

  • 时间:
  • 浏览:1
  • 来源:神彩大发幸运飞艇_彩神大发幸运飞艇官方

6.运行时常量池

本地妙招 栈和 Java 虚拟机栈的作用是差太多的,大伙儿的唯一区别在于: Java 虚拟机栈为虚拟机执行 Java 妙招 (字节码)服务,而本地妙招 栈则为虚拟机中 Native 妙招 服务。在虚拟机规范中并越来越明确的规定本地妙招 栈使用何种语言与数据底部形态,可有具体的虚拟机去实现它。本地妙招 栈和 Java 虚拟机栈一样,也会抛出 StackoverflowError 和 OutOfMemoryError 一一一个异常。

妙招 的参数和妙招 中声明的局部变量都存储在局部变量中。在 Class 编译的原来就机会选取了的局部变量表的最大容量,声明在妙招 的 Code 属性的max_locals 数据项中。变量槽(Slot)是局部变量表的最小单位,能要能要能 存储32位和64位的数据,64位的数据则时需一一一个连续的变量槽来表示。

动态链接:Class 文件中存放了极少量的符号引用,字节码中的妙招 调用指令随后以常量池中指向妙招 的符号引用作为参数。哪些符号引用一部分会类第一次加载或第一次引用的原来转化为直接引用,什儿 转化称为静态解析。另一部分将在每一次运行期转化为直接引用,这部分称为动态连接。

局部变量表中存放了编译期可知的基本数据类型(char,byte,int,boolean,short,float,long,double)、对象的引用(reference类型,指的是对象地址的引用指针或是句柄)、returnAddress类型(指向字节码指令的地址)。

操作数栈:也成为操作栈,是一一一个后进先出的底部形态。妙招 执行过程中的算术运算机会调用其它妙招 的参数传递的原来都是在操作数栈中进行的。

在 Java虚拟机规范中,对虚拟机栈定义了什儿 异常:第一,机会线程请求的强度大于虚拟机栈所允许的最大强度,将抛出 StackoverflowError 异常,第二,机会虚拟机栈能要能要能 动态的扩展,当扩展时无法申请到足够的内存,则会抛出 OutOfMemoryError 异常。

Java 堆是立即回收器管理的主要区域,随后其他同学也会把 Java 堆称为“GC堆”。从垃圾回收的强度来看,机会现在大多数的收集器都是采用分代收集算法,好多好多 Java 堆还能要能要能 细分为:新生代和老年代;再细致什儿 有能要能要能 分为Eden 空间, From Survivor 空间、To Survivor 空间等;从内存分配的强度来看,线程共享的java堆中机会划分为多个线程私有的分配缓冲区(TLAB)。

2.1、运行时栈帧

Java 虚拟机在执行 Java 线程的原来会把它所管理的内存分为多个不同的区域,每个区域都是不同的作用,以及由本人所有的生命周期,什儿 随着虚拟机进行的 启动而处在,什儿 区域则依赖于用户线程的启动或开始 英语 而建立或销毁等。在《Java虚拟机规范(Java SE7版)》中规定,Java 内存分为以下什儿 ,如图所示:

大伙儿在日常开发的过程的中老会 会把 Java 内存分为堆内存和栈内存,什儿 说法是不准确的,机会 Java 内存区域的划分远比什儿 冗杂的多,什儿 划分的妙招 能要能要能 说明线程员最关注的,与对象内存分配关系最密切的内存区域这两块,这里所说的栈嘴笨 指的是虚拟机中的局部变量表。

4.Java堆

根据 Java 虚拟机规范的规定,当妙招 区无法满足内存分配的需求时,将抛出 OutOfMemoryError 异常。

深入理解Java虚拟机之Java内存区域

Java 虚拟机规范对妙招 区的限制非常的宽松,除了和 Java 堆一样不时需物理上连续的内存和能要能要能 选取固定大小空间或动态扩展为,还能要能要能 选取不实现垃圾回收。相对而言,垃圾回收是比较少在什儿 区域中出显的,但太多进入到妙招 区的数据都能永久的处在的。这块区域的的内存回收目标主随后针对常量池的回收和对类型的卸载,随后回收的效果并都是非常明显,有点痛 是对类型的卸载,条件非常的苛刻,但这块内存的回收是非常必要的。在 SUN 公司的 BUG列表中,原来出显过若干个非常严重的 BUG ,随后机会低版本中 Hotspot 虚拟机越来越对此内存区域进行回收造成的。

栈帧是 Java 虚拟机用来进行妙招 的调用和妙招 的指定的数据底部形态,它是虚拟机运行时数据库的 Java 虚拟机栈的栈元素。

返回地址:当一一一个妙招 执行完成后的出口,有一一一个清况 :一是正常清况 退出,会将返回值传递给上一一一个妙招 的调用者,另什儿 是异常清况 ,此时是越来越返回值的。

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

运行时常量池相对于 Class 文件常量池的原来底部形态是具备动态性,Java 语言太多要求常量一定能要能要能 编译期要能产生,都是之前 太多预置入 Class 文件中的常量池的内容要能要能要能 进入妙招 区的运行时常量池,运行期间要能要能要能 将新的常量倒入到池中,比如 String 类的 intern 妙招 。

局部变量表所需的内存空间在编译期完成分配,当进入一一一个妙招 时,什儿 妙招 所时需的栈帧的大小就机会选取了,在运行期间无需改变局部变量表的大小。其中64位长度的 long 和 double 类型的数据会占用一一一个局部变量空间(Slot),其余的数据类型能要能要能 占用一一一个。

1、线程计数器

线程计数器(Program Counter Register)是一一一个内存较小的区域,它能要能要能 被看作是当前线程所执行到的字节码的行号的指示器,字节码解释器在执行下第一根指令,比如分支,跳转,循环,异常补救等都时需依赖什儿 计数器来完成的。

机会 Java 线程是通过不断的切换分配补救器时间片的妙招 来实现的,在任何一一一个选取的时刻,一一一个补救器都只会执行第一根指令。都是之前 说,在线程中每个线程都能要能要能 抢到 cpu 的时间片,越来越别抢去的线程会立即停止下来,直到它再一次获得 cpu 的时间片。越来越, Java 虚拟机是怎么才能 才能 确保再一次获得补救器时间片的原来要能在正确的位置上继续执行指令?

每一一一个栈帧都饱含局部变量表、操作数栈、动态链接、妙招 返回地址和什儿 额外的附加信息。

机会线程正在执行 Java 妙招 ,什儿 计数器记录的是正在执行的虚拟机字节码指令的地址,机会正在执行的是 native 妙招 ,越来越什儿 计数器值则为空(Undefined);机会线程计数器记录的是当前线程字节码执行指令的地址,好多好多 它的内存大小是无需随着线程的执行而处在变化,随后,该内存区域是唯一一一一个在 Java虚拟机规范中越来越规定任何 OutOfMemeryError (内存溢出)的清况 的区域。

既然运行时常量池是处在于妙招 区中的,越来越在无法分配到足够的内存是也会抛出 OutOfMemoryError 异常。

Java 堆是 Java 内存管理区域中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。 Java 堆是用来存放对象,几乎所有的 Java 对象和数组都存倒入Java堆中,都是堆中分配空间。

妙招 区和 Java 堆一样,都是线程共享的内存区域,它主要用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。嘴笨 Java 虚拟机规范把妙招 区描述为 Java 堆的一部分,随后它却一一一个别又名做 Non-Heap(非堆),目的是与 Java 堆分开。

局部变量:

Java 虚拟机随后通过当前线程的线程计数器保证的,机会保存了当前线程上次执行开始 英语 的位置,随后,线程计数器是每个线程独有的,各线程原来的线程计数器互不影响,独立存储,大伙儿称类事内存区域为“线程私有”的内存。

3.本地妙招 栈

5.妙招 区

原来分配是为了更好的回收内存和创建内存等,与存放的区域无关,都是存放 Java 对象。根据Java虚拟机规范的规定,Java 堆能要能要能 是物理上不连续的内存空间,假如有一天逻辑上连续就能要能要能 了。在实现时能要能要能 设置固定大小的空,要能要能要能 动态扩展的,不过当前流程的虚拟机都是能要能要能 动态来扩展的。机会在堆中越来越足够的空间来分配实例对象,机会无法扩展堆空间,越来越就会抛出 OutOfMemoryError 异常。

Java虚拟机之内存区域,今天这篇文章来深入理解一下把

Java 虚拟机栈与线程计数器一样都是线程私有的,它的生命周期与线程一致,每当创建一一一个新的线程时可不能不能 产生一一一个新的的虚拟机栈,线程销毁时虚拟机栈也随即销毁。每个妙招 的执行可不能不能 创建一一一个栈帧用于存储局部变量、操作数栈、动态链表,妙招 的出口等信息。每个妙招 的执行到开始 英语 就对应着一一一个栈帧在虚拟机中入栈和出栈的过程。