一文看懂JVM内存区域分布与作用

那么我们在开始介绍Java内存区域之前,我们先放一张内存区域的图,方便我们后面介绍的时候可以对照着看。

须知,本文是根据JDK8来介绍的。

一文看懂JVM内存区域分布与作用

程序计数器

首先它是线程私有的,它也称为代码的行号指示器,字节码解释器就是通过改变程序计数器的位置来确定下一行要执行的代码,它不存在OOM。

如果线程正在执行一个Java方法,那么它记录的是正在执行虚拟机字节码指令的地址,如果是一个本地方法那么它的值为空。

Java虚拟机栈

它也是线程私有的,它的声明周期和线程一致。每个线程创建时都会创建一个虚拟机栈,内部保存了一个个的栈帧,每个栈帧就对应着一次方法的调用。既然知道了虚拟机栈里面存放的是一个个的栈帧,那么也不难猜出虚拟机栈里面都存储了什么东西。

Java虚拟机栈是存在OOM的,当线程所请求的栈的深度大于虚拟机栈的深度或者虚拟机栈可以动态扩容,当栈扩展时无法申请到足够的内存时,就会抛出OOM。

  • 虚拟机栈内部结构

一文看懂JVM内存区域分布与作用
  • 局部变量表: 主要存储方法的参数,所有的基本类型数据和对象地址,以及返回地址类型(return address)。它以变量槽为最小的存储单位,Java虚拟机并没有规定一个变量槽占用多少内存空间,但是规定了一个变量槽可以存放一个32位以内的数据类型。如果存储的数据类型超过32位,比如long、double,那么就使用两个变量槽进行存储。
  • 操作数栈: 操作数栈是一个先进后出的操作数栈,当一个方法刚开始执行的时候,一个新的栈帧也会随之被创建出来,这个方法的操作数栈是空的,它主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。如果被调用的方法有返回值,那么返回值将会被压入当前栈帧的操作数栈中。操作数栈并非采用索引的方式进行数据访问,而是通过入栈(push)和出栈(pop)操作来完成数据的访问。
  • 动态链接: 大白话就是,栈帧中保存了一个方法的引用,当执行方法的时候,可以拿着这个引用到运行时常量池中找到这个方法。 动态链接的作用就是将这些方法的符号引用转换为调用方法的直接引用。
  • 方法返回地址: 就是在方法执行结束之后,要返回下一条要执行代码位置的值,也就是程序计数器的值。 那么除了方法正常执行结束退出外,还有另外一种情况就是异常导致的方法退出,那么这种情况下是不会返回任何值的。对于抛出的异常,栈帧中不会做任何记录,但是会记录在一个异常表中。

本地方法栈

Java虚拟机栈为虚拟机执行Java方法服务,本地方法栈则为虚拟机使用到的本地方法服务。像JVM就有好多C语言写的方法,这个就需要本地方法栈来执行。

Java堆

Java堆是虚拟机中最大的一块内存空间,它被所有的线程共享,在虚拟机启动时创建。它唯一的目的就是存放对象实例。

如果面试被问到,所有的对象实例都是在堆中分配内存吗?这个时候你一定要回答,不是。

随着即时编译技术的发展进步,尤其是逃逸分析技术的日渐强大,栈上分配、变量替换等优化手段,让实例在”只在堆”中分配不再成为绝对。

Java堆是垃圾收集的主要区域,Java堆中也经常出现新生代、老年代、永久代等等,这里需要注意,这些并不是Java堆物理上的内存布局,它是作为垃圾收集器而划分一种内存布局。

方法区

方法区也是线程共享的区域,它主要用于存储被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

方法区它是可以被垃圾收集器进行回收的,主要针对类型的卸载和常量池的回收。

方法区也可以产生OOM,当方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。

运行时常量池

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等信息外,还有一项信息是常量池表,它用来存储编译期生成的各种字面量和符号引用。

如果动态链接那块没看懂,那么看了运行常量池再翻回去看看是不是好理解了。

原文链接

