jvm编程语言-JVM系列

Java程序员必会知识——JVM内存模型

2020-04-21  本文已影响0人  十六线程序员

JVM基本结构

JVM内存空间.png
JVM内存区域主要分为线程共享数据区域(方法区、堆)线程私有数据区域(栈、本地方法栈、程序计数器(也可以叫PC寄存器))直接内存

概念介绍

方法区(线程共享数据区域)

主要存放JVM加载的类信息和运行时常量池

其中类信息包括:类型信息、类型的常量池、字段信息、方法信息、类变量、指向类加载器的引用、指向class实例的引用、方法表等。
运行时常量池:Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池 ,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中

注意

堆(线程共享数据区域)
  1. 创建的对象和数组都保存在JAVA堆中
  2. 垃圾收集器的主要工作空间
  3. 所有线程共享JAVA堆
  4. 由于现代GC算法主要是分代收集算法,所以JAVA堆也是分代的。可以分为:新生代(Eden区、From Survior区和To Survior区)和老年代
虚拟机栈(线程私有数据区域)
  1. 栈由一系列帧组成,因此虚拟机栈也叫做帧栈
  2. 帧保存一个方法的局部变量表、操作数栈、动态链接、方法出口(返回地址)等信息
  3. 每一个方法从调用直至执行完成的过程,就对应的一个帧在虚拟机栈中入栈到出栈的过程
  4. 位于栈顶的栈帧称做“当前活跃栈帧”
栈.png 操作数栈eg.png 方法出口描述.png
本地方法栈(线程私有数据区域)

本地方法区和JAVA栈作用类似, 区别是虚拟机栈为执行Java方法服务, 而本地方法栈则为 Native方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

Native方法:是Java通过调用其他语言实现的方法。在JVM层面,是Java通过JNI直接调用本地C/C++库,可以认为是 Native 方法相当于 C/C++ 暴露给 Java 的一个接口,Java 通过调用这个接口从而调用到 C/C++ 方法。(JNI和JNIEnv又是什么关系呢?)

程序计数器(线程私有数据区域)
  1. 一块较小的内存空间, 是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的 程序计数器,这类内存也称为“线程私有”的内存。
  2. 正在执行Java方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如 果还是Native方法,则为空。
  3. 这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError情况的区域。
上一篇下一篇

猜你喜欢

热点阅读