JVM内存模型/结构和组件

无论何时执行java程序,都会保留一个单独的内存区域,用于存储应用程序代码的各个部分,这些部分大致称为JVM内存。尽管没有必要,但是对这个存储区域的结构有一些了解是有益的。当您开始处理性能调优等更深层次的领域时,它变得更加重要。如果没有很好地理解JVM如何实际消耗内存以及垃圾收集器如何使用此内存的不同部分,您可能会错过一些重要的考虑因素来实现更好的内存管理; 因此性能更好。

在本教程中,我将讨论JVM内存中的各个部分,您应该知道,然后在我将来的一篇文章中,我们将讨论如何使用此信息进行应用程序的性能调优。

目录
 
JVM内存区域/组件
	- 堆区域 
	- 方法区域和运行时常量池 
	- JVM堆栈 
	- 本机方法堆栈 
	- PC寄存器

JVM内存模型/结构

Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,仅在Java虚拟机退出时销毁。其他数据区域是每个线程。线程数据区域是在线程退出时创建和销毁线程时创建的。

让我们看一下运行时内存中各个部分的最基本分类。

JVM内存区域部件

JVM内存区域部件

让我们根据JVM规范中提到的内容快速查看每个组件。

堆区

堆区域表示运行时数据区域,从中为所有类实例和数组分配内存,并在虚拟机启动期间创建。

对象的堆存储由自动存储管理系统回收。堆可以是固定的或动态的大小(基于系统的配置),并且为堆区域分配的内存不需要是连续的。

Java虚拟机实现可以为程序员或用户提供对堆的初始大小的控制,以及如果可以动态扩展或收缩堆,则控制最大和最小堆大小。

 

如果计算需要的堆量超过自动存储管理系统可用的堆,则Java虚拟机会抛出一个OutOfMemoryError


 

方法区域和运行时常量池

方法区域存储每类结构,例如运行时常量池; 场和方法数据; 方法和构造函数的代码,包括类,实例和接口初始化中使用的特殊方法。

方法区域在虚拟机启动时创建。虽然它在逻辑上是堆的一部分但它可以或不可以被垃圾收集,而我们已经读过堆中的垃圾收集不是可选的; 这是强制性的。方法区域可以是固定大小的,或者可以根据计算的需要进行扩展,并且如果不需要更大的方法区域,则可以缩小方法区域。方法区域的内存不需要是连续的。

 

如果方法区域中的内存无法满足分配请求,则Java虚拟机会抛出一个OutOfMemoryError


 

JVM堆栈

每个JVM线程都有一个与线程同时创建的私有堆栈。堆栈存储帧。框架用于存储数据和部分结果,以及执行动态链接,返回方法的值以及调度异常。

它包含局部变量和部分结果,并在方法调用和返回中起作用。因为永远不会直接操作此堆栈,除了推送和弹出帧之外,帧可以是堆分配的。与堆类似,此堆栈的内存不需要是连续的。

该规范允许堆栈可以是固定大小或动态大小。如果它具有固定大小,则可以在创建该堆栈时独立地选择每个堆栈的大小。

如果线程中的计算需要比允许的更大的Java虚拟机堆栈,则Java虚拟机会抛出一个StackOverflowError

 

如果可以动态扩展Java虚拟机堆栈,并且尝试进行扩展但可以使内存不足以实现扩展,或者可以使内存不足以为新线程创建初始Java虚拟机堆栈,则Java Virtual机器抛出一个OutOfMemoryError


 

本机方法堆栈

本机方法堆栈称为C堆栈; 它支持本机方法(用Java编程语言以外的语言编写的方法),通常在创建每个线程时按每个线程分配。无法加载本机方法且本身不依赖于传统堆栈的Java虚拟机实现无需提供本机方法堆栈。

本机方法堆栈的大小可以是固定的也可以是动态的。

如果线程中的计算需要比允许的更大的本机方法堆栈,则Java虚拟机会抛出一个StackOverflowError

 

如果可以动态扩展本机方法堆栈并尝试进行本机方法堆栈扩展,但可以使内存不足,或者如果没有足够的内存可用于为新线程创建初始本机方法堆栈,则Java虚拟机会抛出OutOfMemoryError


 

PC注册

每个JVM线程都有自己的程序计数器(pc)寄存器。在任何时候,每个JVM线程都在执行单个方法的代码,即该线程的当前方法。

由于Java应用程序可以包含一些本机代码(例如,使用本机库),因此我们有两种不同的本机和非本机方法。如果该方法不是本机方法(即Java代码),则PC寄存器包含当前正在执行的JVM指令的地址。如果该方法是本机方法,则JVM的PC寄存器的值是未定义的。

Java虚拟机的pc寄存器足够宽,可以在特定平台上保存返回地址或本机指针。

现在这一切都与JVM内部的内存区域结构有关。我将提出想法,以便在即将发布的帖子中使用此信息进行性能调整。

快乐学习!!

参考: http  //docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

猜你喜欢

转载自blog.csdn.net/u010675669/article/details/86640312
今日推荐