技术进阶:Java虚拟机(JVM)运行时详解
我们知道的JVM内存地区有:堆和栈,这是一种泛的分法,也是按运行时地区的一种分法,堆是全部线程共享的一块地区,而栈是线程断绝的,每个线程互不共享。 线程不共享地区 每个线程的数据地区包罗措施计数器、假造机栈和当处所法栈,它们都是在新线程建设时才建设的。 措施计数器(Program Counter Rerister) 措施计数器地区一块内存较小的地区,它用于存储线程的每个执行指令,每个线程都有本身的措施计数器,此地区不会有内存溢出的环境。 假造机栈(VM Stack) 假造机栈描写的是Java要领执行的内存模子,每个要领被执行的时辰城市同时建设一个栈帧(Stack Frame)用于存储局部变量表、操纵数栈、动态链接、要领出口等信息。每一个要领被挪用直至执行完成的进程就对应着一个栈帧在假造机栈中从入栈到出栈的进程。 当处所法栈(Native Method Stack) 当处所法栈用于支持当处所法(native标识的要领,即非Java说话实现的要领)。 假造机栈和当处所法栈,当线程哀求分派的栈容量高出JVM应承的最大容量时抛出StackOverflowError非常。 线程不共享地区如下图绿色配景所示。 线程共享地区 线程共享地区包括:堆和要领区。 堆(Heap) 堆是最常处理赏罚的地区,它存储在JVM启动时建设的数组和工具,JVM垃圾网络也首要是在堆上面事变。 假如现实所需的堆高出了自动内存打点体系能提供的最大容量时抛出OutOfMemoryError非常。 要领区(Method Area) 要领区是可供各条线程共享的运行时内存地区。存储了每一个类的布局信息,譬喻运行时常量池(Runtime Constant Pool)、字段和要领数据、结构函数和平凡要领的字节码内容、还包罗一些在类、实例、接口初始化时用到的非凡要领。 当建设类和接口时,假如结构运行时常量池所需的内存空间高出了要领区所能提供的最大内存空间后就会抛出OutOfMemoryError 运行时常量池(Runtime Constant Pool) 运行时常量池是要领区的一部门,每一个运行时常量池都分派在JVM的要领区中,在类和接口被加载到JVM后,对应的运行时常量池就被建设。运行时常量池是每一个类或接口的常量池(Constant_Pool)的运行时示意情势,它包罗了多少种常量:编译器可知的数值字面量到必需运行期理会后才气得到的要领或字段的引用。 假如要领区的内存空间不能满意内存分派哀求,那Java假造机将抛出一个OutOfMemoryError非常。 栈包括Frames,当挪用要领时,Frame被推送到仓库。一个Frame包括局部变量数组、操纵数栈、常量池引用。 【编辑保举】
点赞 0 (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |