当前位置: 首页 > news >正文

3. JVM 运行时数据区

本文内容基于个人对特定技术的理解和实践,或为对相关技术内容的整理与分享。请读者批判性阅读,如有疏漏或不准确之处,恳请斧正。

接续 2.JVM的类加载机制

类被加载到内存后,会保存在方法区或元空间中,根据JVM的划分,这部分内存归属于为线程共享的内存空间。
以下JVM内存空间是按照JVM Spec 中线程访问的规则进行划分(直接内存不属于JVM Spec):
image

线程共享的内存区域

  1. 堆内存
    创建的对象和数组一般分配在堆内存中,所以在多线程下访问对象的时候需要确保线程安全。堆内存设置为动态的,其空间是由GC进行处理的,为对象分配内存时,如果堆内存占用满了,并且GC还无法收回需要的空间,就会触发OOM
  2. 方法区/元空间
    其中存储着每个类的结构,例如运行时常量池、字段和方法数据以及方法和构造函数代码。JIT compiled code 也是该区域的一个重要内容。这个区域可以选择是否为动态大小以及是否可以被垃圾回收(针对常量池的回收和对类型的卸载)。在逻辑上方法区与堆的性质是一样的,如果内存空间不足以分配,也会触发OOM
  3. 堆外内存
    包含直接内存以及JVM使用的内存(例如 元空间),可以避免JVM管理、回收对象所造成的资源、性能的浪费。避免了数据在Java堆和操作系统本地缓冲区之间的来回复制,提高了I/O效率(即零拷贝)。如果堆外内存不足以支持JVM的分配,也会触发OOM

线程私有的内存区域

  1. 程序计数器
    每个线程持有一份私有的,在JVM 中保存着当前线程正在执行的字节码的地址(执行本地方法时为空),宽度足够支撑当前平台所有的指令,
  2. 虚拟机栈
    每个线程持有一份虚拟机栈,由多个栈帧构成。执行方法时,会为该方法创建一个栈帧并压入栈中。栈帧是方法运行所需数据的结构化表示。

image

栈帧的结构和大小在编译时确定,其中动态链接就是触发类加载的一个条件,当动态链接转换为具体方法时,没有找到对应的类,就会触发加载。

http://www.hskmm.com/?act=detail&tid=33203

相关文章:

  • 软工学习日志
  • Pixelium Design:Vue3 的像素风 UI 组件库
  • 修电脑不求人:AI智能修复电脑工具的体验分享
  • 效率与安全双升:AI许可证识别重塑医药行业合规流程
  • Spring BeanPostProcessor 前置处理 afterPropertiesSet BeanPostProcessor 后置处理区别
  • Xcode上编译调试ffmpeg - 详解
  • 最新版Origin 2025b安装包下载及详细安装教程,附永久免费中文汉化破解版Origin安装包
  • 第十七篇
  • 《程序员修炼之道》阅读笔记1
  • Unity3D中定义全局宏(不同于在unity设置中的)
  • AtCoder arc208 总结
  • OOP - 实验一
  • 题解:qoj8329 Excuse
  • `uv run pytest` does not work
  • VMware17.6图文安装教程(附安装包)VMware17.6
  • Sourcetree - Git 备份
  • uni-app x实现上下拉动,动态加载数据
  • HyperWorks许可状态监控工具
  • mysql删除数据表某个日期之前的数据
  • KMP算法
  • 企业微信ipad协议稳定防封的最新最全功能
  • 企业微信协议ipad,稳定防封私有化部署私域流量聚合聊天,机器人实现方案
  • 重新思考钓鱼攻击意识培训:网络安全的关键反思
  • 任务分解与小模型如何降低AI成本
  • spring事件监听的核心机制
  • 直播软件开发搭建公司
  • freeswitch的proxy_media模式下video流的问题与修正
  • DNS 相关
  • 2025 年无锡专线物流公司最新推荐排行榜:聚焦个性化运输解决方案,精选优质服务商往返无锡/冷链无锡/公路无锡/大件无锡专线物流公司推荐
  • Dubbo入门-通过spring-boot来动手实践