jvm内存模型和运行时数据区,jvm各个内存区域的主要作用

  jvm内存模型和运行时数据区,jvm各个内存区域的主要作用

  JAVA程序运行在虚拟机上,运行时需要内存空间。在执行JAVA程序的过程中,虚拟机管理的内存会被划分成不同的数据区,便于管理。虚拟机的管理内存数据区划分如下:

  如何解决写爬虫IP受阻的问题?立即使用。

  学习视频推荐:java在线教程

  一、程序计数器(Program Counter Register)

  字节码指令的行号指示、分支、循环、跳转、异常处理和线程恢复(CPU切换)。每个线程都需要一个独立的计数器,线程的私有内存互不影响,所以这个区域不会出现内存溢出异常。

  二、虚拟机栈(VM Stack)

  虚拟机栈(VM Stack)是线程私有的,其声明周期与线程相同。VM栈是Java方法执行的内存模型,每执行一个方法都会创建一个栈帧,这是方法执行过程中的基本数据结构。

  栈用来存储:局部变量表、操作数栈、动态链接、方法出口等。每一次方法执行都对应着虚拟机栈帧从入栈到堆栈的过程。是一种数据结构,虚拟机中的局部变量表,对应物理层上的程序数据模型。

  局部变量表是一个程序运行数据模型,它存储了编译时已知的各种数据类型,比如:

  Boolean、byte、char、short、int、float、long、double、对象引用类型(对象内存地址变量、指针或句柄)。程序运行时,根据局部变量表分配堆栈帧空间。在操作中,大小是相同的异常类型:stackOverFlowError线程请求堆栈深度大于虚拟机允许的深度。内存不足,无法扩展。

  三、本地方法栈(Native Method Stack)

  类似于虚拟机栈,虚拟机栈服务于Java程序,本地方法栈支持虚拟机的运行服务。具体实现由虚拟机厂商决定,也会抛出stackOverFlowError和OutOfMemory异常。

  四、堆(Heap)

  堆是虚拟机管理内存中最大的部分,由所有线程共享,用于存储对象实例(对象、数组)。它是一个物理上不连续的内存空间。由于GC收集器是分代收集的,所以分为:新一代Eden,从幸存者空间,到幸存者空间,allot buffer(分配的空间),可能分为多个线程的私有缓冲区。晚年。

  五、方法区(Method Area)

  方法区和堆区一样,属于线程共享的内存区,用于存储类信息、常量、静态变量、虚拟机加载的即时编译器(动态加载OSGI)编译的代码等数据。理论上它是java虚拟机的一部分,为了区别于其他,称之为非堆。

  这个区域可以选择不进行垃圾收集。这个区域收集的目的主要是收集常量池,卸载类型的类。当内存区域不足时,将抛出OutOfMemory异常。

  运行时常量池:方法区域、版本、字段、接口、方法等的一部分。以及编译期间生成的各种文字量和符号引用。编译后的类在加载后存储在这个区域。将引发OutOfMemory异常。

  六、直接内存(Direct Memory)

  直接内存不属于虚拟内存区,是一种基于通道和缓冲区的IO模式。它可以利用局部函数直接分配堆外的内存,将被引用的外部内存地址存储在堆中,通过引用完成直接引用内存的操作。1.4之后提供的NIO显著提高了效率,避免了堆内存和原生内存的来回复制操作,不受虚拟机内存控制时会抛出OUTOfMemory异常。

  相关文章教程推荐:java开发入门。以上简单来说就是JVM内存数据区的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: