动态

列表
创建 时间

“傻傻”的JAVA編譯器

故事是從一個問題開始的:為什麼 Java 中 2 * (i * i) 比 2 * i * i更快? 猛地一看,我還以為有人在釣魚,這倆玩意不應該是一模一樣嗎?第二反應是計算結果溢出了int值所以導致了這個差異,於是我掏出JMH這個利器準備開始一輪驗證,為了避免干擾,構造了不同的測試用例集用於縱向與橫向的比較。 @BenchmarkMode(Mode.AverageTime)

创建 时间

過早優化是萬惡之源——聊聊FastThreadLocal的Cache line padding

💡 過早優化是萬惡之源。 ——Tony Hoare 作為軟件開發人員的一句名言,相信絕大多數小夥伴都有聽聞過這句名言,而我在最近閲讀netty源碼的時候就見識了這麼一個有趣的例子。 Netty是一個用於構建高性能、可伸縮的網絡應用程序的異步事件驅動框架。它主要關注在網絡通信、協議處理和高性能的特性上,是一個基於Java的開源框架。Netty的設計目標是提供簡單而強大的 API,使得開發者能夠輕鬆

创建 时间

server.max-http-header-size與OOM不得不説的故事

今天的故事是從nacos的升級開始的,出於性能、服務治理等原因我司想把從dubbo2.7.x升級到3.2.x,但在這之前有個前提,那就是nacos首先要升級到2.x,於是乎就開始了我多災多難的nacos升級之旅。 一開始我以為這會是個很簡單的事情,畢竟很多人已經從1.x升級到2.x了,但當運維把測試環境的nacos升級到2.x後沒多會涌現了一堆告警,全都是找不到dubbo的服務提供者,我這邊立馬登

创建 时间

你是否也在尋找二進制和字符串的高效轉換算法?

做底層框架或技術產品的研發同學在代碼調優過程中不可避免的會遇到序列化/反序列化的場景,除了面向前端的場景一般情況下我們會選取一些二進制序列化框架比如hessian2、Protocol Buffers、Thrift、Avro、Kryo等,它們體積更小、精度更高也更安全,但當需要存儲時需要將其轉為字符串,業界比較普遍使用的方案是Base64 https://en.wikipedia.org/wiki/

创建 时间

聊聊為什麼java會有這麼多的字節碼改寫方式(jdk/cglib/asm/javasist)?

字節碼改寫方式的多樣性主要源於不同的使用場景、需求和設計哲學。 以下兩個方面是比較重要的原因: https://www.zhihu.com/question/7501915796/answer/61918375697 學習和使用成本 精細化控制能力與性能需求 首先説一下jdk代理,它是在2000年5月發佈的jdk 1.3中引入的,這裏對jdk代理就不做過於詳細的介紹了,它的出現主要是為了提

创建 时间

Java字節碼改寫之asm進階使用

在java世界裏,字節碼改寫 + 反射可以讓你變成“上帝”,你可以完成任何你想做的事情,而字節碼改寫中asm是當之無愧的老大哥,對字節碼認識不深的小夥伴可以看看我這篇文章 https://www.zhihu.com/question/7501915796/answer/61918375697 本文的目的是現有互聯網上asm的資料不夠體系和細緻,其和傳統java編程也非常的不一樣,使用時有很多需要注

创建 时间

Java字節碼與流量回放

字節碼改寫/增強——Java帝國的DNA + 流量回放的魔法棒 What(是什麼) 在jvm中大約有200條左右的指令。這些指令包括各種操作,用於信息加載、存儲、算術計算、類型轉換、對象創建、調用方法、控制流管理和異常處理等,是整個java世界的基石。所謂的字節碼增強/改寫就是在不修改Java源代碼的情況下,通過直接操作編譯後的字節碼來動態修改程序行為。從實現角度字節碼其實是沒有增強這麼一説的,只