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

java虚拟机——JVM中,内存的哪些区域被划分为线程私有、哪些区域是线程共享的

 

线程私有的内存区域:

  1. 程序计数器(Program Counter Register)
    • 也叫PC寄存器,是一块较小的内存空间,用于存储当前线程所执行的字节码的行号指示器。
    • 由于Java多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,因此每个线程都需要一个独立的程序计数器来记录当前线程执行的字节码位置。
    • 如果线程正在执行一个Java方法,那么计数器记录的是正在执行的字节码指令的地址;如果线程正在执行一个Native方法(如由C或C++编写的JNI方法),那么计数器的值将为Undefined。
  2. Java栈(Java Stack)
    • 每个线程在创建时都会为其分配一个私有的Java栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
    • Java栈中的每个栈帧都对应着一个方法的调用,每当线程执行一个方法时,就会创建一个新的栈帧,并将其压入Java栈中。当方法执行完毕后,栈帧会被弹出Java栈。
    • Java栈的大小可以通过-Xss参数来设置,每个线程的Java栈都是独立的,互不影响。
  3. 本地方法栈(Native Method Stack)
    • 与Java栈类似,本地方法栈也是为每个线程分配的,但它用于存储调用Native方法时的数据。
    • 如果一个Java线程调用了Native方法(如JNI调用),那么该线程会在本地方法栈中为Native方法的执行分配空间。
    • 本地方法栈的大小和具体实现可能因JVM的不同而有所差异,且通常不受-Xss参数的影响。

线程共享的内存区域:

  1. 堆(Heap)
    • 堆是JVM中用于存储对象实例的内存区域,它是线程共享的。
    • 所有线程都可以访问堆中的对象,并且堆中的对象可以被多个线程共享。
    • 堆内存的管理由JVM的垃圾回收器负责,垃圾回收器会定期回收不再使用的对象并释放其占用的内存空间。
  2. 方法区(Method Area)
    • 方法区也是线程共享的,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
    • 方法区中的数据在JVM启动时创建,并且在JVM运行期间可以被多个线程共享和访问。
    • 在JDK 8及之前的版本中,方法区被称为永久代(PermGen);从JDK 8开始,方法区被重命名为元空间(Metaspace),并且其实现方式也从JVM的内存区域改为了使用本地内存(即操作系统的内存)。

http://www.kler.cn/a/411743.html

相关文章:

  • 数据库编程(sqlite3)
  • 快速理解微服务中Gateway的概念
  • transformer.js(三):底层架构及性能优化指南
  • 刷题日常(数据流中的中位数,逆波兰表达式求值,最长连续序列,字母异位词分组)
  • ️ 爬虫开发中常见的性能优化策略有哪些?
  • Spring Boot集成MyBatis-Plus:自定义拦截器实现动态表名切换
  • 从0开始深度学习(32)——循环神经网络的从零开始实现
  • 常用的数据结构
  • llama-factory 系列教程 (七),Qwen2.5-7B-Instruct 模型微调与vllm部署详细流程实战
  • Springboot 整合 Java DL4J 构建自然语言处理之机器翻译系统
  • 实现一个可配置的TCP设备模拟器,支持交互和解析配置
  • Linux下环境基础开放工具
  • 林业产品推荐系统:Spring Boot解决方案
  • flink学习(7)——window
  • 基于SpringBoot+Vue的智慧社区网站-无偿分享 (附源码+LW+调试)
  • 企业后端多租户管理平台
  • Redis底层数据结构
  • c++音视频学习环境搭建
  • 如何还原 HTTP 请求日志中的 URL 编码参数?详解 %40 到 @
  • 全渠道供应链变革下“小程序 AI 智能名片 S2B2C 商城系统”的赋能与突破
  • Jmeter中的测试片段和非测试原件
  • 网络安全加解密原理
  • Springboot项目搭建(5)-前端注册界面
  • 十九:HTTP包体的传输方式(2):不定长包体
  • Vue 中父子组件间的参数传递与方法调用
  • sed awk 第二版学习(十一)—— 交互式拼写检查器 spellcheck.awk