[JVM] 浅谈JMM(Java 内存模型)

简介: [JVM] 浅谈JMM(Java 内存模型)

Java 内存模型(Java Memory Model,JMM)是 Java 虚拟机规范中定义的一种抽象计算机内存模型,用于描述 Java 程序在多线程下的内存访问行为。JMM 定义了线程之间共享变量的可见性和有序性规则,为开发者提供了一种可靠的同步机制,以避免并发程序中常见的线程安全问题。


JMM 的基本概念

JMM 包含两个主要的内存区域:主内存(Main Memory)和工作内存(Working Memory)。

  • 主内存:主内存是所有线程共享的内存区域,包含了程序的全局变量和静态变量。主内存是多个线程之间的交互媒介,线程之间通过主内存进行数据的传递和共享。
  • 工作内存:工作内存是线程私有的内存区域,包含了线程栈中的局部变量和操作线程栈的操作数栈等。每个线程都有自己独立的工作内存,工作内存存储了线程在执行过程中需要用到的数据。

JMM 的规则

为了保证多线程环境下的数据安全和正确性,JMM 定义了一系列规则,用于确保线程之间的数据同步和可见性。

1. 原子性(Atomicity)

  • 原子性指的是一个操作要么全部执行成功,要么全部不执行。JMM 保证了对基本类型的读写操作的原子性。例如,对一个 int 类型的变量进行 ++ 操作,JMM 保证这个操作不会出现读取脏数据或者写入不完整数据的情况。

2. 可见性(Visibility)

  • 可见性指的是一个线程对一个变量的写操作对其他线程可见。即使在不同的线程中,一个线程对共享变量的修改也能被其他线程立即观察到。JMM 通过使用锁机制和内存屏障来实现可见性。例

如,使用 synchronized 关键字对代码块进行同步,每次进入同步块的线程都会从主内存中读取最新的值,保证了可见性。

3. 有序性(Ordering)

  • 有序性指的是在一个线程中的操作顺序与程序代码的顺序一致。然而,在多线程环境下,由于指令重排和缓存一致性等原因,程序的执行顺序可能与代码顺序不一致。JMM 通过使用内存屏障来禁止特定类型的指令重排,保证程序的有序性。

JMM 的应用

JMM 最重要的应用场景就是多线程编程。对于使用多线程的 Java 程序,开发者需要了解 JMM 的规则,以正确使用同步机制,避免出现数据竞争和线程安全问题。


常用的同步机制包括 synchronized 关键字和 Lock 接口。通过合理的使用这些同步机制,开发者可以保证多线程程序的正确性和稳定性。

在实际开发中,使用 JMM 的知识可以帮助开发者正确设计和实现高效并发的程序。同时,了解 JMM 的规则也有助于开发者调试和排查并发程序中的问题,提高程序的性能和可靠性。

总结

Java 内存模型(JMM)是 Java 虚拟机规范中定义的一种抽象计算机内存模型,用于描述 Java 程序在多线程下的内存访问行为。JMM 提供了可靠的同步机制,使得开发者可以编写高效并发的程序。了解 JMM 的规则,对于多线程编程来说是至关重要的。通过正确使用 JMM 的规则和同步机制,可以避免线程安全问题,并提高程序的性能和可靠性。


相关文章
|
1天前
|
存储 Java 对象存储
jvm内存模型剖析
当线程cpu时间片执行完后,线程进入休眠状态,当再次唤醒时,通过程序计数器确定指令执行到哪一行,然后继续往下执行。
12 1
|
2天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
10 2
|
1天前
|
存储 缓存 算法
JVM对象创建与内存分配机制
该类对应的java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
5 0
|
1天前
|
存储 监控 算法
Java中的内存管理:从堆到栈的深入解析
Java中的内存管理:从堆到栈的深入解析
|
1天前
|
缓存 监控 Java
Java中的内存泄漏及其排查方法
Java中的内存泄漏及其排查方法
|
1天前
|
存储 Java 机器人
Java中的字节码与JVM指令集详解
Java中的字节码与JVM指令集详解
|
1天前
|
存储 缓存 算法
如何在Java中进行内存管理?
如何在Java中进行内存管理?
|
1天前
|
存储 安全 Java
JVM之内存结构
Java内存结构包括程序计数器、虚拟机栈、本地方法栈、堆和直接内存。程序计数器记录执行地址,线程私有,无溢出。虚拟机栈处理方法调用,局部变量在线程栈中,过深或过大可能导致StackOverflowError。本地方法栈服务于native方法。堆存储对象,线程共享,有垃圾回收。方法区存储类信息,1.8前的永久代,1.8后的元空间,溢出可调整相应参数。运行时常量池包含字符串池,1.6在永久代,1.8在堆,intern方法管理。直接内存用于NIO,提高读写性能,手动回收。
|
1天前
|
Java
使用JProfile查看java导出内存快照
使用JProfile查看java导出内存快照
5 0
|
1月前
|
缓存 监控 Java
深入理解Java虚拟机(JVM)性能调优
【4月更文挑战第18天】本文探讨了Java虚拟机(JVM)的性能调优,包括使用`jstat`、`jmap`等工具监控CPU、内存和GC活动,选择适合的垃圾回收器(如Serial、Parallel、CMS、G1),调整堆大小和新生代/老年代比例,以及代码优化和JIT编译策略。通过这些方法,开发者能有效提升应用性能并应对复杂性挑战。性能调优是持续过程,需伴随应用演进和环境变化进行监控与优化。