Java 程序该怎么优化?(工具篇)
程序员:为什么程序总是那么慢?时间都花到哪里去了?
面试官:若你写的 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 程序该怎么优化?(工具篇)的更多相关文章
- java.awt包提供了基本的java程序的GUI设计工具
java.awt包提供了基本的java程序的GUI设计工具.主要包括下述三个概念: 组件--Component 容器--Container 布局管理器--LayoutManager package T ...
- Java程序员拥有这些工具,还怕干不出好活
老话说,工欲善其事,必先利其器. 那么,作为编程人员,你都用过哪些“兵器”呢?你的”兵器“够”锋利”吗? 近期,有很多新朋友问,都有什么画流程图的工具,给推荐推荐? 索性,就静下来,好好梳理一下,从事 ...
- Java 程序该怎么优化?(技巧篇)
搬砖者:为什么程序总是那么慢?它现在到底在干什么?时间都花到哪里去了? 面试官:简单谈谈 Java 程序性能优化? 1. 字符串处理优化,乃优化之源. 研发过程中,String 的 API 用的应该是 ...
- Java 程序该怎么优化?(实战篇)
面试官:出现了性能问题,该怎么去排查呢? 程序猿:接口响应那么慢,时间都花到哪里去了? 运维喵:为什么你的应用跑着跑着,CPU 就接近 100%? 分享一些真实生产问题排查故事,看看能否涨姿势,能否 ...
- Java 程序该怎么优化?(命令篇)
灵魂拷问,JDK 提供的命令,除了 java.javac,你还用过哪些命令呢? 灵魂再拷问,若你写的 Java 程序,出现了性能问题,该怎么去排查呢? Java 作为编程语言中的战斗机,JDK 默认已 ...
- JAVA程序员常用开发工具
1.JDK (Java Development Kit)Java开发工具集 SUN的Java不仅提了一个丰富的语言和运行环境,而且还提了一个免费的Java开发工具集(JDK).开发人员和最终用户可以利 ...
- java程序员的NodeJS初识篇
摘要 作为一个一直用java来写后端的程序员用NodeJS来写后台,实在不是很爽.这里记下这两个月的NodeJS学习所遇之坑,与java转NodeJS的同仁共勉.学习时间不长,若有理解错误,望指正. ...
- android 性能优化-工具篇
一.Traceview 使用TraceView主要有两种方式: 1.直接打开DDMS,选择一个进程,然后按上面的“Start Method Profiling”按钮,等红色小点变成黑色以后就表示Tra ...
- (转)Android性能优化——工具篇
Android性能优化是Android开发中经常遇见的一个问题,接下来将对Android性能优化方面的知识点做一个简单的梳理和总结,将从工具和代码两方面进行梳理.所谓工欲善其事必先利其器,本文首先来看 ...
随机推荐
- java线程间的共享
本次内容主要讲synchronized.volatile和ThreadLocal. 1.synchronized内置锁 线程开始运行,拥有自己的栈空间,就如同一个脚本一样,按照既定的代码一步一步地执行 ...
- windows上用putty从linux上下载文件
我之前使用putty都是直接从网上下的putty.exe,其实如果想下载windows的mis二进制文件,系统安装的话会包含,pscp.psftp.puttygen等一系列的文件. 今天下从服务器上, ...
- 添加bash命令
cd ~/.bash vim mya 键入 #!/bin/bash hostname -i :x 保存退出 source ~/.bash_profile 生效
- 由世界坐标系转换到摄像机坐标系的lookAt()函数
在学习图形学和opengl的时候,都涉及到坐标转化,从物体坐标转换为世界的坐标,从世界的坐标转换为摄像机的坐标. 在世界坐标到摄像机转换的过程中常用lookAt函数得到转化矩阵.GLM官方文档对它的解 ...
- element UI使用
1.Button按钮 <el-button type="text">文字按钮</el-button>设置type="text",可以是无 ...
- 视频 embed标签动态改变Src的值,局部刷新播放其他视频的javascript方法
看图: 视频处html代码: <div id="mod_player" class="mod_player"> <embed id=" ...
- Java多线程并发08——锁在Java中的应用
前两篇文章中,为各位带来了,锁的类型及锁在Java中的实现.接下来本文将为各位带来锁在Java中的应用相关知识.关注我的公众号「Java面典」了解更多 Java 相关知识点. 锁在Java中主要应用还 ...
- 杂谈 | 增量思维v.s.存量思维
无挂碍故,无有恐怖,远离颠倒梦想,究竟涅槃. ——<心经> 声明在前,本文并不是要论述“存量思维”是不好的, 而是整理某些场景下需要摒弃“存量思维”,或者提倡“增量思维”. 1 ...
- Ubuntu16.04安装QQ机器人
Ubuntu安装QQ机器人 看了看现在QQ机器人似乎只有酷Q机器人有Docker可以在linux上运行了 那就k开始装酷Q机器人,资源占用也不是很大,大概占用180M内存吧 安装酷Q HTTP 首先安 ...
- Java与C语言的区别——含面向对象介绍
很多初学编程的小伙伴或者想要学习编程的小白弄不清C语言和Java的区别.本文就针对萌新们尽量用通俗的语言来介绍一下我所理解的编程语言界的两大巨头. 为什么说是两巨头,介绍之前我们先看一下某度搜索出来的 ...