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. JDK,JRE和JVM的区别和联系

    一.JDK,JRE和JVM的区别和联系 JDK JDK:Java Development Kit,是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包. JDK:普通用户只需 ...

  2. 信创环境经典版SuerMap iManager启动崩溃

    一.问题环境 操作系统:银河麒麟kylin V10 CPU:鲲鹏920 SuperMap iManager 10.2.1 硬件:16H64G机器 二.现象 磁盘和内存都有空闲,首次启动SuperMap ...

  3. SuperMap iPortal对接流数据方案

    本文结合文章<SuperMap流数据应用技术方案>,使用SuperMap iPortal实时流数据接入数据上图APP中 iPortal软件下载地址(本文使用10.0.1 win64位): ...

  4. 第27天:安全开发-PHP应用&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞 - Shortcut

    https://www.kancloud.cn/manual/thinkphp5_1/354000 ThinkPHP-Vuln-master

  5. USB协议详解第3讲(USB描述符-设备描述符)

    我们第一个学习要点就是USB描述符,所谓描述符其实就是C语言里面的结构体或者数组,数组包含的信息说明当前的设备具有哪些特征.USB描述符有设备描述符.配置描述符.接口描述符.端点描述符.字符串描述符, ...

  6. 将nii文件CT图像更改窗宽窗位之后保存成nii文件

    因为项目需要把CT图像中骨头更加明确的显示出来,且还需要保存nii文件,所以查了一些资料,在这里做一下笔记,方便以后使用.代码如下: import nibabel as nib import nump ...

  7. Teradata退出中国,您可以相信中国数据库!

    继Adobe.Tableau.Salesforce之后,2023年2月15日,数仓软件巨头Teradata宣布将逐步结束在中国的直接运营.数仓界的"黄埔军校"仓皇撤出中国市场给出的 ...

  8. 介绍this指向问题

    this是js底层定义的变量,代表了代码的指向环境 a 函数的this是window b 方法的this是调用的对象 c 构造函数和原型对象上的方法的this指向实例化对象 d 箭头函数不会自己创建t ...

  9. query和params的区别

    2者都是编程式路由跳转用来存放传递数据的位置,query使用path引入,数据显示在地址栏上,params使用name引入,传递的数据在页面看不见 :

  10. Vue中mixins(混入)的介绍和使用

    为什么引进 mixins 随着项目的开发,组件越来越多 ,这就导致了在各个组件中需要编写功能相同的代码段,重复地定义这些相同的属性和方法,导致代码地冗余,还不利于后期代码的维护 混入mixins 的创 ...