JAVA顺序运转于虚拟机之上,运转时须要内存空间。虚拟机实行JAVA顺序的历程当中会把它治理的内存分别为差别的数据地区轻易治理。虚拟机治理内存数据地辨别别如下图:
java进修视频引荐:java在线教程
一、顺序计数器(Program Counter Register)
行号指示器,字节码指令的分支、轮回、跳转、非常处置惩罚、线程恢复(CPU切换),每条线程都须要一个自力的计数器,线程私有内存互不影响,该地区不会发作内存溢出非常。
二、虚拟机栈(VM Stack)
虚拟机栈(VM Stack)是线程私有的,声明周期与线程雷同,虚拟机栈是Java要领实行的内存模子,每一个要领被实行时都邑建立一个栈帧,即要领运转时期的基本数据结构。
栈帧用于存储:局部变量表、操纵数栈、动态链接、要领出口等,每一个要领实行中都对应虚拟机栈帧从入栈随处栈的历程。是一种数据结构,是虚拟机中的局部变量表,对应物理层之上的顺序数据模子。
局部变量表,是一种顺序运转数据模子,寄存了编译期可知的种种数据范例比方:
Boolean、byte、char、short、int、float、long、double、对象援用范例(对象内存地址变量,指针或句柄)。顺序运转时,依据局部变量表分派栈帧空间大小。在运转中,大小是稳定的非常范例:stackOverFlowError 线程要求栈深度大于虚拟机许可深度 OutOfMemory
内存空间耗尽没法举行扩大。
三、当地要领栈(Native Method Stack)
与虚拟机栈相似,虚拟机栈为Java顺序效劳,当地要领栈支撑虚拟机的运转效劳,细致完成由虚拟机厂商决议,也会抛出 stackOverFlowError
、OutOfMemory
非常。
四、堆(Heap)
堆(Heap)是虚拟机治理内存中最大的一部分,被一切线程同享,用于寄存对象实例(对象、数组),物理上不一连的内存空间,因为GC网络器,分代网络,所以分别为:新生代 Eden、From SurVivor空间、To SurVivor空间,allot buffer(分派空间),可能会分别出多个线程私有的缓冲区,老年代。
五、要领区(Method Area)
要领区(Method Area)与堆区一样属于线程同享的内存地区,用于存储虚拟机加载的类信息、常量、静态变量、立即编译器编译后的代码(动态加载OSGI)等数据。理论上属于java虚拟机的一部分,为了辨别开来叫做 Non-Heap非堆。
这个地区能够挑选不举行垃圾接纳,该地区接纳目标主如果常量池的接纳,及范例的卸载class,内存区不足时会抛出OutOfMemory非常。
运转时常量池:要领区的一部分,Class的版本、字段、接口、要领等,及编译期生成的种种字面量、标记援用,编译类加载后寄存在该地区。会抛出OutOfMemory非常。
六、直接内存(Direct Memory)
直接内存(Direct Memory)不属于虚拟内存地区,是一种基于通道与缓冲区的IO体式格局,能够运用当地函数直接分派堆外内存,在堆中存储援用的外部内存地址,经由过程援用完成对直接援用内存的操纵,1.4以后供应的NIO明显进步效力,避免了堆内存与Native内存的往返复制操纵,不受虚拟机内存掌握,会抛出OUTOfMemory非常。
相干文章教程引荐:java开辟入门
以上就是深入浅出JVM内存数据地区的细致内容,更多请关注ki4网别的相干文章!