原创 一個 Java 線程池bug引發的 GC 機制思考

問題描述前幾天,在幫同事排查一個線上偶發的線程池錯誤邏輯很簡單,線程池執行了一個帶結果的異步任務。但是最近有偶發的報錯:java.util.concurrent.RejectedExecutionException: Task java.u

原创 一個Spring-Boot通用啓動腳本

一個Spring-Boot的通用啓動腳本,支持啓動/停止/重啓/查看狀態/Dump進程相關數據(JVM/OS) 使用方式: 基本使用 $ 腳本名 [start|stop|restart|status|dump] DEBUG模式啓動 $ 腳

原创 一文讀懂Spring事務管理器

爲什麼需要事務管理器 如果沒有事務管理器的話,我們的程序可能是這樣: Connection connection = acquireConnection(); try{ int updated = connection.prepar

原创 JVM的那些常用參數以及命令

簡介 java啓動參數共分爲三類 其一是標準參數(-),所有的JVM實現都必須實現這些參數的功能,而且向後兼容 其二是非標準參數(-X),默認jvm實現這些參數的功能,但是並不保證所有jvm實現都滿足,且不保證向後兼容 其三是非Stabl

原创 細說Java中的各種引用以及GC策略

在介紹各種引用之前,先簡單介紹下垃圾回收 什麼是垃圾回收 垃圾回收(Garbage Collection,GC),顧名思義就是釋放垃圾佔用的空間,防止內存泄露。有效的使用可以使用的內存,對內存堆中已經死亡的或者長時間沒有使用的對象進行清除

原创 Arthas的高級操作 - Ognl表達式

Arthas的一個很重要的應用場景,就是查看運行時的數據,但有時需要動態的查看數據,或者數據過多,需要動態篩選,比較複雜的規則就需要靠OGNL了。 下面介紹一些常用的arthas中ognl的操作,測試代碼如下,springboot工程: @

原创 聊聊Java中的內存

JVM的內存 先放一張JVM的內存劃分圖,總體上可以分爲堆和非堆(粗略劃分,基於java8) 那麼一個Java進程最大佔用的物理內存爲: Max Memory = eden + survivor + old + String Constan

原创 細說Http中的Keep-Alive和Java Http中的Keep-Alive機制

什麼是Keep-Alive 這個詞看着有點熟,很多地方好像都見過。 TCP的KeepAlive,Http的KeepAlive,現在就連一些前端框架都有類似KeepAlive的東西了(比如VUE.js,保持路由)。 本文介紹HTTP和TCP中

原创 記一次通過Arthas定位解決spring-boot中內嵌tomcat的嚴重bug

背景 公司有個渠道系統,專門對接三方渠道使用,沒有什麼業務邏輯,主要是轉換報文和參數校驗之類的工作,起着一個承上啓下的作用。 最近在優化接口的響應時間,優化了代碼之後,但是時間還是達不到要求;有一個詭異的100ms左右的耗時問題,在接口中打

原创 當Mysql行鎖遇到複合主鍵和多列索引

背景 今天在配合其他項目組做系統壓測,過程中出現了偶發的死鎖問題。分析代碼後發現有複合主鍵的update情況,更新複合主鍵表時只使用了一個字段更新,同時在事務內又有對該表的insert操作,結果出現了偶發的死鎖問題。 比如表t_lock_t

原创 細說 Netty 中的粘包和拆包

TCP/IP中的“粘包”與“拆包” “粘包拆包”是個僞命題 確實,我也認爲這是個僞命題,tcp這種雙工面向流的協議,本來就沒有粘拆包的說法,包的界限問題應該需要由上層的應用處理。 但爲什麼會有粘拆包問題呢? 應用程序寫入的數據大於套接字緩

原创 Java中的Heap Buffer與Direct Buffer

在使用Java NIO時,會經常和ByteBuffer打交道(吐槽下,每次手動flip切換讀寫模式太不友好)。在空Buffer創建時,有兩種方式: ByteBuffer.allocateDirect(capacity) ByteBuffer

原创 Java 中的那些IO

Linux IO結構 在開始之前,先介紹一下Linux的IO結構。 VFS(Virtual FileSystem) 虛擬文件系統 文件系統是內核的功能,是一種工作在內核空間的軟件,訪問一個文件必須要需要文件系統的存在纔可以。Linux 可以

原创 一篇文章帶你徹底搞懂NIO

本篇文章目的在於基本概念和原理的解釋,不會貼過多的使用代碼。 什麼是NIO Java NIO (New IO)是 Java 的另一個 IO API (來自 java1.4) ,意味着可以替代標準的 Java IO API和 Java Net

原创 Spring中常用的那些接口

Spring的核心就是Bean管理,關於Bean定義了很多可擴展性的接口,通過這些擴展接口可以實現很多功能。 比如動態創建bean,延遲動態創建bean,動態注入bean,動態修改bean等等。 下面介紹Spring中一些常用的接口: Be