运行时数据区中包含哪些区域?哪些线程共享?哪些线程独享?【⭐⭐⭐⭐⭐】

Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。

JDK 1.8 和之前的版本略有不同,下面会介绍到。

区别就是 1.8有一个元数据区替代方法区了。

那么,Java 8 中 PermGen 为什么被移出 HotSpot JVM 了?我总结了两个主要原因(详见:JEP 122: Remove the Permanent Generation):

  1. 由于 PermGen 内存经常会溢出,引发恼人的 java.lang.OutOfMemoryError: PermGen,因此 JVM 的开发者希望这一块内存可以更灵活地被管理,不要再经常出现这样的 OOM
  2. 移除 PermGen 可以促进 HotSpot JVM 与 JRockit VM 的融合,因为 JRockit 没有永久代。

根据上面的各种原因,PermGen 最终被移除,方法区移至 Metaspace,字符串常量移至 Java Heap

程序计数器

程序计数器(Program Counter Register)是一块较小的内存空间,由于JVM可以并发执行线程,因此会存在线程之间的切换,而这个时候就程序计数器会记录下当前程序执行到的位置,以便在其他线程执行完毕后,恢复现场继续执行。

JVM会为每个线程分配一个程序计数器,与线程的生命周期相同。

如果线程正在执行的是应该Java方法,这个计数器记录的是正在执行虚拟机字节码指令的地址。

如果正在执行的是Native方法,计数器的值则为空(undefined)

注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。

本地方法栈

Java虚拟机栈是调用Java方法;本地方法栈是调用本地native方法,可以认为是通过 JNI (Java Native Interface) 直接调用本地 C/C++ 库,不受JVM控制。

方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现 StackOverFlowErrorOutOfMemoryError 两种错误。

虚拟机栈

虚拟机栈 描述的是 Java 方法执行的内存模型:

每个方法在执行的同时都会创建一个栈帧(Stack Frame,是方法运行时的基础数据结构)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

虚拟机栈是每个线程独有的,随着线程的创建而存在,线程结束而死亡。

在虚拟机栈内存不够的时候会OutOfMemoryError,在线程运行中需要更大的虚拟机栈时会出现StackOverFlowError

Java 堆

Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

堆是垃圾收集器管理的主要区域,又称为“GC堆”,可以说是Java虚拟机管理的内存中最大的一块。

现在的虚拟机(包括HotSpot VM)都是采用分代回收算法。在分代回收的思想中, 把堆分为:新生代+老年代+永久代(1.8没有了); 新生代 又分为 Eden + From Survivor + To Survivor区。

方法区

方法区(Method Area)与 Java 堆一样,是所有线程共享的内存区域。

方法区用于存储已经被虚拟机加载的类信息(即加载类时需要加载的信息,包括版本、field、方法、接口等信息)、final常量、静态变量、编译器即时编译的代码等。

方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。

方法区比较重要的一部分是运行时常量池(Runtime Constant Pool),为什么叫运行时常量池呢?是因为运行期间可能会把新的常量放入池中,比如说常见的String的intern()方法。

元空间

1.8就把方法区改用元空间了。类的元信息被存储在元空间中。元空间没有使用堆内存,而是与堆不相连的本地内存区域。所以,理论上系统可以使用的内存有多大,元空间就有多大,所以不会出现永久代存在时的内存溢出问题。

可以通过 -XX:MetaspaceSize-XX:MaxMetaspaceSize 来指定元空间的大小。

