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. BOOST 定时器 stop探究

    Asio是一个建立在Boost所提供的相关组件之上的异步的网络库,可以运行在Win/Linux/Unix等各种平台之上. 不过随着C++11的发布,其对Boost的依赖也越来越少,作者又做了一个不依赖 ...

  2. Codeforces Round 955 (Div. 2)

    A 非常好特判 一共就五种情况,相等,或者正反两种包含(都是不能可能不包含),或者正反两种先后(都是可能不相等),写五个 if 就行了 B 我到底为什么要跳了这题??????????????????? ...

  3. SXYZ-6.27专题比赛

    好的,现在正式定义今天的比赛为一场伤心的比赛. ↑这张图片首先能说明一些问题,但这并不是关键. ↓这才是伤心的关键 ↑第一题文件输入输入爆 ↑第二题文件名直接爆 评语,一个比一个离谱! 然后只是很简单 ...

  4. C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

    错误原因 VS平台认为scanf函数不安全,要求换成scanf_s函数 解决方案 方案一:将scanf换成scanf_s[不建议] 将scanf换成scanf_s 但是,scanf_s函数只能在vs上 ...

  5. [rCore学习笔记 029] 动态内存分配器实现-以buddy_system_allocator源码为例

    在上一部分,我们讲了动态内存分配器的原理是维护一个堆,而且是实现各种连续内存分配方法. 但是上一部分是直接通过引用了buddy_system_allocator来解决的问题. 那么对于内存分配算法有兴 ...

  6. 复用对评论和对文章回复的弹层 popup- vant2

    基本样式: ps:当message 即输入的内容的长度为 0 的时候,按钮禁止使用 : <template> <div class="comment-post"& ...

  7. Promise.all、race和any方法都是什么意思?

    // // 执行多个并行任务 const promiseAll = [ thenFs.readFile('./files/1.txt','utf8'), thenFs.readFile('./file ...

  8. Android复习(三)清单文件中的元素——>action、activity-alias、category、compatible-screens、data

    <action> 语法: <action android:name="string" />   包含于: <intent-filter> 说明: ...

  9. [Dest0g3 520迎新赛]funny_upload

    打开靶机抓包发现过滤代码 发现.htaccess能上传后传入图片马 发现内容对<?进行过滤 我们换一种方式写后门代码 <script language="php"> ...

  10. P1762 偶数&杨辉三角

    P1762 偶数&杨辉三角(天立OI) 解题思路 一.结论法 杨辉三角形结论 第\(n\)行有\(n\)个数. 每行奇数个数必为\(2^k\)(\(k\)不是行数) 当行数恰为\(2^k\)时 ...