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. 从零开始掌握 Kubernetes:Pod 和 Deployment 的幕后故事

    1. 引言 在如今的技术世界中,随着微服务架构的广泛应用和云原生理念的兴起,应用程序的开发.部署和管理发生了翻天覆地的变化.容器技术的出现使得开发者可以轻松地将应用及其所有依赖打包在一个轻量级.可移植 ...

  2. Servlet—— urlPattern配置

    Servlet urlPattern配置   Servlet要想被访问,必须配置其访问路径(urlPattern)   1.一个Servlet可以配置多个 urlPattern        2.ur ...

  3. 参与 2023 第二季度官方 Flutter 开发者调查

    Flutter 3.10 已经正式发布,每个季度一次的 Flutter 开发者调查也来啦!邀请社区的各位成员们填写: 调研旨在了解你对 Flutter 的满意程度以及对其各个子系统的反馈.你的意见将对 ...

  4. Flutter Web 近期的重要更新

    我们的发布重点优先关注在性能.开发者体验以及 Web 集成上 2021 年 3 月 Flutter Web 支持已进入稳定版,那么,下一步是什么? 我们对用户研究发现,有超过 10% 的 Flutte ...

  5. 普元中间件Primeton AppServer6.5安装(Windows)

    本文在Windows环境下安装普元中间件Primeton AppServer6.5(以下简称PAS) 一.安装前准备 1.1使用软件版本 Primeton_AppServer_6.5_Enterpri ...

  6. C++20中对于并发方面的进步

    在当今的编程世界中,并发处理能力变得越来越重要.C++20 在并发方面带来了一些进步,使开发者能够更高效.更安全地编写多线程应用程序.这些进步主要包括: 作用域线程(Scoped Threads) 停 ...

  7. BUU XSS COURSE 1

    启动靶机 有留言板和登录功能,很明显是存储性xss,通过留言功能插入xss代码,获取cookie登录后台 先测试过滤 <script>alert(1);</script> 查看 ...

  8. 祝贺开源之夏 2023 KubeSphere 社区项目中选学生!

    日前,开源之夏 2023 所有中选结果已出炉,在此祝贺各位中选的同学! 活动简介 开源之夏是由中科院软件所"开源软件供应链点亮计划"发起并长期支持的一项暑期开源活动,旨在鼓励在校学 ...

  9. 为 KubeSphere 集群启用免费的泛域名 SSL 证书并实现证书自动更新和分发

    作者:scwang18,主要负责技术架构,在容器云方向颇有研究. 前言 KubeSphere 集群默认安装的证书是自签发证书,浏览器访问访问会发出安全提醒.本文记录了利用 let's encrytp ...

  10. URL是什么

    URL是什么 URL(Uniform Resource Locator,统一资源定位器) URL的组成: 协议://{域名|主机名|IP}:端口/路径/文件名?参数#锚点 协议 Scheme/Prot ...