运行时数据区中包含哪些区域?哪些线程共享?哪些线程独享?相关推荐

  1. JVM Runtime Data Area(运行时数据区中的堆/栈/方法区讲解)

    JVM的组成 JVM由4大部分组成:ClassLoader .Runtime Data Area .Execution Engine .Native Interface.我们这里重点讲得是Runtim ...

  2. 20张图助你了解JVM运行时数据区,你还觉得枯燥吗?

    我们的JVM系列已经断更好几天了,小伙伴们在后台疯狂私信阿Q,想看后续内容,今天它来了.相信大家在上篇文章中已经对类加载子系统有了清晰的认识,接下来就让我们来揭开"运行时数据区"的 ...

  3. JVM 运行时数据区详解,写得非常好!

    作者:小小木的博客 www.cnblogs.com/wyc1994666/p/11795781.html 在接下来的几天想总结下,JVM相关的一些内容,比如下面的这三个内容算是比较核心知识点了 1.运 ...

  4. 从头开始学习->JVM(八):运行时数据区(下)

    前言 在上一篇文章中,我们了解到了JVM的运行时数据区,基本被划分了5个区域. 程序计数器(pc寄存器) java虚拟机栈 本地方法栈 java堆 方法区(永久代,元空间). 而上一篇文章中,我们详细 ...

  5. Java8 JVM运行时数据区概述 (极其详细长文)

    文章目录 运行时数据区概述 JVM中的线程说明 PC寄存器(PC Register) PC寄存器介绍 使用举例 问题:使用PC寄存器存储字节码指令地址有什么用?为什么使用PC寄存器存储? 问题:为什么 ...

  6. Java程序员必知必会之JVM运行时数据区

    JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...

  7. JVM00_面试官对类加载器子系统、运行时数据区、内存分布、执行引擎的灵虚拷问,你能坚持到第几问?

    因为热爱所以坚持,因为热爱所以等待.熬过漫长无戏可演的日子,终于换来了人生的春天.他逐渐被人熟知,被人喜爱 三年前,在苏州园区某个国企面试,第一道题目便是:JVM是什么吗?然后就是拿着笔试题目被面试官 ...

  8. JVM系列之运行时数据区

    1.运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 ...

  9. JVM(类加载、运行时数据区、堆内存、方法区、本地接口、执行引擎和垃圾回收)java虚拟机(JVM)的超详细知识点

    JVM虚拟机 一.JVM的概述 1.为什么要学习JVM 2.虚拟机 3.JVM的作用 作用 特点 4.JVM的位置 5.JVM的分类 6.各个组成部分的用途 7.Java 代码的执行流程 8.JVM ...

最新文章

  1. .NET Framework开源详细配置
  2. android listview下拉动画效果,Android开发中利用ListView实现一个渐变式的下拉刷新动画...
  3. Hadoop框架:DataNode工作机制详解
  4. CSS练习_云层效果
  5. Python Flask Web 第四课 —— 模板引擎Jinja2
  6. 使用C#的泛型队列Queue实现生产消费模式
  7. NYOJ----1591----模拟+map
  8. 使用 Fiddler 分析网页加载过程
  9. 金山词霸2005开启后导致桌面刷新的问题
  10. BC26连接阿里云,MQTT协议,AT流程和STM32代码实现
  11. BMVC reading list
  12. tbody css 高度,html – CSS:无法为%滚动设置tbody height
  13. 计算机一级考试ppt知识点,计算机一级考试考点:PPT演示文稿
  14. java Runtime.exec方法详解
  15. 魔方(12)镜面魔方、苹果魔方、粽子魔方、三面体魔方
  16. 简记 2022/9/2
  17. C#关键字扫盲——Sealed 密封
  18. uefl计算机mbr分区方案,免重装系统 手把手教你MBR转GPT分区表-电脑教程
  19. python 测试接口_python接口测试
  20. 国际出版商Lulu 和Aspose 的渊源

热门文章

  1. 首届博华深圳联展将于12月14日-16日在深圳国际会展中心举办
  2. js动态渲染的页面发现鼠标悬浮hover事件失效
  3. 诸葛亮86字的家训 影响一生!
  4. 前端代码实现的一个消除类型的图片滑滑乐小游戏分享
  5. 2021全球与中国自动导引车市场现状及未来发展趋势
  6. CIO40知识星球—IT人之兄弟连
  7. LS1028GPIO初始化为高电平添加按键
  8. MySQL 统计上一周从周一到周日的用户
  9. 突发!中国顶级程序员左耳朵耗子(陈皓)去世
  10. LIGO找到首个超越广义相对论的证据?