程序员:为什么程序总是那么慢?时间都花到哪里去了?

面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢?

工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直奔主题。

1. hprof 工具

hprof 工具是通过织入监控代码,来对 Java 程序进行监控的一款工具。可以监控 Java 程序在运行时占用的 CPU,及统计堆内存使用等。

例如:每隔 10 毫秒采样 CPU 消耗信息,并把信息保存到 hprof.txt 文件中。

java -agentlib:hprof=cpu=times,interval=10,file=hprof.txt class

  

指令运行完,打开 hprof.txt 便很容易统计出哪些方法的运行耗时较长。

例如:输出 Java 应用程序中各个类所占用的内存百分比。

java -agentlib:hprof=heap=sites,file=hprof.txt class
备注:若未指定 file=hprof.txt,则默认会生成 java.hprof.txt 文件

  

打开输出的文件,效果如下。

例如:将 Java 应用程序的堆快照保存在文件 core.hprof 中,然后就可以使用 VisualVM 等工具来分析这个堆文件啦。

java -agentlib:hprof=heap=dump,format=b,file=core.hprof class

  

采用 VisualVM 工具打开 core.hprof 文件进行分析堆快照,效果如下。

2. JConsole 工具

JConsole 是 Java 自带的图形化性能监控工具,可以让你摆脱命令行排查问题的痛苦。通过它,会非常容易的监测 Java 程序的运行情况。

2.1. 连接要监控的 Java 程序

首先进入 JDK 安装之后的 bin 目录,若是配置过 Java 的环境变量,直接运行 JConsole 就行,效果如下。

若是要监控本地 Java 进程,直接选择列表中的名称进行连接即可。

若是要监控远程 Java 进程,需要在远程 Java 程序启动时,需要加上下面几句话。

# 远程服务器的ip地址
-Djava.rmi.server.hostname=127.0.0.1
# 指定jmx监听的端口
-Dcom.sun.management.jmxremote.port=8099
# 指定jmx监听的端口
-Dcom.sun.management.jmxremote.rmi.port=8099
# 是否开启ssl
-Dcom.sun.management.jmxremote.ssl=false
# 是否开启认证
-Dcom.sun.management.jmxremote.authenticate=false

  

若是在 IDEA 开发工具中进行验证,按照下图进行配置,跑程序就行。

若是命令行启动时,按照下述方式配置,启动就行。

java -cp . -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=8099 -Dcom.sun.management.jmxremote.rmi.port=8099  -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false className

  

启动远程 Java 程序,JConsole 输入远程服务 IP 和 端口,连接即可。

2.2. 监控 Java 程序概况

如图所示,JConosle 连接上要监控的 Java 程序后,可以很方便的查看堆内存使用量、线程数量、加载类的数量以及 CPU 的占用率。

2.3. 内存监控

如图所示,在 JConsole 提供的内存监控页面,不仅能看到堆内存的使用情况,而且能查看非堆区的内存使用情况等等。另外,还提供了让 Java 应用强制进行一次 GC 的功能。

2.4. 线程监控

如图所示,通过 JConsole 提供的线程页面,可以方便查看系统内的线程数量,以及程序中所有的线程,并且还能看到线程的栈信息。另外,该页面还提供了检测死锁的支持,那么就可以快速的帮我们定位死锁的问题啦。

2.5. 类加载情况

如图所示,JConsole 还能够显示类加载情况,包括已经装载的类数量,以及已经卸载的类数量。

2.6. VM 摘要

如图所示,JConsole 提供的 VM 概要页面,能够显示当前 Java 应用程序的基本信息,包括运行环境、系统线程信息、堆信息等等。

2.7. MBean 管理

通过 JConsole 提供的 MBean 页面,我们可以对应用中的 MBean 进行统一管理,鉴于之前在剖析 Resin 服务器源码的时候,我们多次用到过,本次不再铺开去说。

3. VisualVM 工具

