编译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源码解决乱码问题的更多相关文章

  1. Ubuntu编译Android源码过程中的空间不足解决方法

    Android源码一般几十G,就拿Android5.0来说,下载下来大概也有44G左右,和编译产生的文件以及Ubuntu系统占用的空间加起来,源码双倍的空间都不够有.编译源码前能分配足够的空间再好不过 ...

  2. ant编译solr源码生成eclipse项目,解决一直resolve,一直[ivy:retrieve]的问题

    这两天在学习solr,结果刚到编译solr源码就卡住了,足足卡了两天,网上找各种解决办法都是简单带过,说是缺少jar包,下载下来放到对应位置就好了....对应位置???咋不说这个问题用相应方法解决即可 ...

  3. Tomcat源码分析一:编译Tomcat源码

    Tomcat源码分析一:编译Tomcat源码 1 内容介绍 在之前的<Servlet与Tomcat运行示例>一文中,给大家带来如何在Tomcat中部署Servlet应用的相关步骤,本文将就 ...

  4. 【JDK命令行 一】手动编译Java源码与执行字节码命令合集(含外部依赖引用)

    写作目标 记录常见的使用javac手动编译Java源码和java手动执行字节码的命令,一方面用于应对 Maven 和 Gradle 暂时无法使用的情况,临时生成class文件(使用自己的jar包):另 ...

  5. (转载)Linux如何编译安装源码包软件

    一.什么是源码包软件: 顾名思义,源码包就是源代码的可见的软件包,基于Linux和BSD系统的软件最常见:在国内源可见的软件几乎绝迹:大多开源软件都是国外出品:在国内较为出名的开源软件有fcitx;l ...

  6. Spring IoC源码解决——工具篇Eclipse

    题外话 对于Spring框架,平时都是点到为止,停留在会用的程度.一直以来都想深入学习下,刚好最近看到<Spring源码深度解析>,所以想随着书本深入学习一下. 如果用Maven 如果使用 ...

  7. [原]在win上编译 subversion 源码实践Tonyfield的专栏

    (百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...

  8. 在Mac mini上编译Android源码

    参考文章 1.Android 6.0 源代码编译实践 2.编译Android源码致命错误解决方案 实践过程 1.Mac下安装Ubuntu双系统 (1)Ubuntu版本:Ubuntu 15.10 注:实 ...

  9. [原]编译Android源码过程中遇到的问题

    编译Android源码的过程参考Android官网介绍: 1.下载Android源码的步骤:https://source.android.com/source/downloading.html 2.编 ...

随机推荐

  1. 我喜欢的vs code快捷键for mac

    mac上的快捷键,尽量是像我用vs studio上靠近. cmd+K+S: 显示快捷键列 cmd+shift+p: 系统配置命令行 cmd+p:项目中文件列表,选择文件 cmd+shift+o:当前文 ...

  2. 解析SQL Server之任务调度

    在前面两篇文章中( 浅谈SQL Server内部运行机制 and 浅谈SQL Server数据内部表现形式 ),我们交流了一些关于SQL Server的一些术语,SQL Sever引擎 与SSMS抽象 ...

  3. springboot整合shiro应用

    1.Shiro是Apache下的一个开源项目,我们称之为Apache Shiro.它是一个很易用与Java项目的的安全框架,提供了认证.授权.加密.会话管理,与spring Security 一样都是 ...

  4. Ubuntu16.04安装和配置RabbitMQ

    1.RabbitMQ安装前需要erlang环境 apt-get install erlang-nox # 安装erlang erl # 查看relang语言版本,成功执行则说明relang安装成功 2 ...

  5. Effective C++ 第0章 copy constructor和copy assignment operator

    拷贝构造函数(copy constructor)被用来以一个对象来初始化同类型的另一个对象,拷贝赋值运算符(copy assignment operator)被用来将一个对象中的值拷贝到同类型的另一个 ...

  6. Spring第一天——入门与IOC

    大致内容 spring基本概念 IOC入门 [17.6.9更新],如何学习spring? 掌握用法 深入理解 不断实践 反复总结 再次深入理解与实践 一.Spring相关概念  1.概述: Sprin ...

  7. matlab转C语言

    1.软件版本  matlab R2018a 2.步骤 (1).编写特定功能的matlab代码,以及其测试文件 (2).检查matlab代码的兼容性,确保matlab代码都能转换成C/C++代码(并不是 ...

  8. 小A的柱状图

    链接 [https://ac.nowcoder.com/acm/contest/549/H] 题意 [] 分析 很显然你必须找到该高度下往左右找到第一个高度比该位置小的.这个区间的宽*该高度.就当前能 ...

  9. pycharm中运行时添加配置 及pytest模式怎么修改为run模式

    会发现不是控制台输出,而是pytest模式. 修改: 当运行时,发现无法运行: 然后点击Add Configuration, 点击加号,点击Python: 选择脚本路径和解释器.点击OK即可.

  10. NodeJs之文件上传

    NodeJs之文件上传 一,介绍与需求 1.1,介绍 1,multer模块 multer用于处理文件上传的nodejs中间件,主要跟express框架搭配使用,只支持表单MIME编码为multipar ...