网站首页一般做多大,安阳县吕村七中录取分数线,黄骅港引航站,dede自动生成网站地图JVM内存模型JVM分为五个区域#xff1a;虚拟机栈、本地方法栈、方法区、堆、程序计数器。JVM不同区域的占用内存大小不同#xff0c;一般情况下堆最大#xff0c;程序计数器较小。JVM五个区中虚拟机栈、本地方法栈、程序计数器为线程私有#xff0c;方法区和堆为线程共享区…JVM内存模型JVM分为五个区域虚拟机栈、本地方法栈、方法区、堆、程序计数器。JVM不同区域的占用内存大小不同一般情况下堆最大程序计数器较小。JVM五个区中虚拟机栈、本地方法栈、程序计数器为线程私有方法区和堆为线程共享区。堆堆的作用是存放对象实例和数组。因为堆占用内存空间最大堆也是Java垃圾回收的主要区域重点对象因此也称作“GC堆”Garbage Collected Heap。堆的GC操作采用分代收集算法。堆分为新生代和老年代新生代又分为Eden空间、From SurvivorS0空间、To SurvivorS1空间。关于Survivor区Survivor的两个区是对称的没先后关系所以同一个区中可能同时存在从Eden复制过来的对象和从前一个Survivor复制过来的对象而复制到老年代的只有从第一个Survivor区过来的对象。而且Survivor区总有一个是空的。调节的参数主要有-Xms设置堆的最小空间大小。-Xmx设置堆的最大空间大小。-XX:NewSize设置新生代最小空间大小。-XX:MaxNewSize设置新生代最大空间。图中Virtual区域就是设置参数中最大空间和最小空间之间的差值。关于老年代没有直接设置老年代的参数但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。老年代空间大小堆空间大小-年轻代大空间大小如果在堆中没有内存完成实例分配并且堆也无法再扩展时将会抛出OutOfMemoryError异常。方法区方法区Method Area用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据方法区与Java 堆一样是各个线程共享的内存区域。虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分但是它却有一个别名叫做Non-Heap非堆目的应该是与Java 堆区分开来。调节的参数-XX:PermSize设置永久代最小空间大小。-XX:MaxPermSize设置永久代最大空间大小。-Xss设置每个线程的堆栈大小。关于永久代Permanent Generation和方法区本质上两者并不等价仅仅是因为HotSpot虚拟机的设计团队选择把GC 分代收集扩展至方法区或者说使用永久代PermGen来实现方法区而已。其他JVM虚拟机并没有永久代jdk8中也没有了永久代的概念。相对而言垃圾收集行为在这个区域是比较少出现的但并非数据进入了方法区就如永久代的名字一样“永久”存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载。根据Java虚拟机规范的规定当方法区无法满足内存分配需求时将抛出OutOfMemoryError异常。 jdk8中将永久代方法区替换为元数据空间MetaSpaceMetaSpace占用的内存空间不在JVM内部而在本地内存空间中。程序计数器程序计数器Program Counter Register占用内存较小是线程私有的它也是唯一没有OutOfMemoryError异常的区域。程序计数器的作用可以看做是当前线程所执行的字节码的行号指示器字节码解释器工作时就是通过改变计数器的值来选取下一条字节码指令。其中分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器来完成。Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的在任何一个确定的时刻一个处理器对于多核处理器来说是一个内核只会执行一条线程中的指令。因此为了线程切换后能恢复到正确的执行位置每条线程都需要有一个独立的程序计数器各条线程之间的计数器互不影响独立存储我们称这类内存区域为“线程私有”的内存。如果线程正在执行的是一个Java方法这个计数器记录的是正在执行的虚拟机字节码指令的地址如果正在执行的是Natvie方法这个计数器值则为空Undefined。虚拟机栈虚拟机栈JVM Stacks线程私有生命周期与线程相同。这里存储着方法的局部变量表。栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。局部变量表(Local Variable Table)是一组变量值存储空间用于存放方法参数和方法内定义的局部变量。包括8种基本数据类型、对象引用reference类型和returnAddress类型指向一条字节码指令的地址。其中64位长度的long和double类型的数据会占用2个局部变量空间Slot其余的数据类型只占用1个。如果线程请求的栈深度大于虚拟机所允许的深度将抛出StackOverflowError异常如果虚拟机栈动态扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常。本地方法栈本地方法栈Native Method Stacks与虚拟机栈作用相似也会抛出StackOverflowError和OutOfMemoryError异常。区别在于虚拟机栈为虚拟机执行Java方法字节码服务而本地方法栈是为虚拟机使用到的Native方法服务。