JVM--java内存模型

本文深入探讨Java内存模型,包括线程的工作内存与主存的关系、内存特性如可见性和有序性等,以及指令重排的基本原则。

   大家可能看到这篇的内容,java的内存模型认为与JVM没有关系,其实不是,所有的程序运行都是在内存中运行的,我们这里所得java内存模型其实就是方法运行过程中在JVM内存空间内是怎么分配的。

    1.首先需要强调的一点就是每个线程都有一个工作内存,这个工作内存和主存是相互独立的。此外工作内存中存放着主存变量的值的拷贝。运行情况如下:

 

    2.内存有他自己的特性:

      (1)可见性:一个新城修改了变量,其他线程可以立即知道。

      (2)有序性:一个线程中,所有的指令和操作都是有序的。线程之外操作是无序的,可能存在指令重排。但是指令重排破坏了线程间的有序性。

    3.指令重排的基本原则:

       (1)程序顺序原则:一个线程内必须保证语义的串行性

       (2)volatile:volatile变量的写必须先发生于读

       (3)锁规则:unlock必须发生在lock之前

       (4)传递性,如果A先于B,B先于C,那么A的运行一定在C前面

       (5)线程的start方法先于它的任何一个动作

       (6)线程的所有操作都先于Thread.join()

       (7)线程的中断(interrupt())先于被中断线程的代码

       (8)对象的构造区函数执行结束先于finalize方法

    4. addcode字节码运行的两种方式

      (1)解释执行:解释一句执行一句

      (2)编译执行:强制字节码编译成机器码,直接执行机器码,运行时编译,并且编译后性能有数量级的提升。


### JVM内存模型Java内存模型的区别与联系 #### 区别 1. **定义范围** - JVM内存模型描述的是Java虚拟机运行时的数据区域划分及其作用,主要关注于JVM内部的内存结构[^2]。它涵盖了程序计数器、虚拟机栈、本地方法栈、堆、方法区等多个部分。 - Java内存模型(JMM)则专注于多线程环境下的内存可见性和操作顺序问题,主要用于解决并发编程中的同步和一致性问题[^3]。 2. **目标用途** - JVM内存模型的目标是提供一种机制来支持Java应用程序的执行,确保程序能够在不同的硬件平台上一致地运行[^4]。 - JMM的主要目的是为开发者提供一套规则,用于控制变量在多个线程之间的访问行为以及优化编译器和处理器的行为[^5]。 3. **具体组成部分** -JVM内存模型中,存在诸如堆、栈、方法区等具体的物理内存区域[^1]。 ```java public class Example { int a; // 存储在堆中 static String b = "test"; // 存储在方法区或元空间中 void method(int c) { // 局部变量c存储在栈中 System.out.println(c); } } ``` - 而JMM更注重逻辑上的主内存和工作内存的概念,其中主内存代表所有线程共享的部分,而每个线程都有自己独立的工作内存[^3]。 4. **实现细节** - JVM内存模型的具体实现依赖于底层操作系统及硬件架构的支持,例如堆大小调整策略可能因平台不同有所差异[^5]。 - 对于JMM来说,其规定了一系列happens-before原则以保障跨线程间通信的安全性,而不涉及实际物理地址布局等问题。 #### 联系 1. **共同服务于Java应用开发** - 尽管两者侧重点各异,但都旨在提升Java语言的功能特性并简化程序员编写高效可靠软件的过程[^2]。 2. **交互关系密切** - 当讨论到某些特定场景下(比如volatile关键字或者synchronized锁),会发现它们既涉及到JMM关于原子性的定义同时也关联到了JVM对于相应指令序列化处理方式等内容[^3]。 3. **抽象层次互补** - 可以认为JVM内存模型处于较低级别的层面,提供了基础支撑;而JMM是在此基础上构建起来的一个更高维度视角,用来指导复杂业务逻辑设计时考虑潜在风险因素。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值