Visual VM 是可以替代 jstat、jmap、jhat、jstack 命令的一款故障诊断和性能监控的可视化工具,甚至可以替代 JConsole,所以我们还是有必要进行了解一下。

3.1 连接要监控的 Java 程序

首先进入 JDK 安装的 bin 目录,运行 jvisualvm,启动起来后和 JConsole 一样,可以选择本地和远程进行连接,效果如下。

本次着重介绍一下这款工具能干啥,如何连接 Java 程序就不带着一起做实验啦,不过已把操作步骤帮你梳理好了,照着做就行啦。

3.2 概述

如图所示,通过 VisualVM 提供的概述功能页,可以很方便的查看 Java 程序的进程 ID、JVM 参数、系统属性等等信息。

3.3 监视

这块和 JConsole 很像,VisualVM 将 CPU 使用情况、堆使用情况、类加载信息以及线程都做了图形界面展示,可以很直观的进行监测。

3.4 线程监控

VisualVM 可以展示详细的线程信息,让线程信息一览无余,并且会自动进行死锁检测,如果在当前程序中找到死锁,则会提示“检测到死锁”。另外,通过线程 Dump可以导出当前所有线程的堆栈信息。

3.5 抽样器

Visual VM 提供 CPU 和内存两个抽样器。通过 CPU 抽样器,可以帮助我们快速找到程序中占用 CPU 时间最长的方法;通过内存抽样器,可以帮助我们查看当前程序的堆信息。

CPU抽样器效果图:

内存抽样器效果图:

3.6 Profiler

Profiler 的功能和抽样器其实差不多,只不过抽样器是抽样进行检测,而 Profiler 是全面进行检测。

点击 CPU 按钮,效果如上图所示,则开启一个 CPU 性能分析会话,等 VisualVM 收集和统计完相关性能数据信息,将会显示在性能分析结果。

若点击内存按钮,则开启一个内存分析会话,等 VisualVM 收集和统计完相关性能数据信息,将会显示在性能分析结果,效果如上图所示。

3.7 快照

VisualVM 很多地方,都提供了快照功能,可以让我们保存某一个时刻应用程序的堆信息、线程堆栈等等保存成快照,以便性能优化后进行对比、分析使用。

3.8 插件

VisualVM 还可以通过安装插件,来实现更多可能性。

4. 最后

程序员编码那是本能,但是若能更好的解决生产问题,则会彰显个人才能。

工具一箩筐,你也别嫌多,因为总有一款适合你。但是工具说再多,若不进行实践,一切皆枉然,纸上得来终觉浅,只有实践才是硬道理!

有关 Java 性能分析工具,本次就分享就到这里,希望大家能够喜欢,下次我们将结合案例进行实践,敬请期待。

参考资料:《Java 程序性能优化》

 

