JAVA虚拟机
文章平均质量分 88
超级字节码
你之所以是你,是因为你不知道你是你
展开
-
SystemGC完全解读
目录 1、System.gc的概述 2、JDK里的System.gc的实现 3、Hotspot里System.gc的实现 4、并行Full GC相对正常的Full GC效率高在哪里 5、堆外内存常配合使用System GC 1、System.gc的概述 JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可以通过jmap来触发等,针对每个场景其实我们都可以写篇文章来做一个介绍,本文重点介绍下Sys原创 2021-03-04 22:28:16 · 410 阅读 · 2 评论 -
深入理解 Java 内存模型(一)— 基础
并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写 - 读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必...原创 2019-01-09 21:37:21 · 253 阅读 · 2 评论 -
深入理解 Java 内存模型(二)— 重排序
数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置。 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。 读后写 a = b;b = 1; 读一个变量之后,...原创 2019-01-09 21:52:42 · 161 阅读 · 0 评论 -
深入理解 Java 内存模型(四)— volatile关键字
volatile 的特性 当我们声明共享变量为 volatile 后,对这个变量的读 / 写将会很特别。理解 volatile 特性的一个好方法是:把对 volatile 变量的单个读 / 写,看成是使用同一个监视器锁对这些单个读 / 写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码: class VolatileFeaturesExample { volatil...原创 2019-01-09 22:03:57 · 238 阅读 · 0 评论 -
深入理解 Java 内存模型(三)— 顺序一致性
数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争。java 内存模型规范对数据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序。 当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序。 JMM 对正确同步的多线程程序的内存一致性做...原创 2019-01-09 22:08:38 · 234 阅读 · 0 评论 -
深入理解 Java 内存模型(五)— 锁
锁的释放 - 获取建立的 happens before 关系 锁是 java 并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。 下面是锁释放 - 获取的示例代码: class MonitorExample { int a = 0; public synchronized void writer() { //1 ...原创 2019-01-09 22:14:22 · 219 阅读 · 0 评论 -
深入理解 Java 内存模型(六)— final关键字
与前面介绍的锁和 volatile 相比较,对 final 域的读和写更像是普通的变量访问。对于 final 域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个 final 域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序。 下面,我们通过一些示...原创 2019-01-09 22:17:43 · 305 阅读 · 0 评论 -
深入理解 Java 内存模型(七)— 总结
处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM 和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。JMM 和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和 JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响。 根据对不同类型读 / 写操作组合的执行顺序的放松,可以把常见处理器的内存模型划分为下面...原创 2019-01-09 22:20:09 · 169 阅读 · 0 评论