简单了解JVM结构

JVM的结构图

在这里插入图片描述

每个模块的简述

类加载子系统:类加载子系统用于将编译好的.Class文件加载到JVM中

运行时数据区:运行时数据区用于存放JVM在运行时产生的数据

程序计数器:程序计数器是线程私有的,用来存储当前线程运行时所执行的字节码的行号指示器。在方法运行时,程序计数器存储的是当前的虚拟机字节码指令的地址,不过如果方法是本地方法,那么程序计数器的值是空的。简单的理解,可以想象成平时退出视频后,再进视频能够从中断的时间点开始看,这就是程序计数器的作用类比了。这里补充一句,程序计数器是唯一不会发生内存溢出的区域。

虚拟机栈:栈是线程私有的,它描述了方法的执行过程。栈里面是一个个栈帧,每个栈帧对应一个方法。每当有一个方法被执行时,虚拟机都会创建一个对应该方法的栈帧,方法的执行和返回(发生异常也算)对应栈帧的入栈和出栈。

本地方法栈:本地方法栈是线程私有的,作用和虚拟机栈海是类似的,区别就是虚拟机栈是为java方法服务,而本地方法栈就是为本地方法服务。

方法区:方法区是线程共享的,主要存储类信息,常量,静态变量,运行时常量池,即时编译器编译过后的机器码。方法区是一种规范,每个虚拟机的实现是不同的。而我们大多数使用的虚拟机都是HotSpot,HotSpot把GC分代收集扩展至方法区,也可以说使用了永久代来实现方法区。不过Java8以后,永久代被移除,取而代之的是元空间。相比其永久代受限于JVM的内存大小,元空间直接使用的是操作系统的本地内存,同时将原来存储在永久代的常量池和静态变量等并入了堆中,这样等于是把永久代的数据分到了堆和元空间两个区域。

虚拟机堆:堆是线程共享的,堆用来存储JVM运行的产生的对象和数据。堆是垃圾回收的的最主要区域,Java堆从GC的角度可以细分为新生代,老年代和永久代。新生代和老年代占据的堆内存比例默认是1:2,而新生代里又被细分为Eden区,ServivorTo区和ServivorFrom区,Eden:ServivorTo:ServivorFrom占据新生代空间默认比例是
8:1:1。

发布了136 篇原创文章 · 获赞 109 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104067822