美文网首页
JVM内存模型复习

JVM内存模型复习

作者: 静水红阳 | 来源:发表于2022-02-15 10:26 被阅读0次

前言

JVM全称Java Virtual Machine,即Java虚拟机,是用于运行Java程序编译后的字节码文件。

JVM 模型是对于每个java语言的使用者来说都是需要掌握的知识点,在此做一个简单的复习备注。

当我们在编写完Java代码后,Java编译器会将java文件编译为.class文件,然后通过Class Loader将类信息加载到JVM中,最后JVM再去调用操作系统,这样,只要JVM正确执行了.class文件,就可以实现跨平台。

JVM内存模型

先上一张经典的图:

Java内存模型经典图.jpg

主要包括几个部分:

  1. 程序计数器
  2. 本地方法栈
  3. 方法区

一、程序计数器

  1. 程序计数器是一块较小的内存,可以看做是当前线程所执行字节码的行号指示器。当字节码解释器工作时,会通过计数器获取下一条需要执行的字节码指令。
  2. 程序计数器是线程私有的,各个线程之间的程序计数器互不干扰。
  3. 如果一个线程正在执行的是Java方法,则程序计数器记录的是正在执行的字节码指令的地址;如果正在执行的是 native 本地方法,则程序计数器记录的是 Undefined .
    程序计数器内存区是唯一一个在JVM规范中没有规定任何内存溢出情况的区域。

二、 栈

Java栈中保存了局部变量和方法参数等,同时和Java方法的调用,返回密切相关。

Java虚拟机栈也是线程私有的,生命周期和线程相同。

每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用到执行完成的过程,就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。

1. 异常

栈区域有可能会出现以下两种异常:

  1. 如果线程请求的栈深度大于虚拟机所允许的深度,将会抛出StackOverflowError异常,如递归错误。
  2. 如果虚拟机在动态扩展时无法申请到足够的内存空间,将会排除OOM异常,例如死循环创建对象。

三、本地方法栈

本地方法栈和Java虚拟机栈比较相似,其不同在于Java虚拟机栈用于Java方法的调用,而本地方法栈用于Native本地方法的调用。

本地方法栈也是线程私有的。

四、 堆

  1. 堆是线程共享的一块内存区域,在虚拟机启动时创建。
  2. 对于绝大多数应用来说,Java堆是JVM所管理的内存中最大的一块,大部分的对象实例及数据会存放在此。

Java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可。

Java堆也是垃圾收集器管理的主要区域。堆中分为新生代,老年代等(内存回收机制)。

当堆中没有内存可分配时,就会抛出OOM异常。

五、 方法区

方法去同Java堆一样,也是线程共享的内存区域。用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

当方法区无法满足内存分配需求时,将抛出OOM异常。

六、 运行时常量池

首先要区分常量池和运行时常量池。

1. 常量池

常量池,即是class文件的常量池,是class文件的一部分。Java文件被编译成class文件之后,除了包含了类的版本,字段,方法,接口等描述信息,还包括存放编译期生成的各种字面量和符号引用的常量池。

字面量主要包括:文本字符串,被声明为final的变量,基本数据类型的值。

符号引用主要包括:类和接口的全限定名,字段的名称和描述符,方法的名称和描述符。

2. 运行时常量池

运行时常量池是方法区的一部分,当类加载到内存中,JVM就会将class文件常量池中的内容存档到运行时常量池。

七、直接内存

JDK1.4之后加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式。它可以使用Native方法库直接分配堆外指定内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作,这种方式在一些场景中避免了在Java堆和Native堆中来回复制数据。

直接内存是Java堆外的,会直接向系统申请的一块内存空间(直接内存不属于虚拟机运行时数据区)。因此,直接内存的大小不受虚拟机的限制,只受本机内存的限制。通常访问直接内存的速度会快于访问堆的速度。

总结

JVM内存结构复习

相关文章

  • 复习系列-2 jvm内存模型

    复习系列-2 jvm内存模型

  • JVM内存模型(jvm 入门篇)

    概述 jvm 入门篇,想要学习jvm,必须先得了解JVM内存模型,JVM内存模型,JVM内存模型,JVM内存模型,...

  • JVM内存模型复习

    前言 JVM全称Java Virtual Machine,即Java虚拟机,是用于运行Java程序编译后的字节码文...

  • JVM

    栈容量由-Xss指定深入理解JVM—JVM内存模型 JVM内存模型和JVM参数的关系

  • [Java多线程编程之八] Java内存模型

    一、Java内存模型 == JVM内存模型?   很多人都会认为Java内存模型就是JVM内存模型,但实际上是错的...

  • JVM问题及解答

    常见JVM问题 JVM内存模型,GC机制和原理。注意JVM内存模型与Java内存模型(JMM)不是同一个东西。JV...

  • JVM内存结构和Java内存模型

    最近看到两个比较容易混淆的概念:JVM内存结构和Java内存模型 JVM内存结构JVM内存结构或者说内存模型指的是...

  • 高效并发

    从JVM的角度看一下Java与线程,内存模型,线程安全以及JVM对于锁的优化 硬件内存模型与JVM内存模型 硬件的...

  • jvm

    1.5.1JVM的内存模型 首先我们来了解一下JVM的内存模型的怎么样的: 基于jdk1.8画的JVM的内存模型-...

  • JVM基础知识点

    1. 内存模型以及分区,需要详细到每个区放什么(共分为5个)。 JVM内存模型及分区jvm内存模型和内存分配 程序...

网友评论

      本文标题:JVM内存模型复习

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