Linux命令行版VisualGC工具“GCisual”开发完成

这段时间搞了不少jvm调优,有的问题是gc的配置不合适,有的问题是代码导致程序内存泄露。

反正各种问题,排查的话都离不开java提供的工具,比如jmap,jstat这些。

而最近搞的这个系统是部署在windows上的,可以使用visualvm。

图形化界面用过之后表示是真的香,图形化后的确比数据行来得更直观,可以快速了解内存的使用情况。

比如下面就用数据行和图形化分别展示内存使用情况,可以明显感受到图形化更直观。

  • 使用jstat打印出来的内存使用率
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
1536.0 1536.0 0.0 704.0 24576.0 5032.8 88576.0 56515.9 46080.0 42645.0 7168.0 6144.0 113 0.351 5 0.321 0.672
1536.0 1536.0 0.0 704.0 24576.0 8387.6 88576.0 56515.9 46080.0 42645.0 7168.0 6144.0 113 0.351 5 0.321 0.672
1536.0 1536.0 0.0 704.0 24576.0 12681.2 88576.0 56515.9 46080.0 42645.0 7168.0 6144.0 113 0.351 5 0.321 0.672
1536.0 1536.0 0.0 704.0 24576.0 15474.5 88576.0 56515.9 46080.0 42645.0 7168.0 6144.0 113 0.351 5 0.321 0.672
1536.0 1536.0 0.0 704.0 24576.0 18762.2 88576.0 56515.9 46080.0 42645.0 7168.0 6144.0 113 0.351 5 0.321 0.672
1536.0 1536.0 0.0 704.0 24576.0 21843.5 88576.0 56515.9 46080.0 42645.0 7168.0 6144.0 113 0.351 5 0.321 0.672
1536.0 1536.0 768.4 0.0 24576.0 385.5 88576.0 56531.9 46080.0 42645.0 7168.0 6144.0 114 0.353 5 0.321 0.674
1536.0 1536.0 768.4 0.0 24576.0 3606.3 88576.0 56531.9 46080.0 42645.0 7168.0 6144.0 114 0.353 5 0.321 0.674
1536.0 1536.0 768.4 0.0 24576.0 6948.1 88576.0 56531.9 46080.0 42645.0 7168.0 6144.0 114 0.353 5 0.321 0.674
1536.0 1536.0 768.4 0.0 24576.0 9682.9 88576.0 56531.9 46080.0 42645.0 7168.0 6144.0 114 0.353 5 0.321 0.674
1536.0 1536.0 768.4 0.0 24576.0 13020.4 88576.0 56531.9 46080.0 42645.0 7168.0 6144.0 114 0.353 5 0.321 0.674
1536.0 1536.0 768.4 0.0 24576.0 16177.8 88576.0 56531.9 46080.0 42645.0 7168.0 6144.0 114 0.353 5 0.321 0.674
1536.0 1536.0 768.4 0.0 24576.0 19245.8 88576.0 56531.9 46080.0 42645.0 7168.0 6144.0 114 0.353 5 0.321 0.674
1536.0 1536.0 768.4 0.0 24576.0 22343.4 88576.0 56531.9 46080.0 42645.0 7168.0 6144.0 114 0.353 5 0.321 0.674
  • 使用 jvisualvm 图形化后的内存使用率(需要安装visualgc插件)
    (别比了,和上面的数据不是同一套,就算是也无法看的如图形这么直观)

图1 使用 jvisualvm 图形化后的内存使用率

那么,在linux命令行上也能拥有这种图形化的工具吗?

我上网找了,发现gc离线日志转为图形的工具到是有,有个叫做GCView的工具好像挺不错。

GCView图形化是静态的,而且由于gc日志的局限只能展示堆的情况,不能像visualgc那样细节,Eden,S0,S1这种分开展示。

emmmm,要是linux也能方便的用visualgc该多好啊,不仅能展示图形化,还能动态观察。

要不… 自己写个吧…

linux命令行上要能用,还要方便,那就用shell写吧!

方便一定要做到,远程连接这种即不方便还挺low(虽然解决问题才是高端,但是很多时候服务器并不支持jvisualvm远程连接)

数据来源的话使用jstat输出的日志,或者jsata导出的离线日志,那么程序还得支持管道…

4天后…

当当当!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
> jstat -gc 1 1000 | gcisual -s 1 -p B=Eden:6:5,B=S0:3:1,B=S1:4:2,B=Old:8:7,B=Perm:10:9,A=Eden:6:5,A=S0:3:1,A=S1:4:2
|||||||||||||||||||||||||||||||||||||||||||||||||||||||| | Eden: 20769.0 / 24576.0
| | S0: 0.0 / 1024.0
||||||||||||||||||||||||||||||||||||||||||||||||||||||| | S1: 852.6 / 1024.0
||||||||||||||||||||||||||||||||||| | Old: 56675.9 / 88576.0
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | Perm: 42645.4 / 46080.0
Eden
-----------*----------------------------------------------------------- 20769.0 / 24576.0
----------**--------------**-------------**-------------**-------------
--------****------------****-----------****-----------****-----------**
------******----------******---------******---------******----------***
----********--------********-------********-------********--------*****
---*********------**********------*********------*********------*******
-***********----************----***********---************----*********
************--**************--*************--*************--***********
S0
----------------------------------------------------------------------- 0.0 / 1024.0
-----------------------------------------------------------------------
--------------------------------------------***************------------
--------------------------------------------***************------------
-------------****************---------------***************------------
-------------****************---------------***************------------
-------------****************---------------***************------------
-------------****************---------------***************------------
S1
----------------------------------------------------------------------- 852.6 / 1024.0
-----------------------------------------------------------------------
-----------------------------------------------------------************
-----------------------------------------------------------************
-----------------------------***************---------------************
-************----------------***************---------------************
-************----------------***************---------------************
-************----------------***************---------------************

看起来还不错哈,工具本意是为了解决内存可视化问题,就从GC和Visual各取一丢丢出来拼成“GCisual”吧!

那它就叫GCisual吧!(鸡色笑,哈哈哈)

GCisual底层实际是实现了一个图形化引擎(引擎听起来高大上,就这样叫吧)。

除了柱状图、折线图、面积图外(上图展示了柱状图和面积图),还可以自定义实现其他的图形,只要按照接口说明编写就好了。

另外,GCisual可不止用于jstat日志哦,其他符合要求的数据集都可以图形化进行动态展示。

详细可以去GCisual的github页面:https://github.com/Strangeen/GCisual