原创 OpenJDK ZGC 源碼分析(三)內存管理

1. 簡介 ZGC與傳統GC不同,標記階段標記的是指針(colored pointer),而非傳統GC算法中的標記對象。ZGC藉助內存映射,將多個地址映射到同一個內存文件描述符上,使得ZGC回收週期各階段能夠使用不同的地址訪問同一

原创 Apache Flink ABS機制與原理分析

1. 簡介 分佈式有狀態的流處理支持在雲端部署和執行大規模連續地計算,同時可以應對低延遲和高吞吐量場景。 這一模式最大的挑戰之一是在系統可能失敗的情況下提供數據可靠性保證。 現有方法依賴於可用於故障恢復的週期性全局狀態快照。 此類

原创 Kotlin字節碼解析-3 函數內聯

1. 背景 在JAVA8中,Lamdba表達式通過invokedynamic指令實現的,通過invokedynamic可以避免編譯期硬編碼生成內部匿名類的實現,而是由JIT在運行時才產生相應的接入點代碼,顯著減少靜態生成的類和字節

原创 JEP-351 ZGC: Uncommit Unused Memory(JDK 13)

1. 簡介 將GC後的內存返回給OS這一能力,在雲計算場景中將節省用戶的支出。因此G1和Shenandoah均實現了該能力,在JDK 13中,ZGC也具備了該能力。 由於ZGC的堆被劃分爲一個個的ZPage,返回OS將以ZPage

原创 Ehcache的緩存淘汰機制

1. 簡介 正如上篇文章所說,Ehcache採用了多級緩存堆內、堆外、磁盤,每級緩存容量遞增,最底層被稱爲Authoritative Tier,其餘的緩存層被稱爲Caching Tier。Authoritative Tier層數據

原创 JEP 353: Reimplement the Legacy Socket API(JDK 13)

1. 簡介 JDK中的java.net.Socket 和 java.net.ServerSocket實現非常古老,可以上溯到JDK 1.0,該實現是混合了JAVA和C代碼,非常難於維護和調試。另外,該實現使用線程堆棧作爲I/O緩衝

原创 Java中的字符串存儲方式

1. 簡介 十一放假期間在脈脈上看見一道面試題討論的很火熱: Java中字符串是如何存儲的? 這一問題看似簡單,但是背後卻隱藏了很多深層機制,本文將逐一介紹相關技術原理。 2. 字符串類 字符串廣泛應用於Java編程中,在Ja

原创 Kotlin協程的字節碼解析-1

1. 背景 kotlinx.coroutines 是由 JetBrains 開發的功能豐富的協程庫。它包含本指南中涵蓋的很多啓用高級協程的原語,包括 launch、 async 等等。 本文是通過反編譯協程相關class文件,分析

原创 etcd源碼閱讀筆記(二)backend

1. 簡介 etcd的backend模塊對於底層存儲引擎進行了抽象,默認使用上一篇文章中介紹的BoltDB。 etcd將鍵值對的每一個版本都存儲在BoltDB中,並在內存中構建BTree keyIndex索引。 在BoltDB

原创 java.nio.file.Files lines方法使用不當引發的文件句柄泄露

1. 問題描述 4月29日上午,測試同學通過壓測工具測試"網關->業務層->分析服務"鏈路,QPS 200。 測試開始不久後,CloudMonitor告警"分析服務"服務器磁盤佔用超過80%,經過排查,確定告警根原因是java.n

原创 etcd源碼閱讀筆記(一)存儲引擎

1. 簡介 etcd是一個分佈式高可用的鍵值對存儲,主要聚焦於以下能力: 簡單,通過gRPC調用 安全,支持TLS 快速,支持每秒10000次寫入 高可用,採用Raft算法,實現了CP etcd v2在實際應用中遇到了一些問題

原创 緩存一致性協議簡介

1. 前言 最近閱讀了一些UNIX系統書籍,對於多處理器系統和高速緩存的機制有了更多的理解,寫下本文備忘。 2. 多處理器的高速緩存架構 2.1 SMP 最簡單的多處理器架構是一種被稱爲對稱多處理器結構(SMP:Symmetric

原创 Web服務器的線程策略

1. 簡介 當前主流的Web服務器如Tomcat、Jetty均已採用nio作爲默認的I/O模型。通常nio的線程模型中會有一組Acceptor線程用於接收客戶端連接,一組Selector線程用於監聽和處理I/O事件。當Select

原创 Tomcat線程池的優化

1. 簡介 Tomcat繼承並重寫了JAVA原生的java.util.concurrent.ThreadPoolExecutor,增加了一些更有效率的方法,並且默認拒絕策略爲RejectedExecutionException。

原创 OpenJDK ZGC 源碼分析(六)GC回收

1. 簡介 GC回收週期大體如下圖所示: GC回收週期包括如下11個子階段: phase 1:初始標記,需要STW phase 2:併發標記 phase 3:標記結束,需要STW phase 4:併發處理軟引用、弱引用 pha