什么是JVM

首先JVM是运行Java代码的假想计算机,运行在操作系统之上的,与硬件没有直接的交互。Java源文件经过编译后形成字节码文件,通过JVM的类加载的机制进入Java虚拟机的运行数据区,再通过一套的字节码指令集,将Java的代码翻译成计算机能够识别的指令,最终实现Java代码在计算机上的运行实现。

  • 其中的JVM内存布局的概念:指的就是JVM的运行数据区

JVM运行数据区

1、JVM中内存的划分主要为5部分:虚拟机栈、本地方法栈、程序计数器、方法区和堆
JVM的内存布局
2、通过上图可以查看到,JVM内存可以分为两部分,其中一部分为线程私有内存,包括的有程序计数器、本地方法栈和虚拟机栈;第二部分线程共享的内存划分为方法区和堆

线程私有内存

1、程序计数器

该内存的作用:用来指示和记录当前线程在执行字节码时的行号信息(地址信息);
每一个线程都有一个程序计数器,线程之间程序计数器互不干扰,相互独立;
程序计数器是唯一一个没有outofmemoryerror 错误的内存区域

2、虚拟机栈

作用:每一个方法在执行的过程中,都会创建一个栈帧用来存储局部变量表、操作数栈、动态链接和方法出口信息,其生命周期和线程是相同的;
对应的每一个方法从调用到结束,就意味着在虚拟机栈帧上的入栈和出栈的操作;
对于执行引擎来说:每一个处于栈帧顶部的方法栈帧才是有效的,也被称为当前方法;
该内存可能会出现的异常:stackoverflowerror 意味着栈帧的个数超过虚拟机栈帧的最大的深度,outofmemoryerror 意味着虚拟栈帧无法申请足够的内存;

3、本地方法栈

本地方法栈和虚拟机栈是功能相同的,区别在于本地方法栈适用于的是本地方法;

线程共享的内存

1、方法区

作用就是存储对象:对象包括被虚拟机加载的类的信息、常量、静态变量、编译后的代码、运行时常量池信息;
运行时常量池:Class 文件中的常量池(编译器生成的字面量和符号引用)会在类加载后被放入这个区域;
和堆一样不需要连续的内存,并且可以动态扩展,动态扩展失败一样会抛出 OutOfMemoryError 异常;

2、堆

堆的作用:存放实例对象、数组对象等;是JVM内存回收的主要区域;
堆不需要连续内存,并且可以动态增加其内存,增加失败会抛出 OutOfMemoryError 异常;

3、直接内存

在 JDK 1.4 中新引入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据
JVM的内存布局
JVM的内存布局

相关文章:

  • 2022-01-20
  • 2021-08-02
  • 2021-11-08
  • 2021-09-18
  • 2021-07-12
  • 2021-06-29
  • 2021-09-04
  • 2022-01-13
猜你喜欢
  • 2021-09-10
  • 2021-07-12
  • 2021-10-26
  • 2021-05-06
相关资源
相似解决方案