Java 程序该怎么优化?(工具篇)的更多相关文章

  1. java.awt包提供了基本的java程序的GUI设计工具

    java.awt包提供了基本的java程序的GUI设计工具.主要包括下述三个概念: 组件--Component 容器--Container 布局管理器--LayoutManager package T ...

  2. Java程序员拥有这些工具,还怕干不出好活

    老话说,工欲善其事,必先利其器. 那么,作为编程人员,你都用过哪些“兵器”呢?你的”兵器“够”锋利”吗? 近期,有很多新朋友问,都有什么画流程图的工具,给推荐推荐? 索性,就静下来,好好梳理一下,从事 ...

  3. Java 程序该怎么优化?(技巧篇)

    搬砖者:为什么程序总是那么慢?它现在到底在干什么?时间都花到哪里去了? 面试官:简单谈谈 Java 程序性能优化? 1. 字符串处理优化,乃优化之源. 研发过程中,String 的 API 用的应该是 ...

  4. Java 程序该怎么优化?(实战篇)

    面试官:出现了性能问题,该怎么去排查呢? 程序猿:接口响应那么慢,时间都花到哪里去了? 运维喵:为什么你的应用跑着跑着,CPU 就接近 100%? 分享一些真实生产问题排查故事,看看能否涨姿势,能否 ...

  5. Java 程序该怎么优化?(命令篇)

    灵魂拷问,JDK 提供的命令,除了 java.javac,你还用过哪些命令呢? 灵魂再拷问,若你写的 Java 程序,出现了性能问题,该怎么去排查呢? Java 作为编程语言中的战斗机,JDK 默认已 ...

  6. JAVA程序员常用开发工具

    1.JDK (Java Development Kit)Java开发工具集 SUN的Java不仅提了一个丰富的语言和运行环境,而且还提了一个免费的Java开发工具集(JDK).开发人员和最终用户可以利 ...

  7. java程序员的NodeJS初识篇

    摘要 作为一个一直用java来写后端的程序员用NodeJS来写后台,实在不是很爽.这里记下这两个月的NodeJS学习所遇之坑,与java转NodeJS的同仁共勉.学习时间不长,若有理解错误,望指正. ...

  8. android 性能优化-工具篇

    一.Traceview 使用TraceView主要有两种方式: 1.直接打开DDMS,选择一个进程,然后按上面的“Start Method Profiling”按钮,等红色小点变成黑色以后就表示Tra ...

  9. (转)Android性能优化——工具篇

    Android性能优化是Android开发中经常遇见的一个问题,接下来将对Android性能优化方面的知识点做一个简单的梳理和总结,将从工具和代码两方面进行梳理.所谓工欲善其事必先利其器,本文首先来看 ...

随机推荐

  1. JavaScript的类数组

    类数组对象啊,被人问到它跟真正的数组对象有什么差别啊?说不上来就老埋汰了,只知道函数的arguments对象是个类数组对象,也有length属性,其他呢?干货奉上: 首先先说说数组吧: 1,当有新的元 ...

  2. 如何在Flutter中使用flutter_markdown

    很多博客,论坛都支持markdown语法,flutter也有支持markdown语法的插件flutter_markdown 安装依赖 dependencies: flutter: sdk: flutt ...

  3. mysql数据库远程访问设置方法

    1. 修改方式1代码改表法.  可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库 ...

  4. Redis使用指南

    原文链接 能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 设置过期时间.释放资源 使用Redis做K-V存储,一定要注意过期时间的把控,任何K- ...

  5. JVM05——JVM类加载机制知多少

    我们已经讲过 JVM 相关的很多常见知识点,感兴趣的朋友可以在我的往期文章中查看.接下来将继续为各位带来 JVM 类加载机制.关注我的公众号「Java面典」了解更多 Java 相关知识点. 类生命周期 ...

  6. 问题描述:判断一个整数 n 是否为 2 的幂次方

    一.2的幂次方的基本定义 什么样的数为2的幂次方?例如2^0=1,2^1=2,2^2=4……,符合公式2^n(n>=0)的数称为2的幂次方. 如何判断一个数是否为2的幂次方呢?基本思路:把一个数 ...

  7. ubuntu下使用apt-get install安装软件的安装位置

    在ubuntu下使用 apt-get install 或 apt install 下载安装软件,软件下载及安装后的目录.: A.下载的软件的存放位置:/var/cache/apt/archives B ...

  8. 03-Vue数据请求

    1. vue-resource vue-resource jsonp请求 <body> <div id="app"> <!-- v-model 监听表 ...

  9. Python3 + requests + unittest接口测试

    一.缘 起 笔者最近完成了基于Python3 + requests + unittest的接口测试脚本,故在此做一下记录,于己为复盘,于彼为学习和参考 二.思 路 接口测试无非三步: 首先,造数据 - ...

  10. C#winform如何主窗口最大化最小化默认大小

    this.WindowState = FormWindowState.Minimized; bool b = true; private void button2_Click(object sende ...