Ⅰ 有哪些it程序員的必備神器
URL Decoder/Encoder:https://meyerweb.com/eric/tools/dencoder/ 特別實用的一個用來處理URL編碼和解碼的小工具,你甚至可以直接將這個頁面的源代碼保存下來,這樣不需要連接上網也可以離線使用。附送的一個隱藏功能就是當你從任何地方拷貝信息過來的時候,它會自動去除拷貝過來的格式化信息,小編自己基本上每天都會使用這個小工具復制粘貼各種信息。
iTerm2是一款完全免費的開源軟體,可以完全替代MacOS的終端。iTerms功能強大,使用方便,可以讓你輕松且高效地管理和定製化你的工作流程。iTerm2的一些特色功能包括:標簽變色,智能選中,自動補齊,全屏展示所有的 tab並支持搜索(Exposé Tabs),豐富的快捷操作等。
Textpad這款工具具有無限制的撤銷/重做功能,並且能夠編輯超大文件,文件上限是系統虛擬內存大小。
Octotree:https://www.octotree.io/Github是目前使用最廣泛的版本控制工具,然而通過瀏覽器訪問Github的體驗並不是那麼友好,特別是當我們需要不斷地訪問不同文件夾裡面的文件的時候。Octotree正是這樣一款瀏覽器插件,它提供了類似IDE的便於訪問的代碼目錄樹,能夠提高我們在Github上工作效率。
Wireshark:這個工具可以用來監控機器上的TCP、HTTP等各層級的網路通信。作為後端開發,如果想看前端發來的請求到底都包含了哪些信息,又沒有前端的調試環境的話,使用Wireshark監控HTTP請求是很好的解決方案。自己在程序中發HTTP請求時,也可以使用它來檢查發出的HTTP請求是否符合自己的預期。
Mermaid:這個工具可以使用腳本語言直接渲染出流程圖、時序圖、甘特圖,寫文檔簡單快捷。免拖拽,免排版,格式控制統一。腳本也便於存放修改,樣式可以復用。還可以使用插件集成如Markdown編輯器,進行實時預覽。
spectacle:Mac free source 窗口控制工具,拖拽窗口到屏幕邊緣resize,也可以自定義快捷鍵。用起來跟Windows上面一樣。相比較於Moom,SizeUp,Divvy,spectacle支持滑鼠拖拽到邊緣resize,非常便利。
Tmux:一個虛擬終端可以管理多個會話,窗口和面板。執行 tmux 命令時就開啟了一個服務並創建了一個會話,窗口和面板。支持分屏,同時處理多個操作。不受斷網影響,避免丟失重要工作進度。方便演示與協作,支持結對編程。
Caniuse:https://caniuse.com/#home 通過這個網站,用戶能夠查詢主流瀏覽器特定版本對HTML,CSS和JS的支持情況。並且最重要的是它「免費」!
Visual Studio Code:這是微軟出品的IDE工具,跨平台(Linux,Mac,Windows)。輕量級內存佔用,品質穩定且免費。同時內置Git版本控制功能。值得一提的是插件生態豐富,安裝插件簡單,通過插件可以增加更豐富的語言支持、主題定製、文本自動格式化等能力。
Ⅱ arthas常用命令
執行成功後, arthas提供了一種命令行方式的交互方式, arthas會檢測當前伺服器上的Javai程,並將進程列表展示出來,用戶輸入對應的編號(1.2.3.4.)進行選擇,然後回車。
方式1:
方式2:運行時選擇Java進程PID
quit
通過圖中的thread區域可以看出當前佔用cpu最高的兩個是jvm內部線程
Java 8之後支持獲取JVM內部線程CPU時間,這些線程只有名稱和CPU時間,沒有ID及狀態等信息(顯示ID為-1)。 通過內部線程可以觀測到JVM活動,如GC、JIT編譯等佔用CPU情況,方便了解JVM整體運行狀況。
JVM內部線程包括下面幾種:
注意:線程棧為第二采樣結束時獲取,不能表明采樣間隔時間內該線程都是在處理相同的任務。建議間隔時間不要太長,可能間隔時間越大越不準確。 可以根據具體情況嘗試指定不同的間隔時間,觀察輸出結果。
默認按照CPU增量時間降序排列,只顯示第一頁數據,默認按照CPU增量時間降序排列。
顯示所有匹配線程信息,有時需要獲取全部JVM的線程數據進行分析。
thread -b, 找出當前阻塞其他線程的線程
找到阻塞其他線程的線程,即當前佔用鎖的線程
注意, 目前只支持找出synchronized關鍵字阻塞住的線程, 如果是 java.util.concurrent.Lock , 目前還不支持。
thread -i 1000 : 統計最近1000ms內的線程CPU時間。
thread -n 3 -i 1000 : 列出1000ms內最忙的3個線程棧
「Search-Class」 的簡寫,這個命令能搜索出所有已經載入到 JVM 中的 Class 信息,這個命令支持的參數有 [d] 、 [E] 、 [f] 和 [x:] 。
「Search-Method」 的簡寫,這個命令能搜索出所有已經載入了 Class 信息的方法信息。
sm 命令只能看到由當前類所聲明 (declaring) 的方法,父類則無法看到。
sc看類信息,sm可以看類的方法信息,兩者正好可以結合者來看。
java -jar arthas-boot.jar --tunnel-server ws://172.16.12.95:7777/ws
help 查看命令幫助信息
cls 清空當前屏幕區域
session 查看當前會話的信息
reset 重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類
version 輸出當前目標 Java 進程所載入的 Arthas 版本號
history 列印命令歷史
quit 退出當前 Arthas 客戶端,其他 Arthas 客戶端不受影響
stop 關閉 Arthas 服務端,所有 Arthas 客戶端全部退出
keymap Arthas快捷鍵列表及自定義快捷鍵
dashboard 當前系統的實時數據面板
thread 查看當前 JVM 的線程堆棧信息
watch 方法執行數據觀測
trace 方法內部調用路徑,並輸出方法路徑上的每個節點上耗時
stack 輸出當前方法被調用的調用路徑
tt 方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,並能對這些不同的時間下調用進行觀測
monitor 方法執行監控
jvm 查看當前 JVM 信息
vmoption 查看,更新 JVM 診斷相關的參數
sc 查看 JVM 已載入的類信息
sm 查看已載入類的方法信息
jad 反編譯指定已載入類的源碼
classloader 查看 classloader 的繼承樹,urls,類載入信息
heapmp 類似 jmap 命令的 heap mp 功能
Ⅲ 內存泄露&arthas
導出超過20W條數據到excel。
默認使用poi提供方法XssfWorkBook進行寫入Excel。
分頁查詢數據,每次查詢完之後,寫入到Excel。
在寫入數據10W+的時候,用時2分鍾左右;
但10W+之後,速度開始慢了下,導出20W數據大約需要30分鍾左右;多次導出之後,出現內存溢出問題。
懷疑sql查詢太慢,超過10W條數據可能出現了深度翻頁的問題。
但是通過增加日誌,列印執行時間,發現用時並沒有太久(同時,sql查詢也有超時時間,超過5s左右會終止查詢,拋出異常,而這種情況並沒有出現)。
懷疑可能是Excel文件太大了,後面寫入會增加時間,導致速度慢下來了。但是通過增加列印日誌,發現耗時基本是可以忽略的。
在導出過程中,頁面進行其他操作,介面出現超時。懷疑是jvm在做full gc,出現了「Stop The World」情況。
通過arthas 監控內存,以及通過jmap -histo 命令觀察gc情況,發現事實是這樣,執行full gc的次數很頻繁,而且每次執行完full gc之後,堆內存的情況並沒有很明顯的減少,導致出現了頻發full gc的情況。
通過jmap -heap 命令查看內存分布情況,發現排名靠前的對象有類似dom4j的東西,所以懷疑是寫入Excel導致內存泄露。
解決方法:SXssfWorkBook替換XssfWorkBook。問題解決。
- arthas
- jmap -histo [pid] [interval]
- jmap -heap >> test.txt
在線上環境,偶爾會收到報警調用ES超時;
一般情況下都是ES所在的機器jvm發生full gc;
導致full gc的原因:某個商家做活動,一段時間內湧入了大量的流量,導致ES內存增長很快,所以產生了full gc。在full gc的時間段內,對外基本不提供服務,介面超時。
當前系統的實時數據面板
線程信息(部分)、內存、GC次數、GC時間、基本信息
顯示線程信息
thread -n 指定最忙的前N個線程並列印堆棧
jvm的配置信息
列印類的詳細信息
列印類中詳細信息以及變數信息
查看已載入類的方法信息
查看方法的詳細信息
非實時返回
-c :統計周期,默認為120秒
timestamp 時間戳
class java類
mehtod 方法(構造方法、普通方法)
total 調用次數
success 成功次數
fail 失敗次數
rt 平均rt
fail-rate 失敗率
monitor class-pattern method pattern
方法內部調用路徑,並輸出方法路徑上的每個節點的耗時
trace class-pattern method-pattern -n #cost
trace *StringUtils isBlacnk '$cost>100'
查看某個方法的調用路徑-堆棧信息
grovy 表達式
watch com.example.demo.arthas.ArthasInnerService test2 "{params.length,params[0],returnObj.age}" returnObj.books.size()>4