一文看懂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)

大家都在看

  • 挖矿病毒 qW3xT.2 最终解决方案

    转自:https://blog.csdn.net/hgx13467479678/article/details/82347473 1,cpu 100%, 用top 查看cpu100…

    技术杂谈 2023年6月1日
    084
  • python -m参数

    把模块当做脚本运行,标准库和第三方库都可以 会把当前路径添加到sys.path中 posted on2021-06-04 20:24 Go_Forward 阅读(28 ) 评论()…

    技术杂谈 2023年7月11日
    076
  • Entity Framework Code First迁移基本面拾遗

    项目中用到了EF Code First和迁移,但发现有些方面似懂非懂。比如:如何在迁移文件中控制迁移过程?如果在迁移文件中执行SQL语句?如何使用Update-Database的其…

    技术杂谈 2023年5月31日
    0106
  • 罗强:腾讯新闻如何处理海量商业化数据?

    导读: 随着信息化时代的来临,信息呈现出爆炸式的增长。尤其是在移动互联网的推动下,每天大量信息涌入让人们应接不暇,腾讯新闻客户端的出现,就是以帮助用户寻找有用信息而出现。这时,面对…

    技术杂谈 2023年7月25日
    074
  • weekday

    模块中的方法weekday()# 可用于检索星期几,结果返回0 – 6# 之间的整数,用来代表"星期一"到"星期日"。# self.wt_w…

    技术杂谈 2023年7月11日
    063
  • Element-DatePicker的宽度

    打开一个vue文件,添加DatePicker日期选择器组件,设置默认日期为null。如图 Original: https://www.cnblogs.com/beichengshi…

    技术杂谈 2023年7月10日
    064
  • 剑指offer计划27(栈与队列困难)—java

    1.1、题目1 剑指 Offer 59 – I. 滑动窗口的最大值 1.2、解法 解题思路:(来自作者bigbeats) 相当于维护一个最大队列(队头元素最大,向队尾非…

    技术杂谈 2023年7月25日
    0104
  • 每天一个 HTTP 状态码 101

    101 Switch Protocols 指示服务器端响应了客户端切换协议的要求… 101 Switching Protocols 当客户端的请求具有 Upgrade …

    技术杂谈 2023年7月11日
    090
  • 熟悉事件循环?那谈谈为什么会分为宏任务和微任务。

    什么是事件循环 在了解事件循环前,需要一些有关 JS 特性的前置知识。 JS 引擎是单线程的,直白来说就是一个时间点下 JS 引擎只能去做一件事情,而 Java 这种多线程语言,可…

    技术杂谈 2023年5月31日
    091
  • Vue

    Vue 学习目标 前端知识体系 HTML(页面的结构)、CSS(表现层)、JavaScript(行为) HTML 就不说了。 CSS CSS层叠样式是一门标记语言,并不是编程语言,…

    技术杂谈 2023年7月11日
    065
  • Android安卓进阶技术分享之AGP工作原理

    1.基础准备 在分析源码之前,我想你应该对 Android 打包流程已经有基础的了解,至少了解了下图的打包过程: 否则你有可能不了解下文中的专业术语。 2.AGP源码的打开方式 看…

    技术杂谈 2023年7月10日
    082
  • Promise.all和Promise.race的区别

    Promise.all()可以将多个实例组装个成一个新实例,成功的时候返回一个成功的数组;失败的时候则返回最先被reject失败状态的值。 适用场景:比如当一个页面需要在很多个模块…

    技术杂谈 2023年6月1日
    086
  • Ubuntu 20.04利用SystemMonitor显示CPU、GPU温度等信息

    Ubuntu下总是使用终端命令查看CPU、GPU温度有点麻烦,利用自带的SystemMonitor来显示这些信息较为简单。 1、添加仓库进行安装 sudo add-apt-repo…

    技术杂谈 2023年7月11日
    096
  • 蓝牙搜索

    /******************************************************************** created: 2010/01/29 …

    技术杂谈 2023年5月31日
    0101
  • sarama Kafka客户端生产者与消费者梳理

    生产者 sarama 库提供了同步生产者和异步生产者。 SyncProducer 是在 AsyncProducer 基础上加以条件限制实现的。 type SyncProducer …

    技术杂谈 2023年7月11日
    093
  • 深入剖析Sgementationfault原理

    深入剖析Sgementation fault原理 前言 我们在日常的编程当中,我们很容易遇到的一个程序崩溃的错误就是 segmentation fault,在本篇文章当中将主要分析…

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