InfoQ播客:Tal Weiss談JVM的可觀測性、插樁、以及位元組碼操作

weixin_33858249發表於2016-11-30

在本週的InfoQ播客中,QCon主席Wesley Reisz與Tal Weiss進行了對話。Weiss是OverOps公司的執行長,其公司OverOps的前身是Takipi。此次對話的內容涵蓋了OverOps產品的運作機制,深入探討了JVM的插樁和可觀測性之間的區別,談論了位元組碼操作的方法和在Java開發中的常見錯誤。

\\

Weiss在過去的15年裡設計了很多可擴充套件的、實時的Java和C++應用。他曾經是VisualTao公司的聯合創始人兼執行長,如今這家公司已經在2009年被Autodest收購。他也曾在IAI空間研究所擔任軟體架構師,主要關注分散式、實時的衛星跟蹤技術和相關的控制系統。

\\

關鍵要點

\\
  • OverOps在應用部署時使用了一種機器程式碼插樁和靜態程式碼分析的混合技術來構建一個程式碼的索引。\\t
  • 可觀測性是指你應該如何設計你的程式碼架構,才能夠從它的輸出中捕獲有用的資訊。插樁是指你通過位元組碼或者機器碼操作技術從系統的外部進入到內部來捕獲一些資訊,這整個過程發生在系統被設計並構建完成之後。\\t
  • 大多數公司都可以從學習位元組碼插樁技術的過程中受益。位元組碼不是機器碼 —— 而是一個高層級的程式語言。如果能夠讀懂位元組碼,會在很大程度上幫助你理解JVM的運作機制。\\t
  • 有很多的位元組碼操作工具可以供你使用來操作位元組碼 —— 比如ASM這個為大多數人所知的工具。\\t
  • 在一個應用程式的生命週期內,絕大部分的日誌記錄都來自很小的一部分系統事件。一個很好的習慣是定期去檢視你的日誌記錄,確保你記錄了正確的、有價值的資訊。\

點選播客連結收聽

\\

摘要

\\

OverOps

\\
  • 1分21秒:OverOps允許你通過新增到日誌檔案中的微小連線檢視到整個呼叫堆疊的原始碼和變數的狀態。\\t
  • 3分00秒:為了以一種開銷小於1%的高效能的方式做到這一點,產品必須定位於JVM和處理器之間。\\t
  • 3分44秒:OverOps在應用部署時使用了一種機器程式碼插樁和靜態程式碼分析的混合技術來構建一個程式碼的索引。這種機制避免了在執行時環境下使用後設資料或者反射。取而代之的是,OverOps能夠在一個底層環境中捕捉到原始的記憶體狀態並且將其重建到原始碼中。\

SaaS與On-Premise

\\
  • 5分44秒:OverOps剛開始時被作為一個SaaS產品,但考慮到它收集到的大量資料中含有很多潛在的敏感資訊,我們便引入了一個新產品,這個產品被命名為Hybrid。 Hybrid會將資料分成兩個獨立的流:資料流和後設資料流。\\t
  • 6分42秒:其中,資料流是捕獲到的原始資料,然後會對原始資料使用256位AES加密金鑰進行私有加密,這個256位AES加密金鑰只會儲存在生產機器上,並且當使用者在需要解密時使用。後設資料流不包含敏感資訊,因為它只是一個抽象的數學圖。\\t
  • 7分18秒:因為資料流已經被私鑰加密,所以該資料流可以被儲存在防火牆後面,並且不需要脫離公司的內部區域網。\\t
  • 7分39秒:對於一些知名的銀行和電信公司而言,法律監管的限制致使他們無法使用這種混合的SaaS方法,OverOps提供了一個後端的Docker容器,這個容器允許你在其內部執行整個系統。\\t
  • 8分24秒:作為一個初創企業,你需要能夠同時進行基於SaaS方法和Docker容器的內部部署。如果你只進行了基於SaaS方法的部署,你將從多個賬戶中被鎖定。\

插樁(Instrumentation)與可觀測性(Observability)

