转载自 JVM运行时区域详解

我们知道的JVM内存区域有:堆和栈,这是一种泛的分法,也是按运行时区域的一种分法,堆是所有线程共享的一块区域,而栈是线程隔离的,每个线程互不共享。

线程不共享区域

每个线程的数据区域包括程序计数器、虚拟机栈和本地方法栈,它们都是在新线程创建时才创建的。

程序计数器(Program Counter Rerister)

程序计数器区域一块内存较小的区域,它用于存储线程的每个执行指令,每个线程都有自己的程序计数器,此区域不会有内存溢出的情况。

虚拟机栈(VM Stack)

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

本地方法栈(Native Method Stack)

本地方法栈用于支持本地方法(native标识的方法,即非Java语言实现的方法)。

虚拟机栈和本地方法栈,当线程请求分配的栈容量超过JVM允许的最大容量时抛出StackOverflowError异常。

线程不共享区域如下图绿色背景所示。

线程共享区域

线程共享区域包含:堆和方法区。

堆(Heap)

堆是最常处理的区域,它存储在JVM启动时创建的数组和对象,JVM垃圾收集也主要是在堆上面工作。

如果实际所需的堆超过了自动内存管理系统能提供的最大容量时抛出OutOfMemoryError异常。

方法区(Method Area)

方法区是可供各条线程共享的运行时内存区域。存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法。

当创建类和接口时,如果构造运行时常量池所需的内存空间超过了方法区所能提供的最大内存空间后就会抛出OutOfMemoryError

运行时常量池(Runtime Constant Pool)

运行时常量池是方法区的一部分,每一个运行时常量池都分配在JVM的方法区中,在类和接口被加载到JVM后,对应的运行时常量池就被创建。运行时常量池是每一个类或接口的常量池(Constant_Pool)的运行时表现形式,它包括了若干种常量:编译器可知的数值字面量到必须运行期解析后才能获得的方法或字段的引用。

如果方法区的内存空间不能满足内存分配请求,那Java虚拟机将抛出一个OutOfMemoryError异常。

栈包含Frames,当调用方法时,Frame被推送到堆栈。一个Frame包含局部变量数组、操作数栈、常量池引用。

JVM运行时区域详解相关推荐

  1. 深入理解jvm运行时区域

    前言 最近一直在看周志明老师的<深入理解虚拟机>,总是看了忘,忘了又看,陷入这样无休止的循环当中.抱着纸上得来终觉浅的想法,准备陆续的写几篇学习笔记,梳理知识的脉络并强化一下对知识的掌握. ...

  2. Java当中jvm运行时区域新生代、老年代、永久代和Garbage Collection垃圾回收机制【杭州多测师】【杭州多测师_王sir】...

    1.本地方法栈和程序计数器 ==>偏底层一般不会接触到 2.方法区 ==>对应为永久代 3.虚拟机栈(stack) ==>对应为栈 4.堆(heap) ==>对应里面有新生代+ ...

  3. ASP.NET HTTP运行时组成详解(转贴)

    作者:unknown 更新时间: 2005-03-17     简介 不管使用哪种底层平台,可靠性和性能都是对所有 Web 应用程序的主要要求,尽管从某种意义上讲,这两个要求是相互矛盾的.例如,要构建 ...

  4. Taro3.2 适配 React Native 之运行时架构详解

    导读 由 58 前端团队主导的 Taro 3 适配 React Native 工作已完成有一段时间了.目前发布了多个体验版,也将在3月底迎来正式版.基于 Taro 的良好架构演变,适配 React N ...

  5. JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】

    思维导图 概述 运行时数据区域 程序计数器 (Program Counter Register) 概念 特征 可能抛出的异常 知识扩展:JIT即时编译 Java虚拟机栈 (Java Virtual M ...

  6. JVM——内存区域:运行时数据区域详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理 ...

  7. jvm中方法区和常量池详解_JVM——内存区域:运行时数据区域详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理和垃 ...

  8. Java JVM内存模型(运行时数据区域)详解

    详细介绍了JVM运行时数据区域,包括方法区.堆空间.栈空间.本地方法栈.程序计数器.常量池.直接内存.字面量.符号引用.直接引用. Java程序在运行时,需要在内存中的分配空间.为了提高运算效率,ja ...

  9. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...

最新文章

  1. 漫步数学分析二——欧几里得空间
  2. Oracle 12C R2-新特性-PDB的磁盘I/O(IOPS,MBPS)资源管理
  3. 补码中的+0和-0为什么机器码相同?
  4. 56. Attribute value 属性
  5. windows7/windows server 2008 r2升级至sp1
  6. html中省略号怎么打,Web中的省略号
  7. PS CS6 打不开RAW格式文件
  8. 鸿蒙os多设备如何实现,鸿蒙OS中如何实现跨设备迁移?
  9. android如何暂停倒计时,Android计时器和倒计时的实现(含开始,暂停,和复位)...
  10. Linux CPU频率控制
  11. 【原创】java+swing+mysql教室管理系统设计与实现
  12. 最新项目管理软考中级易错内容整理-终结篇
  13. 前田约翰《简单法则》十条
  14. 2021年中国电子商务行业投融资现状及未来发展趋势分析[图]
  15. 浅谈SAP公有云:S4 HANA Cloud
  16. 03_心理咨询_微信小程序项目实战_首页静态效果实现
  17. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题
  18. 12对胸椎对应体表标志_人体体表标志【图文】
  19. 智慧园区数据可视化解决方案
  20. Android方向传感器实践——自己动手做指南针

热门文章

  1. [C++11]通过using定义基础类型和函数指针别名
  2. [剑指offer]面试题17:合并两个排序的链表
  3. 洛谷 P1122 最大子树和-求树的最大子树权值和
  4. 数据结构与算法--数组中出一次的数字
  5. ValueError: check_hostname requires server_hostnamejie解决方案
  6. POJ1742 Coins(DP)
  7. P3391 【模板】文艺平衡树 fhq-treap 模板
  8. 反向图——dj算法(判断从起点 开始有没有第二条路径能到达)Gym 102501K
  9. Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)
  10. DP专练2 (大理石 + [ZJOI 2010]数字计数)