JMM(java内存模型)
文章平均质量分 72
Oo此岸花开oO
这个作者很懒,什么都没留下…
展开
-
JMM——重排序与内存屏障
重排序 在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序 重排序有三种类型: 1.编译器优化的重排序 编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序 2.指令级并行的重排序 现代处理器采用了指令级并行技术来将多条指令重叠执行。 如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序 3.内存系统的重排序 由于处理器使用缓存和读/写缓冲区,这使转载 2016-03-30 09:28:01 · 3131 阅读 · 2 评论 -
JVMGC——堆内存的分代
分代的垃圾回收策略 基于对对象声明周期分析后得出的垃圾回收算法。 把对象分为年青代、年老代和持久代,对不同声明周期的对象使用不同的算法 年轻代: 一个Eden区,两个Survior区 ,使用复制回收算法 所有新生成的对象首先都是放置在年轻代(Eden区)的 年轻代的目标就是尽可能快速地收集掉那些生命周期短的对象 年轻代回收过程: 1. 当Eden区满时,转载 2016-03-27 18:49:41 · 520 阅读 · 0 评论 -
JMM——重排序与happens-before
数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分为下列三种类型: 上述三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变 只有编译器和处理器在重排序时会遵守数据依赖性,它们不会改变存在数据依赖性关系的两个操作的执行顺序。 但是不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑 a转载 2016-03-30 09:49:09 · 960 阅读 · 0 评论 -
JMM——volatile的内存语义
volatile 理解volatile特性的一个好方法: 把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步 锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性, 这意味这对一个volatile变量的读,总是能看到任意线程对这个volatile变量最后的写入值 锁的语义决定了临界区代码的执行具有原子性 如果是多个vo转载 2016-03-30 10:01:44 · 1945 阅读 · 0 评论 -
JMM——volatile与内存屏障
为了实现volatile内存语义,JMM会分别限制编译器重排序和处理器重排序 1.当第一个操作为普通的读或写时,如果第二个操作为volatile写,则编译器不能重排序这两个操作(1,3) 2.当第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前(第二行) 3.当第一个操作转载 2016-03-30 13:08:08 · 16190 阅读 · 5 评论 -
JMM——运行时数据区
Java虚拟机运行时数据区 1 程序计数器(Program Counter Register) 1.1 程序计数器是一块较小的线程私有的内存空间,可以看作是当前线程锁执行的字节码的行号指示器。 1.2 如果线程正在执行的是一个Java方法,记录的是正在执行的虚拟机字节码指令的地址 1.3 如果执行的是Native方法,计数器值为空(Undefined原创 2016-03-27 16:23:42 · 602 阅读 · 0 评论 -
JMM——线程间通信
在并发编程中,我们需要处理两个关键问题: 1. 线程之间如何通信 通信是指线程之间以何种机制来交换信息,在命令式编程(c语言)中,线程之间的通信机制有两种: 1.1 共享内存 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。 JAVA并发采用的是共享内存模型,java线程之间的通信总是隐式进行,整个通信过程对程序员完全透原创 2016-03-28 20:16:09 · 1231 阅读 · 0 评论 -
JVMGC——基本垃圾回收算法
按照基本回收策略分: 1. 引用计数 原理是此对象有一个引用就增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只回收计数为0的对象。 缺点:无法处理循环引用的问题 2. 标记-清除 此算法执行分两阶段: 1. 从引用根节点开始标记所有被引用的对象 2. 遍历整个堆,把未标记的对象清除。 缺点:此算法需要暂停整个应用,会产生内存碎片原创 2016-03-27 16:46:32 · 519 阅读 · 0 评论