\\
  • 8分59秒:可觀測性是指你應該如何設計你的程式碼架構,才能夠從它的輸出中捕獲有用的資訊。插樁是指你通過位元組碼或者機器碼操作技術從系統的外部進入到內部來捕獲一些資訊,這整個過程發生在系統被設計並構建完成之後。\\t
  • 10分24秒:JVM允許位元組碼插樁,因此你可以通過補丁來增加額外的位元組碼,並讓JIT編譯器將這段位元組碼取出並重新編譯。這項技術通常用於效能管理。\\t
  • 11分14秒:你還可以像OverOps一樣進行機器碼的插樁。這樣做的優點是,你可以在更加接近底層的地方進行操作,這種底層操作會帶來很明顯的速度上的提升。但是,你必須為特定處理器來編寫不同的機器碼,這樣做會失去平臺的獨立性,而且這種機器碼的編寫本身也是很有難度的。\

和位元組碼一起工作

\\
  • 11分49秒:大多數公司都可以從學習位元組碼插樁技術的過程中受益。\\t
  • 13分32秒:位元組碼不是機器碼 —— 它是一個高階的程式語言。如果你能夠讀懂它,它會幫助你更加深入的瞭解JVM的工作機制,比如JVM如何進行垃圾收集工作,瞭解堆疊的跟蹤,配置檔案等。\\t
  • 14分30秒:一個有關位元組碼有趣的事是,它在JVM執行時環境下不是一成不變的。而是可以隨著需求不斷進行變化的。\\t
  • 15分46秒:如果反射機制是一種可以反映物件結構的能力,那麼位元組碼插樁技術就是一種能夠反映程式碼結構的能力。\\t
  • 16分40秒:Weiss為O’Reilly製作了一套課程,在課程中他會教你如何進行位元組碼插樁。你可以在一天之內學會這個技術。所有你需要做的事情就是給一個JAR檔案新增一個屬性,使該檔案成為一個代理。這樣做最終會給予這個代理可以在JVM層級操作程式碼的許可權。\\t
  • 17分41秒:一個代理會獲得一個在Main方法之前執行的函式,這個函式隨後會被JVM回撥,JVM會在函式內提供一個插樁物件,該物件允許你檢視所有已經載入的類和方法,並且你可以隨時操作它。\\t
  • 18分20秒:有很多的位元組碼操作工具可以供你使用來操作位元組碼 —— 比如ASM這個為大多數人所知的工具。\\t
  • 19分04秒:還有一個名為ASMifier的外掛,它會在你編寫程式碼的同時,在編輯器中實時顯示程式碼的位元組碼錶示。\\t
  • 20分12秒:無論您如何新增位元組碼,JVM都會呼叫位元組碼驗證器檢查位元組碼的語法和有效性。\

Java開發中的常見錯誤

\\
  • 22分27秒:在一個應用程式的生命週期內,絕大部分的日誌記錄都來自於很小的一部分系統事件。作為架構師,把這些事件之間的關係對映出來是很有必要的。因為有很多在日誌裡的資訊我們是不需要的,但是我們需要的那些可能已經丟失了。\\t
  • 25分10秒:通常,錯誤來自於資料驗證和資料處理,數字格式不對或者索引超出範圍的錯誤等,而不是空指標問題。發生的原因是資料總是很容易被損壞。\\t
  • 25分55秒:與動態連結有關的類載入錯誤是另一類很常見的錯誤。\\t
  • 26分40秒:空指標錯誤是相當少見的,因為開發者們對這個錯誤都非常敏感。\\t
  • 27分33秒:你需要不斷的檢視日誌並且優化它們。\

資源

\\

位元組碼操作框架

\\

更多關於播客的資訊

\\

你可以通過我們的RSS feed來了解關於播客的最新情況,也可通過SoundCloudiTunes收聽。本頁所列出的播客摘要內容均附有可點選連結(英文原文),點選後可直接切換到音訊的相關部分。

\\

檢視英文原文:Tal Weiss on Observability, Instrumentation and Bytecode Manipulation on the JVM

相關文章