您的位置 首页 java

jvm的内存结构是什么样的?

通常我们所说的jvm内存结构指的是 java虚拟机 的运行时数据区结构,它主要包括五个部分,分别是堆、方法区、程序计数器、虚拟机栈和本地方法栈。其中堆和方法区是 线程 共享的,而 程序计数器 、虚拟机栈和本地方法栈是线程私有的。

‬堆

堆是 jvm 管理的最大一块内存空间,在虚拟机启动时创建,随着虚拟机结束而消亡。主要用于存放对象实例和数组,几乎所有对象实例都在这里分配。它也是垃圾回收器主要关注的区域,当创建的对象特别多导致内存不足时此区域会发生OutOfMerryError异常。

‬方法区

方法区主要用于存放被虚拟机加载的类型信息、常量、静态变量以及即使编译器编译后的代码缓存等数据。由于早期的Hotspot JVM 实现,很多人习惯于将方法区称为永久代,但在JDK8及以后版本用本地内存实现的元空间(Metaspace)来替代永久代。元空间和堆使用的不是同一块内存,其分配不受 java 堆大小限制。本地内存又称堆外内存,是指机器内存中不是jvm管理的那部分内存,由操作系统管理,可以避免虚拟机加载类过多而导致内存溢出,但同样不能无限扩展。方法区中其实还有一块区域叫运行时常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。类加载过程可以看:什么是java类的加载过程?

‬程序计数器

程序计数器占用很小的内存空间,每个线程都会有自己独立的程序计数器,用来记录当前线程执行到哪一行指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个 计数器 来完成。当线程正在执行一个java方法时,程序计数器记录的是正在执行的jvm字节码指令的地址。当执行的是一个Native方法时,这个计数器的值为空。

‬虚拟机栈

即java虚拟机栈,它是jvm中每个线程私有的一小块空间,它的 生命周期 随着线程的创建而产生随着线程的结束而消亡。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的java方法调用。虚拟机栈主管java程序的运行,保存方法的局部变量、部分结果,参与方法的调用和返回。每个方法被执行时会创建一个栈帧,用于存储 局部变量 表、操作数栈、动态链接、方法出口等信息。每个方法被调用到执行完的过程对应这一个栈帧在虚拟机栈中从入栈到出栈的过程。最顶部的栈帧称为当前栈帧,栈帧所关联方法称为当前方法,定义这个方法的类称为当前类,该线程中虚拟机只会对当前栈帧进行操作。

‬本地方法栈

本地方法栈和虚拟机栈的作用类似,不同点在于前者是jvm调用本地方法(Native)服务,而后者是jvm调用java的方法服务。常见的Hotspot虚拟机已将两者合二为一。虚拟机规范对本地方法栈中的方法使用的语言、使用方式和数据结构并没有强制规定,具体的虚拟机可以自由实现它。


大家好,我是余生吃蔬菜。欢迎点赞评论转发,收藏加关注,一起学习共同成长。

文章来源:智云一二三科技

文章标题:jvm的内存结构是什么样的?

文章地址:https://www.zhihuclub.com/192993.shtml

关于作者: 智云科技

热门文章

网站地图