Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

    • Java基础

    • Java集合

    • Java并发

    • JVM

      • JVM内存模型
      • JVM垃圾回收中的道法术器
      • Minor GC,Major GC,Young GC,Old GC,Major GC有什么区别
      • Minor GC时老年代在干什么
      • ​​Major GC时年轻代在干什么
      • Full GC​时年轻代和老年代在干什么
      • 常用垃圾回收器对比
      • OOM、内存泄漏与内存溢出的区别解析
      • 类的加载机制
  • Spring

  • SpringCloud

  • MySQL

  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • Java
  • JVM
plantre
2025-05-04

JVM内存模型

JVM内存模型(Java Virtual Machine Memory Model)是Java程序运行时的核心机制,涵盖内存区域划分、多线程交互规则及内存管理策略。以下从内存区域结构和并发内存模型(JMM)两个维度解析:


一、JVM内存区域划分 JVM将内存划分为多个区域,按线程共享性分为线程私有区域和线程共享区域,具体结构如下:

  1. 线程私有区域 • 程序计数器(PC Register)

记录当前线程执行的字节码指令地址,线程切换时恢复执行位置。唯一不会发生内存溢出的区域。

• 虚拟机栈(JVM Stack)

存储方法调用的栈帧,包含局部变量表、操作数栈等信息。每个方法对应一个栈帧,栈深度过大会抛出StackOverflowError。

• 本地方法栈(Native Method Stack)

服务于JNI调用的本地方法(如C/C++代码),结构与虚拟机栈类似。

  1. 线程共享区域 • 堆(Heap)

• 新生代:包括Eden区和两个Survivor区,存放新创建的对象,采用复制算法回收。

• 老年代:存放长期存活对象,使用标记-清除或标记-整理算法。

• 调优参数:通过-Xms(初始堆大小)和-Xmx(最大堆大小)控制容量。

• 方法区(Method Area)

JDK 8后由元空间(Metaspace)替代永久代,存储类元信息、常量池、静态变量等,使用本地内存动态扩展。

• 直接内存(Direct Memory)

通过ByteBuffer.allocateDirect()分配,绕过堆直接操作物理内存,提升I/O性能。


二、Java内存模型(JMM)的核心特性 JMM是并发编程的底层规范,解决多线程下的可见性、原子性和有序性问题:

  1. 三大核心问题 • 可见性(Visibility)

一个线程修改共享变量后,其他线程能立即感知。通过volatile、synchronized或final实现。

• 原子性(Atomicity)

操作不可分割,如i++需通过synchronized或CAS(如AtomicInteger)保证原子性。

• 有序性(Ordering)

禁止指令重排序,volatile通过内存屏障(Memory Barrier)限制编译器和处理器优化。

  1. 关键技术机制 • 锁与同步

synchronized通过对象头的Mark Word实现锁升级(偏向锁→轻量级锁→重量级锁),保障同步块的原子性和可见性。

• volatile关键字

底层依赖CPU的LOCK指令,强制刷新主存数据并使其他线程缓存失效。

• CAS与原子类

通过cmpxchg指令(带LOCK前缀)实现无锁并发,解决ABA问题需结合AtomicStampedReference。

• 内存屏障

禁止特定指令重排序,如LoadLoad屏障确保读操作顺序性。


三、内存管理策略与优化

  1. 分代回收策略 • 新生代:采用复制算法,快速回收短期对象。

• 老年代:使用标记-整理算法,减少内存碎片。

  1. 内存分配优化 • TLAB(线程本地分配缓冲区)

在Eden区为每个线程分配独立内存块,避免全局锁竞争,提升分配效率。

  1. 伪共享与缓存行
    变量若共享同一缓存行(64字节),频繁失效会导致性能下降。可通过@sun.misc.Contended注解填充字节解决。

总结 JVM内存模型通过区域划分实现高效内存管理,通过JMM规范解决多线程并发问题。理解其结构(如堆、栈、方法区)和机制(如锁、volatile、CAS)是优化Java程序性能的关键。实际开发中需结合监控工具(如JVisualVM)分析内存使用,并通过参数调优(如堆大小、GC算法)提升稳定性。

编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05
异步编程工具CompletableFuture
JVM垃圾回收中的道法术器

← 异步编程工具CompletableFuture JVM垃圾回收中的道法术器→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式