原创 【併發編程系列11】Java中12個原子(Atomic)操作類實現原理分析 前言 原子更新基本類型 原子更新數組 原子更新引用類型 原子更新屬性 CAS操作ABA問題 總結

前言 我們知道i++操作實際上是線程不安全的,因爲一個i++操作分爲了三步: 1、獲取的i的值 2、執行i+1 3、將i+1的結果賦值給i 而這三步不是一個原子操作,多線程環境下就會出現線程不安全性問題。 Java從JDK 1.5開始,

原创 【併發編程系列9】阻塞隊列之PriorityBlockingQueue,DelayQueue原理分析 前言 二叉堆 PriorityBlockingQueue DelayQueue

前言 前面我們介紹了ArrayBlockingQueue,LinkedBlockingQueue,LinkedBlockingDeque三種阻塞隊列,今天繼續介紹PriorityBlockingQueue和DelayQueue兩個阻塞隊列,

原创 【併發編程系列4】JMM中happens-before規則和as-if-serial語義 先行發生原則(happens-before) as-if-serial語義 總結

先行發生原則(happens-before) 我們知道,在Java內存模型中,如果要確保有序性可以靠volatile和synchronized來實現,但是如果所有的有序性都僅僅依靠這兩個關鍵字來完成,那麼有一些操作將會變得很繁瑣,但是我們在

原创 【併發編程系列3】volatile內存屏障及實現原理分析(JMM和MESI) 初識volatile volatile如何保證可見性 可見性的本質 總結

初識volatile Java語言規範第3版中對volatile的定義如下:Java編程語言允許線程訪問共享變量,爲了確保共享變量能被準確和一致地更新,線程應該確保通過排他鎖單獨獲得這個變量。 這個概念聽起來有些抽象,我們先看下面一個示例:

原创 【JVM系列8】JVM經典面試問題(內存溢出和內存泄露)解答及調優實戰分析 前言 常見問題及調優實戰

前言 JVM系列介紹到這裏,其實理論知識和基本工具的使用基本上都介紹過了,當然,JVM的理論知識也不僅僅只是這些,如果想要更深入的裏面還是會有很多細節值得深入瞭解,但是就目前來說,掌握了前面幾篇文章介紹的內容,我們已經可以對JVM進行基本的

原创 【JVM系列7】如何通過分析GC日誌來進行JVM調優 前言 什麼時候會發生垃圾收集 怎麼拿到GC日誌 PS+PO日誌分析 CMS日誌分析 G1日誌分析 利用工具分析GC日誌

前言 上一篇,我們介紹了JVM參數以及jdk提供的一些常用工具的使用,並且結合一個OOM例子,簡單講述瞭如何利用工具來分析dump文件,那麼本篇文章,將會介紹一個如何分析GC日誌。 不同的垃圾收集器產生的GC日誌大致遵循了同一個規則,只是有

原创 【JVM系列6】JDK常用監控指令和監控工具分析及OutOfMemory異常分析 前言 JVM參數 常用命令監控工具 可視化監控工具 總結

前言 JVM系列前5篇文章相對偏向於理論,從這篇開始將會結合實際場景進行分析以及如何對JVM進行調優。 JVM參數 所謂的JVM調優說白了就是去設置一個合理的,適合當前系統的JVM所提供的參數。從總體上來說JVM參數可以分爲三大類:標準參數

原创 【JVM系列5】深入分析Java垃圾收集算法和常用垃圾收集器 前言 如何確定無效對象 引用的分類 垃圾收集算法 垃圾收集器 如何選擇垃圾回收器 總結

前言 上一篇我們介紹了對象在堆內的內存佈局已經佔用空間的大小,同時分析了堆內可以分爲Young區和Old區,而且Young區可以分爲Eden區和Survivor區,Survivor區又拆分成了兩個大小一樣的區S0和S1區域,其實這麼拆分的理

原创 【JVM系列4】new Object()到底佔用幾個字節,看完這篇就徹底明白了 前言 對象的指向 Java內存模型 對象的訪問 堆內存 總結

前言 上一篇我們分析了Java虛擬機方法執行流程及方法重載和方法重寫原理,並分析了方法的調用過程及原理,Java虛擬機棧是線程私有的,沒有數據安全問題,而堆相比較於Java虛擬機棧而言更爲複雜,因爲堆是所有線程共享的一塊內存空間,會出現線程

原创 【JVM系列3】方法重載和方法重寫原理分析,看完這篇終於徹底搞懂了 前言 前言 思考 棧幀 方法調用流程演示 方法調用分析 總結

前言 JVM執行字節碼指令是基於棧的架構,就是說所有的操作數都必須先入棧,然後再根據需要出棧進行操作計算,再把結果進行入棧,這個流程和基於寄存器的架構是有本質區別的,而基於寄存器架構來實現,在不同的機器上可能會無法做到完全兼容,這也是Jav

原创 【JVM系列2】Java虛擬機類加載機制及雙親委派模式分析 前言 編譯 Class文件 類加載機制 總結

前言 上一篇我們粗略的介紹了一下Java虛擬機的運行時數據區,並對運行時數據區內的劃分進行了解釋,今天我們就會從類加載開始分析並會深入去看看數據是具體以什麼格式存儲到運行時數據區的。 編譯 一個.java文件經過編譯之後,變成了了.clas

原创 【JVM系列1】深入分析Java虛擬機堆和棧及OutOfMemory異常產生原因 前言 什麼是JVM Java程序執行流程 運行時數據區 總結

前言 JVM系列文章如無特殊說明,一些特性均是基於Hot Spot虛擬機和JDK1.8版本講述。 下面這張圖我想對於每個學習Java的人來說再熟悉不過了,這就是整個JDK的關係圖: 從上圖我們可以看到,Java Virtual Mach