栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM内存模型

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM内存模型

Java虚拟机所管理的内存包括:虚拟机栈、本地方法栈、堆、方法区、程序计数器五块。
方法区、堆是所有线程共享的数据区;虚拟机栈、本地方法栈、程序计数器是线程私有的数据区。

1.程序计数器:
是线程私有的;程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,字节码解释器就是通过改变这个计数器的来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

2.Java虚拟机栈:
虚拟机栈就是我们平常说的堆栈的那个栈。Java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型;每个方法执行的时候,Java虚拟机都会同步创建一个栈帧(Stack frame)用来存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

3.本地方法栈:
本地方法栈与虚拟机栈发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地方法服务。

4.Java堆:
Java堆是虚拟机所管理的内存中最大的一块,Java堆是被所有线程共享的一块内存区域,在虚拟机启动创建它的唯一目的就是存放对象实例,Java世界里几乎所有的对象实例都在这里分配内存。
Java堆是垃圾收集器管理的内存区域,因此也被称作“GC堆”(Garbage Collected),现代垃圾收集器大部分是基于分代收集理论设计的,堆内存分为新生代(Young)和老年代(Old),新生代又被划分为三个区域:Eden、From Survivor、To Survivor。

如果从分配内存的角度看,所有线程共享的Java堆可以划分出多个线程私有的分配缓冲区,以提升对象分配时的效率。不过无论从什么角度,无论如何划分,都不会改变Java堆中存储内容的共性,无论是哪个区域,存储的都只能是对象的实例,将Java堆细分的目的只是为了更好的回收内存、或者更快的分配内存。
根据《Java虚拟机规范》的规定,Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的,这点很像我们用磁盘空间去存储文件一样,并不要求每个文件都连续存放。但对于大对象(如数组对象),多数虚拟机实现出于简单、存储高效的考虑,很可能会要求连续的内存空间。
Java堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的。如果在Java堆中没有完成实例分配,并且堆也无法再扩展时,Java虚拟机将会抛出OutOfMemory Error异常。

5.方法区:
方法去也是各个线程共享的内存区域。方法区有个别称non-heap(非堆),方法区可以看作是一块独立于堆的内存空间它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
方法区在jvm启动时被创建,并且它的实际物理内存空间和Java堆一样都是可以不连续的;
方法区的大小跟堆空间一样,可以选择固定大小或者扩展;
方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误;
关闭jvm就会释放这个区域的内存;

栈,堆,方法区的交互:

运行时常量池:是方法区的一部分,用于存储常量和类中的符号引用(符号引用:指类名,方法名,字段名等;直接引用:类解析时会将这些符号引用转为直接引用,直接引用就为他们在方法区内存中分配的地址)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769998.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号