Original: https://www.cnblogs.com/bingfengdada/p/15464235.html
Author: 一个程序员的成长
Title: 一文看懂JVM内存区域分布与作用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/686138/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 3、Swift协程详解:调用协程

    我们现在已经知道怎么定义异步函数了,也可以很轻松的转换将现有的异步回调 API 转成异步函数。那下一个问题就是,既然普通函数不能调用异步函数,那定义好的这些异步函数该从哪儿开始调用…

    技术杂谈 2023年6月1日
    078
  • TOGAF有哪些学习要点?

    TOG已为学员定义了详细的学习要点,你可以下载大纲(英文)阅读,或者获得完全依照学习要点编写的认证授课讲义。 http://ea.zhoujingen.cn/5041.h tml …

    技术杂谈 2023年5月31日
    0100
  • flink metric库的使用和自定义metric-reporter

    flink内部实现了一套metric数据收集库。 同时flink自身系统有一些固定的metric数据, 包括系统的一些指标,CPU,内存, IO 或者各个task运行的一些指标。具…

    技术杂谈 2023年6月21日
    080
  • RHCSA认证考试

    考试要求: 在 mars.domain250.example.com 上执行以下任务。○ 复查 ○ 完成 配置网络设置○ 复查 ○ 完成 配置您的系统以使用默认存储库○ 复查 ○ …

    技术杂谈 2023年6月21日
    0119
  • 【JAVA】排序算法之选择排序

    1.前言 基础排序算法,旨在简单易懂讲解算法逻辑和思路,以下均使用 升序方式来讲解和实现算法。 2.思路 选择排序重在 选择二字,比如给定一串数字 5 3 4 1 2,我们选定第一…

    技术杂谈 2023年6月21日
    071
  • typedef

    为类型定义别名 typedef int Int 这样 Int 就是 int类型的别名,就可以使用 Int来定一整形变量. 只需要在类型变量生命的基础上,再加一个关键字 typede…

    技术杂谈 2023年7月11日
    051
  • manim 4.0 方向导论

    有两条路要走: 1、理解manim源码 2、学习其他manim制作者创造的效果 posted @2022-11-08 10:21 树叶本子 阅读(8 ) 评论() 编辑 Origi…

    技术杂谈 2023年7月24日
    067
  • Gitlab 403 forbidden 并发引起IP被封

    问题 在工作中自搭建的Gitlab。但今天打开页面的时候显示的是空白页面,上面还有一次文本Forbidden。 原因 Gitlab使用rack_attack做了并发访问的限制。 解…

    技术杂谈 2023年7月11日
    051
  • 手机端适配

    添加此标签 图片自适应: Original: https://www.cnblogs.com/cjin-01/p/16676834.htmlAuthor: 2337Title: 手…

    技术杂谈 2023年7月23日
    075
  • seldom 实战技巧

    seldom 是我一直在维护的自动化测试框架。目前GitHub已经 500+ star。 最近在项目中使用Seldom + poium 编写自动化测试用例。接下来,我就分享一些使用…

    技术杂谈 2023年5月31日
    0105
  • 测试计划

    ​ 1.测试计划的定义:描述需要完成的所有工作,包括被测项目的目的、背景、范围、资源、进度、环境、任务、策略,以及相应的风险和措施。 ​ 2.测试计划的作用: 对后面的测试过程起到…

    技术杂谈 2023年7月25日
    046
  • Docker容器网络配置

    Docker容器网络配置 1、Linux内核实现名称空间的创建 1.1 ip netns命令 可以借助 ip netns命令来完成对 Network Namespace 的各种操作…

    技术杂谈 2023年6月21日
    065
  • Microsoft Teams平台手册公开邀请试读

    这本书的全名为《Microsoft Teams平台完全手册》,可以简称为 《Teams平台手册》,我准备从几个不同的维度,给读者展现完整的Microsoft Teams平台,包括但…

    技术杂谈 2023年5月31日
    091
  • [离线计算-Spark|Hive] HDFS小文件处理

    HDFS 小文件过多会对hadoop 扩展性以及稳定性造成影响, 因为要在namenode 上存储维护大量元信息. 大量的小文件也会导致很差的查询分析性能,因为查询引擎执行查询时需…

    技术杂谈 2023年7月10日
    096
  • Prometheus监控oracle的配置

    告警https://sysdig.com/blog/monitor-oracle-database-prometheus/ Prometheus监控oracle的配置1、下载ora…

    技术杂谈 2023年5月31日
    055
  • 无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接口

    无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接口 回顾 在前面文章中,已经介绍了crudapi主要功能和使用方式,crudapi 1.2.0只…

    技术杂谈 2023年7月25日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球