1. 程式人生 > >編譯VisualVM源碼解決亂碼問題

編譯VisualVM源碼解決亂碼問題

並運行 不成功 通過 ant visual ont 2個 ola ide

編譯VisualVM源碼解決亂碼問題

起因

今天在使用VisualVM對測試服務器進行JVM監控的時候,發現所有統計圖的橫縱坐標都是顯示亂碼(小方塊),即使我的Ubuntu系統使用的是英文語言環境.奇怪的是整個VisualVM軟件的其他地方都是顯示正常的,不知道是什麽原因.
之前在Windows 7時是沒有這個問題的,最近剛剛切換系統為Ubuntu 18.04才遇到這個問題.Google了很久似乎別人都沒遇到過這個問題.
因為VisualVM是支持多語言的,於是我猜測是VisualVM的在讀取國際化文件時出錯了,導致對應的數據在格式化顯示時除了問題.
帶著這個思路,於是想看一下VisualVM的源代碼實現.

技術分享圖片

過程

1.找到VisualVM的源代碼:https://github.com/oracle/visualvm
2.定位代碼位置,印象中我有一次看到過別人分析VisualVM計算CPU和GC百分比的代碼,於是憑著感覺定位到了具體的Java文件:
https://github.com/oracle/visualvm/blob/master/visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/ApplicationMonitorView.java
278行:class CpuViewSupport,其中有個refresh()方法就是用於計算CPU百分比的.

按圖索驥,追蹤到代碼:https://github.com/oracle/visualvm/blob/master/visualvm/charts/src/org/graalvm/visualvm/charts/xy/SimpleXYChartUtils.java
經過反復調試輸出和思考,我認為既然統計圖的其他地方都是正常的,說明不是國際化的問題.由於VisualVM的統計圖完全是通過Swing繪制的,因此問題應該出在字體上.按照這個思路經過反復運行調試終於找到問題所在.
https://github.com/oracle/visualvm/blob/master/visualvm/charts/src/org/graalvm/visualvm/charts/xy/SimpleXYChartUtils.java

該類中存在如下2個方法:

public static Font smallerFont(Font font) {
    return new Font(font.getName(), font.getStyle(), font.getSize() - 2);
}
public static Font boldFont(Font font) {
    return new Font(font.getName(), Font.BOLD, font.getSize());
}

調試輸出發現,這2個方法的參數font值為
:java.awt.Font[family=Source Code Pro,name=Source Code Pro,style=plain,size=11]

這時我想起之前出現過在IDEA中設置字體為"Source Code Pro"總是設置不成功,這更加讓我確定導致VisualVM統計圖亂碼的問題一定在這裏,修改為:

public static Font smallerFont(Font font) {
    //return new Font(font.getName(), font.getStyle(), font.getSize() - 2);
    return new Font("Inconsolata Medium", font.getStyle(), font.getSize() - 2);
}

public static Font boldFont(Font font) {
    //return new Font(font.getName(), Font.BOLD, font.getSize());
    return new Font("Inconsolata Medium", Font.BOLD, font.getSize());
}

其中,確保字體"Inconsolata Medium"在系統中存在.
使用確保已經存在的字體替換後,重新編譯運行,顯示正常.
技術分享圖片

3.編譯和運行VisualVM
在開始編譯和運行VisualVM源碼之前,需要先安裝ant: https://ant.apache.org/
參照 https://github.com/oracle/visualvm 中的描述步驟即可編譯並運行VisualVM.

結論

1.借助如下幾個chrome插件,對於查看github源碼非常有幫助:
octotree https://github.com/ovity/octotree
Sourcegraph https://chrome.google.com/webstore/detail/sourcegraph/dgjhfomjieaadpoljlnidmbgkdffpack
2.其實,當我確認是字體原因導致之後,安裝主題工具:gnome-tweak-tools(sudo apt-get install gnome-tweak-tool)重新設置系統字體即可解決該問題,根本不用修改源代碼.只不過這也是一種解決問題的思路,更加深了對VisualVM原理的理解,也不是什麽壞事.
技術分享圖片

[參考]
http://elvis4139.iteye.com/blog/2273322 手動編譯VisualVM源碼
https://visualvm.github.io/

編譯VisualVM源碼解決亂碼問題