美文网首页其他零散知识点
JVM - 运行时数据区域(1)

JVM - 运行时数据区域(1)

作者: happyJared | 来源:发表于2019-07-24 09:12 被阅读116次

Java 虚拟机在执行 Java 程序的过程中,会把它管理的内存划分成若干个不同的数据区域。

JDK1.8 和之前的版本略有不同,下面会介绍到。

JDK1.8 之前:

JDK1.8 前的运行时数据区域

JDK1.8 :

JDK1.8 运行时数据区域

线程私有的:

  • 程序计数器
  • 虚拟机栈
  • 本地方法栈

线程共享的:

  • 方法区
  • 直接内存 (非运行时数据区的一部分)

程序计数器

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

另外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

程序计数器主要有两个作用:

  1. 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理
  2. 多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪

注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。

虚拟机栈

与程序计数器一样,Java 虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型,每次方法调用的数据都是通过栈传递的。

Java 内存可以粗糙的区分为堆内存(Heap)和栈内存 (Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表的部分。 (实际上,Java 虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。)

局部变量表主要存放了编译器可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。

Java 虚拟机栈会出现两种异常:StackOverFlowError 和 OutOfMemoryError。

  • StackOverFlowError: 若 Java 虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时,就抛出 StackOverFlowError 异常
  • OutOfMemoryError: 若 Java 虚拟机栈的内存大小允许动态扩展,且当线程请求栈时内存用完,无法再动态扩展,此时抛出 OutOfMemoryError 异常

Java 虚拟机栈也是线程私有的,每个线程都有各自的 Java 虚拟机栈,且随着线程的创建而创建,随着线程的死亡而死亡。

扩展:那么方法/函数是如何调用的?

类比数据结构中的栈,Java 栈中保存的主要内容是栈帧,每一次函数调用,都会有一个对应的栈帧被压入,每一个函数调用结束后,都会有一个栈帧被弹出。

Java 方法有两种返回方式,不管哪种返回方式都会导致栈帧被弹出:

  1. return 语句
  2. 抛出异常

本地方法栈

和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈,则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。

本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。

方法执行完毕后,相应的栈帧也会出栈并释放内存空间,也会出现 StackOverFlowError 和 OutOfMemoryError 两种异常。

相关文章

  • JMM与可见性

    JMM jvm运行时数据区域 Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域...

  • Java内存管理

    2.9 JVM内存管理 2.9.1 运行时数据区域 JVM所管理的内存可以分为一下几个运行时数据区域: 其中方法区...

  • JVM Specification -Run-Time Data

    JVM规范 - JVM运行时数据区域(每天做点翻译1) https://docs.oracle.com/javas...

  • jvm内存模型及GC记录

    在jvm中有一块非常重要的区域,就是jvm运行时数据区。今天对该区域做下总结和记录: 在讨论jvm运行时数据区前,...

  • 《深入理解Java虚拟机》(一)--Java内存区域与内存溢出异

    - 1 运行时数据区域 JVM在执行的过程中会把它所管理的内存划分为若干个不同的数据区域。根JVM规范,Java虚...

  • 第二章(一) 运行时数据区域

    本篇讲述JVM运行时数据区域。以JDK7为主。 本文1个TODO。 运行时数据区域 程序计数器 字节码指令行号指示...

  • 第一章 java虚拟机内存概要

    ###jvm运行时数据区域(NO.1) > >(img) >(img) ##程序计数器 >程序计数器在jvm中是一...

  • jvm 运行时数据区-01

    jvm 运行时数据区 jvm 运行时数据区 ,将内存划分为5个区域,java 代码在运行时 类里面的 组成部分 分...

  • jvm系列之内存区域

    jvm系列之内存区域 1 运行时数据区域    想要了解jvm,那对其内存分配管理的学习是必不可少的;java虚拟...

  • java面试题 --- JVM之体系结构

    1. JVM 由哪些区域构成?由类加载器和运行时数据区构成;运行时数据区又分为线程私有和线程共享两大区域,线程私有...

网友评论

    本文标题:JVM - 运行时数据区域(1)

    本文链接:https://www.haomeiwen.com/subject/loonlctx.html