`

java 对象内存模型

阅读更多

基础

在Java中,所有实例域(成员变量/成员方法)、静态域和数组元素存储在堆内存中,堆内存在线程之间共享,会存在内存可见性问题,受内存模型影响

Java内存模型的主要目标是定义程序中堆内存变量的访问规则,线程之间的通信和同步由Java内存模型控制

主内存与工作内存

java内存模型规定了所有的实例域(成员变量/成员方法)、静态域和数组元素都存储在主内存中, 除此之外每个线程都有自己的工作内存, 线程的工作内存中保存了被该线程使用到的变量的副本拷贝, 线程对变量的所有操作(读取, 赋值等)都必须在工作内存中进行, 而不能直接读写主内存中的变量. 不同的线程之间也无法直接访问对方工作内存中的变量, 线程间变量值的传递均需要通过主内存来完成

重排序

为了提高程序执行的性能,编译器和处理器通常会对指令做重排序

1属于编译器重排序,2和3属于处理器重排序

这些重排序都可能导致多线程程序出现内存可见性问题,为了避免这些问题,JMM的重排序规则会禁止特定类型的重排序

JMM的编译器重排序规则会禁止特定类型的编译器重排序;JMM的处理器重排序规则会要求Java编译器在生成指令序列时,通过插入特定类型的内存屏障指令来禁止特定类型的处理器重排序

JMM属于语言级的内存模型,它确保在不同的编译器和处理器平台上,通过禁止特定类型的编译器和处理器重排序,为程序员提供一致的内存可见性保证

Volatile与Synchronized

对于volatile修饰的变量,当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的

volatile变量对所有线程是立即可见的,对volatile变量的所有写操作都能立刻反应到其他线程之中

JVM规范规定了任何一个线程修改了volatile变量的值都需要立即将新值更新到主内存中, 任何线程任何时候使用到volatile变量时都需要重新获取主内存的变量值

两者区别

1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
5.volatile标记的变量不会被编译器优化(禁止指令重排序优化,即执行顺序与程序顺序一致);synchronized标记的变量可以被编译器优化

 

 

 

分享到:
评论

相关推荐

    探讨Java的对象是怎么在内存中产生的?

    个人对于Java对象在JVM中的探讨,Java对象是怎么产生的,内存模型是什么样的?

    JVM内存结构、Java内存模型、Java对象模型1

    1、以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规范 2、规范中定义的方法区,只是一种概念上的区域,并说明了其应该具有什么功能 3、不同

    Java面试-讲一讲什么是Java内存模型

    简略辨析JVM内存结构、Java内存模型、Java对象模型三个概念的异同 说明Java内存模型概念和核心内容 针对重排序说一说重排序的例子,重排序的好处 着重说一说可见性,说一说JVM内存的抽象、hanpens

    zytc2009#BigTeam_learning#JVM内存结构、Java内存模型、Java对象模型1

    1、以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规范 2、规范中定义的方法区,只是一种概念上的区域,并说明了其应该具有什么功能 3、不同

    Java理论与实践:修复Java内存模型2

    本文介绍了Java平台从一开始就包括了对线程的支持,包括一个计划为正确同步的程序提供“一次编写,到处运行”保证的、跨平台的内存模型,但是原来的内存模型有一些漏洞。虽然许多Java平台提供了比JMM所要求的更强的...

    面向对象和JVM内存模型.pdf

    Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,

    java内存模型.docx

    栈:基本类型的变量和对象的引用存放在栈中。例如:int a=0; Person p; 堆:对象是在堆中创建的,即对象存放在堆中。例如:new Person();

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第二节:JVM内存模型 1.1 概念 1.2 JVM内存模型 1.3 Heap堆内存模型 第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式...

    Java虚拟机中冷对象的研究_骆凡.caj

    问模型更加适合长时间运行的有着大量堆对象需求的应用程序。 本文描述了一个基于堆栈框架 , 用于在运行时检测这些 “ 冷 ” 对象 , 以便在堆的指定 区域封装和隔离它们 , 它们可能优先调出到一个后备存储器 , 从而...

    JVM内存模型架构图-新生代-老年代-永久代

    JVM内存模型架构图,核心部分包括: GC主要在新生区(伊甸园区)、老年区 新生区(伊甸园区(对象都是在这个区new出来的)、幸存区to、幸存区from:幸存区位置会互相交换,谁空谁是to) 老年区 永久区:存储的是...

    Java虚拟机内存优化实践

    前面一篇文章介绍了Java虚拟机的体系结构和内存模型,既然提到内存,不得不说到内存泄露。众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第28节Java内存区域-直接内存和运行时常量池00:15:53分钟 | 第29节对象在内存中的布局-对象的创建00:21:19分钟 | 第30节探究对象的结构00:13:47分钟 | 第31节深入理解对象的访问定位00:08:01分钟 | 第32节垃圾...

    java核心面试技术点

    java 内存模型 ( java memory model ):根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有对象成员变量都储存在主存中,对于所有线程都是共享的。...

    Java的内存模型

     同步约束:Synchronized-with 把对象视图与主内存同步  【规则】  1.解锁与后续锁操作存在同步约束。  2.volatile变量写入和读取存在同步约束。  3.若A受到B的同步约束,则A在B之前发生。  4.程序中A...

    java核心面试

    java 内存模型 ( java memory model ):根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有对象成员变量都储存在主存中,对于所有线程都是共享的。...

    JVM内存模型fager20200614.docx

    在 HotSpot 虚拟机中,分为 3 块区域:对象头(Header)、实例数据...另外,如果是 Java 数组,对象头中还必须有一块用于记录数组长度的数据,因为普通对象可以通过 Java 对象元数据确定大小,而数组对象不可以。

    java虚拟机知识点整理

    高效并发-java内存模型与线程 线程安全与锁优化 1 标记-清除算法:首先标记所有需要回收的对象(引用计数或可达性分析算法标记),在标记完成后统一回收所有被标记的对象。 缺点:效率问题,标记和清除两个过程效率都...

    java垃圾回收以及jvm参数调优概述

    而且这两个问题针对的内存区域就是Java内存模型中的堆。垃圾回收机制的引入可以有效的防止内存泄露、保证内存的有效使用,也大大解放了Java程序员的双手,使得他们在编写程序的时候不再需要考虑内存管理。本文主要对...

Global site tag (gtag.js) - Google Analytics