jvm内存结构 内存模型 区别(简述JVM内存模型以及作用)
jvm内存结构 内存模型 区别(简述JVM内存模型以及作用),本文通过数据整理汇集了jvm内存结构 内存模型 区别(简述JVM内存模型以及作用)相关信息,下面一起看看。
JVM(Java虚拟机)主要包括五个区域,分别是程序计数器、虚拟机栈、本地方法栈、堆和方法区。在JVM中,有一个堆和一个方法区,一个线程有一个栈和一个程序计数器。五个区域中,栈变化最频繁,方法区先有数据,垃圾收集器主要针对堆。
1.程序计数器(PC寄存器)
在JVM中,多线程以线程交换CPU执行时间,在任何给定的时刻,一个CPU只会执行一个线程的指令。,为了在线程切换后恢复到正确的执行位置,每个线程都需要一个独立的程序计数器。
程序计数器占用非常小的内存空间,并且是线程私有的。每个线程在运行时都会有一个独立的计数器,这是Java虚拟机规范中唯一没有指定任何OutOfMemoryError的地方。如果程序执行时线程执行Java方法,计数器有一个值,记录程序正在执行的字节码指令的地址;如果执行Natvie方法,则计数器的值是未定义的。
2.虚拟机堆栈
Java虚拟机栈是线程私有的,其生命周期与线程一致。Java中存储有堆栈帧,每个堆栈帧对应一个被调用的方法。当方法被调用时,方法所需的内存空间被分配在堆栈内存中,这被称为堆栈压入。方法执行后,该方法所属的内存空间被释放,称为pop栈(栈内存遵循FIFO,LIFO的原理)。虚拟机栈主要存储局部变量、引用、操作数栈、动态链接、方法出口等信息。
在Java虚拟机规范中,为这一领域指定了两个例外
StackOverflowError:线程请求的堆栈深度大于虚拟机允许的深度。
OutOfMemoryError:如果虚拟机堆栈可以动态扩展,但扩展时无法申请足够的内存。
3.本地方法堆栈
本地方法栈的功能和原理与Java虚拟机栈非常相似,只是虚拟机栈为虚拟机服务Java方法(即字节码),而本地方法栈为虚拟机使用的原生方法服务。
局部方法堆栈区域也会抛出StackOverflowError和OutOfMemoryError异常。
4.许多
对于大多数应用程序来说,这个区域是JVM管理的最大内存。堆是所有线程共享的区域,在创建虚拟机时启动。堆主要存储对象实例和数组,程序执行时使用new运算符创建的Java对象存储在堆内存中。对象中有实例变量,实例变量存储在堆内存中。它是垃圾收集机制的主要管理区域。
在Java虚拟机规范中,为这一领域指定了一个例外
OutOfMemoryError:如果堆中没有内存来完成实例分配,并且堆无法再扩展,则会引发此异常。
5.方法区域
像堆一样,方法区域是所有线程共享的区域。主要存储类信息(类名、方法信息、字段信息)、静态变量、常量、编译后的代码片段(加载类时会加载)。
在类文件中,除了类的字段、方法和接口的描述信息外,还有一个常量池,用来存储编译时产生的文字量和符号引用。
方法区域中非常重要的一部分是运行时常量池,它是每个类或接口的常量池的运行时表示。在将类和接口加载到JVM中之后,就会创建相应的运行时常量池。,并不是类文件常量池的内容可以进入运行时常量池。在运行时,新的常量也可以放入运行时常量池,比如String的intern方法。当应用程序由于内存有限而无法运行时,将引发OutOfMemoryError异常。
6.垃圾收集器[自动垃圾收集机制,GC机制]什么时候会考虑回收一个Java对象的内存?
当堆中的Java对象成为垃圾数据时,它们将被垃圾收集器收集。
堆内存中的Java对象什么时候会变成垃圾?
当没有引用它的时候。
无法访问此对象,因为访问对象只能通过引用来访问。
更多jvm内存结构 内存模型 区别(简述JVM内存模型以及作用)相关信息请关注本站,本文仅仅做为展示!