Java教程

JVM基础学习(一):JVM内存模型

本文主要是介绍JVM基础学习(一):JVM内存模型,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在Java进阶知识的学习中,JVM都是避不过去的一关,我个人对于JVM的理解其实就是相当于在操作系统的外层再加了一层中间层,从来屏蔽了具体硬件之间的不同实现,使得Java实现了最重要的特性:一次编译,处处运行。本分类中的内容都是基于《深入理解Java虚拟机》中的内容以及网络上面博客整理,外加自己的理解。
今天的内容是JVM中的基础:JVM内存模型

JVM内存模型

JVM中的内存模型主要分为五大块:程序计数器,虚拟机栈,本地方法栈,堆,方法区
image
其中,方法区与堆是所有线程共享使用的区域,而虚拟机栈、本地方法栈、程序计数器则是线程内共享的区域。

  • 方法区中存放是常量、数据类型、字节码动态生成的代码等数据
  • 堆中存放的是对象等数据
  • 程序计数器中存放的是线程执行到哪一步的计数器,它也是《Java虚拟机规范》中唯一一个没有内存溢出错误的区域
  • 虚拟机栈中存放了局部变量表等数据,主要是保存方法执行的中间变量
  • 本地方法栈的职能与虚拟机栈类似,所以有些JVM将虚拟机栈与本地方法栈合并起来一起处理

方法区

在jdk8之前,方法区使用永久代实现,永久代主要是为了避免单独写一个内存管理;而在jdk8之后抛弃了永久代的相关概念,而是改用元空间来存储。
方法区中主要是存储数据类型、常量等数据;在jdk8之前,使用永久代实现方法区,永久代相当于是利用JVM自己的内存开辟了一个区域,所以导致JVM更容易OOM;而在jdk8之后,则全面替换成了元空间,元空间使用本地内存进行实现。

方法区中的分布:
image

运行时常量池

首先需要区分常量池和运行时常量池这两个概念;

  • 运行时常量池是方法区的一部分,其中存放着常量。
  • 常量池一般指的是Class文件中的常量池表,在之后会介绍相关内容,这里先一笔带过。

运行时常量池是一个动态性的内存区域,开发人员可以动态性的往其中加入常量,其中最常见的便是String类的intern()方法。如果常量过多,那么便会爆OOM异常。

Java堆

Java堆的用处便是存放对象实例,JVM中基本上所有的对象实例都是存放于Java堆中,如果对象创建过多并且没有足够内存,则直接爆OOM异常。

程序计数器

相当于记录线程当前执行的位置的相关信息

Java虚拟机栈

我们都知道,Java方法会创建一个栈来执行,指的就是Java虚拟机栈,描述的是Java方法执行的线程内存模型。每个方法被执行的时候,Java虚拟机栈会同步创建一个栈帧存储局部变量表、操作数栈、动态连接、方法出口等信息,栈帧对应其方法从入栈到出栈的过程。

本地方法栈

本地方法栈跟Java虚拟机栈类似,所以有些JVM将其余Java虚拟机栈内存区域合并。其主要是为本地(Native)方法服务

这篇关于JVM基础学习(一):JVM内存模型的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!