程序員練級攻略(2018):Java底層知識

圖片描述
這個是我訂閱 陳皓老師在極客上的專欄《左耳聽風》,我貼出來是爲了本身之後方便學習和記憶,同時也分享給大家一塊兒學習,固然若是有興趣,能夠去訂閱,爲了不廣告嫌疑,我這就很少說了!如下第一人稱是指陳皓老師。html

想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等着你!前端

Java 字節碼相關

首先,Java 最黑科技的玩法就是字節碼編程,也就是動態修改或是動態生成 Java 字節碼。Java 的字節碼至關於彙編,其中的一些細節你能夠從下面的這幾個教程中學習。java

固然,通常來講,咱們不使用 JVMTI 操做字節碼,而是用一些更好用的庫。這裏有三個庫能夠幫你比較容易地作這個事。git

  • asmtools - 用於生產環境的 Java .class 文件開發工具。
  • Byte Buddy - 代碼生成庫:運行時建立 Class 文件而不須要編譯器幫助。
  • Jitescript - 和 BiteScript 相似的字節碼生成庫。

就我而言,我更喜歡 Byte Buddy,它在 2015 年還獲了 Oracle 的 「Duke’s Choice」 大獎,其中說 Byte Buddy 極大地發展了 Java 的技術。github

使用字節碼編程能夠玩出不少高級玩法,最高級的仍是在 Java 程序運行時進行字節碼修改和代碼注入。聽起來是否是一些很黑客,也很黑科技的事?是的,這個方式使用 Java 這門靜態語言在運行時能夠進行各類動態的代碼修改,並且能夠進行無侵入的編程。算法

好比, 咱們不須要在代碼中埋點作統計或監控,可使用這種技術把咱們的監控代碼直接以字節碼的方式注入到別人的代碼中,從而實現對實際程序運行狀況進行統計和監控。若是你看過個人《編程範式遊記》,你就知道這種技術的威力了,其能夠很魔法地把業務邏輯和代碼控制分離開來。編程

要作到這個事,你還須要學習一個叫 Java Agent 的技術。Java Agent 使用的是 「Java Instrumentation API」,其主要方法是實現一個叫 premain() 的方法(嗯,一個比 main() 函數還要超前執行的 main 函數),而後把你的代碼編譯成一個 jar 文件。多線程

在 JVM 啓動時,使用這樣的命令行來引入你的 jar 文件:oracle

java -javaagent:yourAwesomeAgent.jar -jar App.jar。更爲詳細的文章你能夠參看:「Java Code Geeks: Java Agents」,你還能夠看一下這個示例項目:jvm-monitoring-agent 或是 EntryPointKR/Agent.java。若是想用 ByteBuddy 來玩,你能夠看看這篇文章 「經過使用 Byte Buddy,便捷地建立 Java Agent」。若是你想學習如何用 Java Agent 作監控,你能夠看一下這個項目 Stage Monitorjvm

JVM 相關

接下來說講 Java 底層知識中另外一個很是重要的內容——JVM。

提及 JVM,你有必要讀一下 JVM 的規格說明書,我在這裏放一個 Java 8 的, The Java Virtual Machine Specification Java SE 8 Edition 。對於規格說明書的閱讀,我認爲是系統瞭解 JVM 規範的最佳文檔,這個文檔可讓你對於搞不清楚或是詭異的問題恍然大悟。關於中文翻譯,有人在 GitHub 上開了個 Repo - 「java-virtual-machine-specification」。

另外,也推薦一下 JVM Anatomy Park JVM 解剖公園,這是一個系列的文章,每篇文章都不長,可是都很精彩,帶你一點一點地把 JVM 中的一些技術解開。

學習 Java 底層原理還有 Java 的內存模型,官方文章是 JSR 133。還有馬里蘭大學的威廉·皮尤(William Pugh)教授收集的和 Java 內存模型相關的文獻 - The Java Memory Model ,你能夠前往瀏覽。

對於內存方面,道格·利(Doug Lea)有兩篇文章也是頗有價值的。

  • The JSR-133 Cookbook for Compiler Writers,解釋了怎樣實現 Java 內存模型,特別是在考慮到多處理器(或多核)系統的狀況下,多線程和讀寫屏障的實現。
  • Using JDK 9 Memory Order Modes,講了怎樣經過 VarHandle 來使用 plain、opaque、release/acquire 和 volatile 四種共享內存的訪問模式,並剖析了底層的原理。

垃圾回收機制也是須要好好學習的,在這裏推薦一本書 《The Garbage Collection Handbook》,在豆瓣上的得分竟然是 9.9(固然,評價人數很少)。這本書很是全面地介紹了垃圾收集的原理、設計和算法。可是這本書也是至關難啃的。中文翻譯《垃圾回收算法手冊》翻譯得很通常,有人說翻譯得很爛。因此,若是可能,仍是讀英文版的。若是你對從事垃圾回收相關的工做有興趣,那麼你須要好好看一下這本書。

固然,更多的人可能只須要知道怎麼調優垃圾回收, 那麼推薦讀讀 Garbage Collection Tuning Guide ,它是 Hotspot Java 虛擬機的垃圾回收調優指南,對你頗有幫助。

Quick Tips for Fast Code on the JVM 也是一篇很不錯的文章,裏面有寫出更快的 Java 代碼的幾個小提示,值得一讀。

小結

好了,總結一下今天學到的內容。Java 最黑科技的玩法就是字節碼編程,也就是動態修改或是動態生成 Java 字節碼。Java 的字節碼至關於彙編,學習其中的細節頗有意思,爲此我精心挑選了 3 篇文章,供你學習。咱們通常不使用 JVMTI 操做字節碼,而是用一些更好用的庫,如 asmtools、Byte Buddy 和 BiteScript 等。使用字節碼編程能夠玩出不少高級玩法,其中最高級的玩法是在 Java 程序運行時進行字節碼修改和代碼注入。同時,我介紹了 Java Agent 技術,幫助你更好地實現這種高級玩法。

JVM 也是學習 Java 過程當中很是重要的一部份內容。我推薦閱讀一下 JVM 的規格說明書,我認爲,它是系統瞭解 JVM 規範的最佳文檔,可讓你對於搞不清楚或是詭異的問題恍然大悟。同時推薦了 JVM Anatomy Park 系列文章,也很是值得一讀。

隨後介紹的是 Java 的內存模型和垃圾回收機制,尤爲給出瞭如何調優垃圾回收方面的資料。這些內容都很底層,但也都很重要。對於想成爲高手的你來講,仍是有必要花時間來啃一啃的。

你的點贊是我持續分享好東西的動力,歡迎點贊!

一個笨笨的碼農,個人世界只能終身學習!

歡迎加入前端你們庭,裏面會常常分享一些技術資源。

圖片描述

相關文章
相關標籤/搜索