阅读背景:

Java虚拟机内存区域模型

来源:互联网 

线程私有的内存区域程序计数器(Program Counter Register)程序计数器是一块较小的内存空间,它可以看做是当前线程所履行的字节码的行号指导器。 每一个线程都有各自独立的程序计数器,如果线程正在履行的是一个Java办法, 那末这个计数器记载的是正在履行的虚拟机字节码指令地址,如果正在履行的是Native办法, 则程序计数器为空(Undifined)。此内存区域是唯逐一个在Java虚拟机规范中没有规定任何OutOfMemoryError情形的区域。虚拟机栈(VM Stack)虚拟机栈也是线程私有的,它描写的是Java办法履行的内存模型: 每一个办法在履行的同时都会创立一个栈帧(Stack Frame) 用于存储局部变量表、操作数栈、动态连接、办法出口等信息, 每一个办法从调用直至完成的进程, 就对应着一个栈帧在虚拟机栈中入栈和出栈的进程。虚拟机栈帧中,局部变量表是比拟为人所熟知的,也就是平凡所说的“栈”, 局部变量表所需的内存空间在编译期间分配完成, 当进入一个办法时,这个办法须要在栈帧中分配多大的局部变量空间是完整肯定的, 在办法运行期间不会转变局部变量表的大小。虚拟机栈有两种异常情形:StackOverflowError:线程要求的栈深度大于虚拟机所许可的深度,特殊是办法的递归调用时OutOfMemoryError:虚拟机栈没法满足线程所申请的空间需求, 即便经过动态扩大依然没法满足,那末将致使OutOfMemoryError毛病本地办法栈(Native Method Stack)本地办法栈与虚拟机栈类似,不过服务于本地办法,有些虚拟机将这两个区域合二为一。 本地办法栈中抛出异常的情形与虚拟机栈雷同。同享的内存区域堆(Heap)通常来讲,堆是Java虚拟机管理的内存中最大的一块,被所有线程同享, 在虚拟机启动时创立,堆的作用就是存储对象实例。堆也是垃圾搜集器所管理的重要区域,因此很多时候也被称作“GC堆”。 从内存回收的角度来看,由于现在搜集器根本都采取分代搜集算法, 因此堆还可以被细分为:新生代和老年代。 再持续细分可以分为:Eden空间、From Survivor空间、To Survivor空间等, 从内存分配的角度来看, 线程贡献的堆中还可以划分出多个线程私有的分配缓冲区u(Thread Local Allocation Buffer,TLAB)。堆可以是物理上不持续的空间,只要逻辑上是持续的便可,-Xmx和-Xms参数可以掌握堆的最大和最小大小。 堆的空间大小不满足时将抛出OutOfMemoryError异常。办法区(Method Area)用于存储已被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码等数据。 Java虚拟机规范将办法区描写为堆的一个逻辑部份,但是它却有一个别号叫做Non-Heap(非堆)。办法区一样会抛出OutOfMemoryError异常。在办法区中有一部份区域用来存储编译期发生的各种字面量和符号援用,这部份内容将在类加载落后入办法区的运行经常量池中寄存。这里须要解释一点,常量其实不是只能在编译期发生,运行期间也会发生新的常量并被发在常量池中,如String类的intern()办法。直接内存(Direct Memory)本机直接内存其实不是Java虚拟机运行时数据区的一部份, 但它能在一些场景中明显进步性状, 由于其避免了在Java堆和Native堆中来回复制数据。直接内存一样会抛出OutOfMemoryError异常。线程私有的内存区域程序计数器(Program Counter Register)程序计数器是一




你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: