JVM 内存管理

  1. 堆 (Heap)线程共享
  2. 方法区 (Method Area)线程共享
  3. 虚拟机栈(VM Stack) 线程私有
  4. 本地方法栈 (Native Method Stack)线程私有
  5. 程序计数器 (Program Counter Register)线程私有

虚拟机栈

生命周期和线程相同。Java 方法执行的线程内存模型:每个方法被执行时,Java 虚拟机都会同步创建一个栈帧 (Stack Frame)用于存放局部变量表、操作数栈、动态连接、方法出口等信息。

  • 每个方法的从调用到执行完成,就对应着一个栈帧在虚拟机栈中入栈和出栈的过程
  • 通常说的 "栈" 是指虚拟机栈或者虚拟机栈中的局部变量表。
  • 局部变量表:存放了编译期可知的各种 Java 虚拟机 基本数据类型对象引用returnAddress 类型(指向字节码指令的地址),存放方法的参数和方法内定义的局部变量
  • 局部变量槽:这些数据类型局部变量表中的存储空间以局部变量槽(Slot)表示,其中64位长度的 long 和 double 类型的数据会占用两个变量槽,其余的数据类型只占用一个。
  • 其所需内存空间在编译器就分配完成。
  • StackOverflowError:如果线程请求的栈深度大于虚拟机栈的允许深度抛出的异常
  • OutOfMemoryError:当栈无法申请到足够的内存时抛出的异常,可以是使用 "-Xss" 参数来调整栈内存

本地方法栈

和虚拟机栈的结构一样,区别在于虚拟机栈调用的是Java方法,而本地方法栈调用的是本地(Native)方法。HotSpot虚拟机干脆将两者结合在一起了

程序计数器

当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处 理、线ss程恢复等基础功能都需要依赖这个计数器来完成。

JVM 中的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的。在任何确定的时刻,一个处理器指挥执行一条线程中的指令。为了线程切换恢复到正确的位置,每条线程都需要独立的程序计数器,各线程间相互独立,互不影响,这部分的类内存区域为 线程私有

  • 线程执行的是 JAVA 方法,计数器记录的是正在执行的虚拟机字节码指令的地址
  • 线程执行的是 本地方法,计数器的值则应该为空(Undefinded)
  • 该区域没有规定任何Out Of Memory Error 的区域

是被线程共享的一块内存空间,虚拟机所管理的最大内存,在虚拟机启动时创建。创建的对象和数组都保存在Java堆内存中,也是垃圾收集器进行垃圾回收的最重要的区域。

  • VM采用的分代收集算法,从GC的角度可以细分为:新生代(Eden区、From Survivor区和 To Survivor区)和老年区
  • 内存分配:线程共享的Java堆上可以划分多个线程私有的 分配缓存区(Thread Local Allocation Buffer, TLAB),以提升效率,这样的做的目的是使得内存更好的回收,或更快的分配内存。
  • 参数扩展:JAVA堆可以实现固定大小,也可以扩展(通过-Xmx 和 -Xms设定),如果JAVA堆中没有内存完成实例分配,并且堆也无法扩展时,JVM将会抛出 OutOfMemoryError 异常

方法区

用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据

  • 永久代有-XX: MaxPermSize 上限
  • JDK6 HotSpot 放弃永久代,采用本地内存;
  • JDK7 将原本永久代的字符串常量池、静态变量等移除;
  • JDK8 完成废弃永久代,采用本地内存来实现的元空间(Meta-space),把JDK7 中的永久代和其他(主要是类型信息)全部移到原空间。
  • OutOfMemoryError:如果方法区无法满足新的内存分配的需求时

运行时常量池

属于方法区的一部分。

  • Class 文件中除了有类的版本、字段、方法、接口的描述信息外,还有一项信息就是运行时常量表

【读书笔记】 深入理解JVM第三版 JVM 运行时数据区的更多相关文章

  1. jvm系列(一)运行时数据区

    C++程序员肩负着每一个对象生命周期开始到终结的维护责任.Java程序员则可以借助自动内存管理机制,不需要自己手动去释放内存.由虚拟机进行内存管理,不容易出现内存泄漏和内存溢出的问题,但是一旦出现这些 ...

  2. JVM 专题十二:运行时数据区(七)对象的实例化内存布局与访问定位

    1. 对象的实例化 1.1 创建对象的方式 new 最常见的方式 变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法 Class的newInstance() ...

  3. 【深入理解Java虚拟机】Java虚拟机运行时数据区

    Java虚拟机运行时数据区 线程私有 程序计数器 1.当前线程所执行的字节码的行号指示器. 2.唯一不会发生OutOfMemoryError的区域 3.如果执行的是java方法,计数器值为虚拟机字节码 ...

  4. Jvm基础(1)-Java运行时数据区

    最近在看<深入理解Java虚拟机>,里面讲到了Java运行时数据区,这是Jvm基本知识,把读书笔记记录在此.这些知识属于常识,都能查到的,如果我有理解不对的地方,还请指出. 首先把图贴上来 ...

  5. JVM详解(四)——运行时数据区-堆

    一.堆 1.介绍 Java运行程序对应一个进程,一个进程就对应一个JVM实例.一个JVM实例就有一个运行时数据区(Runtime),Runtime里面,就只有一个堆,一个方法区.这里也阐述了,方法区和 ...

  6. jvm内存模型(运行时数据区)

    运行时数据区(runtime data area) jvm定义了几个运行时数据区,这些运行时数据区存储的数据,供开发者的应用或者jvm本身使用.按线程共享与否可以分为线程间共享和线程间独立. 线程间独 ...

  7. jvm入门及理解(三)——运行时数据区(程序计数器+本地方法栈)

    一.内存与线程 内存: 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的 ...

  8. 【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在 ...

  9. 深入理解java:1.3.1 JVM内存区域的划分(运行时数据区)

    学习Java GC机制,可以帮助我们在日常工作中 排查各种内存溢出或泄露问题,解决性能瓶颈,达到更高的并发量,写出更高效的程序. 我们将从4个方面学习Java GC机制, 1,内存是如何分配的: 2, ...

  10. jvm入门及理解(五)——运行时数据区(虚拟机栈)和本地方法接口

    一.虚拟机栈背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要 ...

随机推荐

  1. 深入C++引用及其注意事项、对引用取地址时的内存模型、const数组等

    const int f[10] = { 1,2,3,4,5,6,7,8,9,10 }; int main() { // test1 const int i = 3; int& j = cons ...

  2. GZY.Quartz.MUI(基于Quartz的UI可视化操作组件) 2.7.0发布 新增各项优化与BUG修复

    前言 时隔大半年,终于抽出空来可以更新这个组件了 (边缘化了,大概要被裁员了) 2.7.0终于发布了~ 更新内容: 1.添加API类任务的超时时间,可以通过全局配置也可以单个任务设置 2.设置定时任务 ...

  3. T2 的莫反式子

    正在实现,不知道对不对,但是先放这,哪个大佬发现问题了和我说下 设 \[f(l)=\sum\cdots\sum[\gcd=1,\text{lcm}=l] \] \[g(l)=\sum\cdots\su ...

  4. C#/.NET/.NET Core技术前沿周刊 | 第 7 期(2024年9.23-9.30)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  5. 自建互联网档案馆「GitHub 热点速览」

    这两天北京的气温骤降,仿佛在提醒我们冬日的脚步已悄然而至,让人不禁感叹时间的飞逝,一年的时间"转瞬即逝". 如果你想留下互联网上的珍贵瞬间,避免它们消失在 404 错误中.这款开源 ...

  6. win10下端口映射设置内网别人访问本机安装的vmware默认NAT网络

    用管理员权限打开powershell或者cmd,命令如下 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=主 ...

  7. 全面解释人工智能LLM模型的真实工作原理(三)

    前一篇:<全面解释人工智能LLM模型的真实工作原理(二)> 序言:前面两节中,我们介绍了大语言模型的设计图和实现了一个能够生成自然语言的神经网络.这正是现代先进人工智能语言模型的雏形.不过 ...

  8. 根据字符串,获取实体属性上的annotation,如:createTime” 找到对应实体属性中的 TableField(value = "create_time", fill = FieldFill.INSERT)

    根据字符串,获取实体属性上的annotation,如:createTime" 找到对应实体属性中的 TableField(value = "create_time", f ...

  9. 如何获取Flume连接HDFS所需要的包

    在学习Hadoop工具中的Flume时,有的小伙伴会遇到这句话: "Flume要想将数据输出到HDFS,必须持有Hadoop相关jar包" 然后小伙伴就懵逼了,这些包要去什么地方来 ...

  10. CUDA编程学习 (1)——CUDA C介绍

    1. 内存分配和数据移动 API 函数 CUDA编程模型是一个异构模型,需要CPU和GPU协同工作.在CUDA中,host 和 devic e 是两个重要的概念,我们用host指代CPU及其内存,而用 ...