`

【知识积累】java内存模型

 
阅读更多

(1)什么是内存模型

    究竟什么是内存模型?内存模型描述了程序中各个变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节,对象最终是存储在内存里面的,这点没有错,但是编译器、运行库、处理器 或者系统缓存 可以有特权在变量指定内存位置存储或者取出变量的值。【JMM 】(Java Memory Model的缩写) 允许编译器和缓存以数据在处理器特定的缓存(或寄存器)和主存之间移动的次序拥有重要的特权,除非程序员使用了finalsynchronized 明确请求了某些可见性的保证。

(2)内存模型的特征

     a, Visibility 可见性 (多核,多线程间数据的共享)
     b, Ordering 有序性 (对内存进行的操作应该是有序的)

     c, Atomicity 原子性

(3)java 内存模型 ( java memory model 简称JMM)

      java内存模型

    JMM主要是为了规定了线程和内存之间的一些关系,如图所示存在一个主内存(Main Memory),Java中所有的变量存储在主内存中,对于所有的线程是共享的。每个线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中变量的拷贝,工作内存由缓存和堆栈组成,其中缓存保存的是主存中的变量的copy,堆栈保存的是线程局部变量。线程对所有变量的操作都是在工作内存中进行的,线程之间无法直接互相访问工作内存,变量的值的变化的传递需要主存来完成。在JMM中通过并发线程修改的变量值,必须通过线程变量同步到主存后,其他线程才能访问到。 
    Java语言规范(JLS)中对线程和主存互操作定义了6个行为,分别为read,load,use,assign,store 和 write,这些操作行为具有原子性,且相互依赖,有明确的调用先后顺序。大体上来讲,线程对某个变量的操作可以简化成下面的步骤:
1.从主内存中复制数据到工作内存  (read and load)
2.执行代码,对数据进行各种操作和计算 (use and assign)
3.把操作后的变量值重新写回主内存中 (store and write)
    当然这样的运行顺序也是我们所期望的!但是, JVM并不保证第1步和第3步会严格按照上述次序立即执行。因为根据java语言规范的规定,线程的工作内存和主存间的数据交换是松耦合的,什么时候需要刷新工作内存或者什么时候更新主存的内容,可以由具体的虚拟机实现自行决定。由于JVM可以对特征代码进行调优,也就改变了某些运行步骤的次序的颠倒,那么每次线程调用变量时是直接取自己的工作存储器中的值还是先从主存储器copy再取是没有保证的,任何一种情况都可能发生。同样的,线程改变变量的值之后,是否马上写回到主存储器上也是不可保证的,也许马上写,也许过一段时间再写。那么,在多线程的应用场景下就会出现问题了,多个线程同时访问同一个代码块,很有可能某个线程已经改变了某变量的值,当然现在的改变仅仅是局限于工作内存中的改变,此时JVM并不能保证将改变后的值立马写到主内存中去,也就意味着有可能其他线程不能立马得到改变后的值,依然在旧的变量上进行各种操作和运算,最终导致不可预料的结果。

 

 

  • 大小: 38.7 KB
分享到:
评论

相关推荐

    介绍Java中的内存泄漏Java开发Java经验技巧共3页

    首先,理解Java内存模型是至关重要的。Java内存分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)和本地方法栈(Native Method Stack)。其中,堆内存存储对象实例,栈内存存储方法调用,方法区存储类...

    Java开发岗面试知识点解析

    1. Java 内存模型是如何划分的? 答:JVM 内存分为堆内存、栈内存、方法区、程序计数器和本地方法栈。其中,堆内存存放对象实例,栈内存存放基本类型和对象引用,方法区存放类信息,程序计数器记录当前线程执行的...

    java面经+知识点.zip

    面试可能会涉及到JVM内存模型(堆、栈、方法区等)、垃圾收集器、内存泄漏、类加载机制(双亲委派模型)等。 3. **集合框架**:List、Set、Map接口及其实现类的特性和使用场景是常见的面试题。例如ArrayList与...

    JAVA笔试题积累

    5. **JVM内存模型**:理解堆、栈、方法区、本地方法栈、程序计数器等区域的作用,以及垃圾回收机制。 6. **多线程**:线程的创建方式(继承Thread类和实现Runnable接口)、线程同步(synchronized关键字,wait()、...

    java面试资料积累,经验分享.zip

    Java虚拟机(JVM)是Java程序运行的平台,面试中常常会考察内存模型(堆、栈、方法区等)、垃圾回收机制、类加载机制、性能优化等方面的知识。 九、设计模式 设计模式是解决常见问题的成熟方案,面试中可能会出现...

    java高级架构

    5. Java内存模型和垃圾回收机制:Java内存模型描述了Java虚拟机(JVM)中内存操作的规则,而垃圾回收机制是管理Java对象生命周期的关键部分。文档中提到了不可达算法,这是垃圾回收中的一个重要概念。 6. 系统设计:...

    Java面试题积累

    以下是一些基于标题“Java面试题积累”和描述“Java面试题 初中级 判断 选择 编程”的关键知识点: 1. **基础语法**:初级面试题通常会涵盖Java的基础语法,如数据类型(基本类型与引用类型)、变量、运算符、流程...

    求职Java面试积累 机试题

    6. **JVM内存管理**:理解Java内存模型(堆、栈、方法区、本地方法栈、程序计数器),垃圾回收机制(GC),以及如何进行内存泄漏检测和性能优化。面试中可能需要分析内存溢出或者内存泄漏的问题。 7. **IO流**:...

    我的java开发笔记(技术,经验)

    这显然是一份精心整理的Java面试常见问题集,涵盖了基础语法、集合框架、多线程、异常处理、IO流、网络编程、JVM内存模型等多个核心领域。这些问题不仅能够帮助你检验自己的知识掌握程度,还能帮助你在面试中...

    Java知识体系+ 总结+面试

    这部分可能涵盖类加载机制、内存模型(堆、栈、方法区等)、垃圾收集算法、JVM调优等主题。 5. **并发与多线程**:Java提供了丰富的并发编程工具,如线程、锁、同步机制、并发容器等。这部分会讲解线程安全、死锁、...

    JAVA基础知识点总结

    JVM则是一个抽象的计算模型,它负责执行Java字节码,使得Java程序能够在不同的硬件平台上运行,实现了“一次编写,到处运行”的理念。 Java虚拟机(JVM)是Java平台的核心,它通过软件模拟的方式在各种计算机系统上...

    李兴华java笔记

    笔记会涉及类加载机制、内存模型、垃圾回收等JVM核心概念。 9. **设计模式**:笔记会介绍常见的23种设计模式,如单例模式、工厂模式、装饰器模式等,这些都是解决软件开发中常见问题的成熟方案。 10. **Java框架**...

    JAVA全面知识

    5. **面试题**:面试题.doc和java面试题.doc汇总了Java程序员可能会遇到的面试问题,涵盖了基础语法、多线程、集合框架、IO流、异常处理、JVM内存模型等各个方面,是准备面试的宝贵资料。 6. **Struts2**:struts2....

    Java面试必备知识3.docx.zip

    5. **内存管理与垃圾回收**:理解Java内存模型(JVM),包括堆内存、栈内存、方法区。了解对象的生命周期,垃圾收集机制(GC)的工作原理以及如何避免内存泄漏。 6. **多线程**:理解线程的创建方式(Thread类和...

    Java编程宝典-十年典藏版

    4. 高级特性:书中可能还包括Java的高级特性讲解,比如垃圾回收机制、Java内存模型、Java 8引入的函数式编程特性(如Lambda表达式和Stream API)、Java模块化系统等。 5. 应用场景:Java广泛应用于企业级应用开发,...

    java面试问题积累1

    在Java面试中,三年工作经验的开发者通常需要对基础语法、面向对象编程、集合框架、多线程、异常处理、JVM内存模型、IO流、网络编程、设计模式以及Web服务器等有深入理解。这里我们将围绕这些关键领域,结合提供的...

    给java新手的一些建议-java知识点归纳(java基础部份) (2).pdf

    了解JVM内存模型(包括堆、栈、方法区等)、垃圾收集机制、性能调优(如线程 Dump 分析、内存结构)以及Java二进制字节码结构、类加载器系统、类加载过程和实例创建过程,都是提升Java开发技能的关键。 其次,了解...

    java虚拟机书籍

    《Java虚拟机精讲》这本书深入浅出地介绍了JVM的基础知识,从类加载机制、内存模型、字节码执行到垃圾收集,每一个主题都是对Java开发者日常工作中遇到的问题的解答。类加载机制解释了Java源代码如何被编译成字节码...

    Java并发编程学习笔记.rar

    10. **JVM内存模型**:理解Java内存模型(JMM)对于理解并发编程中的可见性和一致性至关重要。JMM规定了线程如何访问和修改共享变量。 通过学习上述知识点,并结合"Java并发编程学习笔记"中的内容,开发者可以更...

Global site tag (gtag.js) - Google Analytics