zoukankan      html  css  js  c++  java
  • 5招教你把握Java性能监控(转自51testing)

    很多开发者觉得自己懂Java编程,事实是大多数开发人员都只领会到了Java平台的皮毛,所学也只够应付工作。作者将深度挖掘Java平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程困难。

      当应用程序性能受到损害时,大多数开发人员都惊慌失措,这在情理之中。跟踪Java应用程序瓶颈来源一直以来都是很麻烦的,因为Java虚拟机有黑盒效应,而且Java平台分析工具一贯就有缺陷。

      然而,随着Java5中JConsole的引入,一切都发生了改变。JConsole是一个内置Java性能分析器,可以从命令行或在GUIshell中运行。它不是完美的,但是当尖头老板来问你关于性能的问题时,用它来应对还是绰绰有余的——这比查询PapaGoogle要好得多。

      我们将向您展示5个方法,使您可以轻松地使用JConsole(或者,它更高端的“近亲”VisualVM)来监控Java应用程序性能和跟踪Java中的代码。

    1.JDK附带分析器

      许多开发人员没有意识到从Java 5开始JDK中包含了一个分析器。JConsole(或者Java平台最新版本,VisualVM)是一个内置分析器,它同Java编译器一样容易启动。如果是从命令行启动,使JDK在PATH上,运行jconsole即可。如果从GUIshell启动,找到JDK安装路径,打开bin文件夹,双击jconsole。

      当分析工具弹出时(取决于正在运行的Java版本以及正在运行的Java程序数量),可能会出现一个对话框,要求输入一个进程的URL来连接,也可能列出许多不同的本地Java进程(有时包含JConsole进程本身)来连接。

      使用JConsole进行工作

      在Java 5中,Java进程并不是被设置为默认分析的,而是通过一个命令行参数—-Dcom.sun.management.jmxremote——在启动时告诉Java 5 VM打开连接,以便分析器可以找到它们;当进程被JConsole捡起时,您只能双击它开始分析。

      分析器有自己的开销,因此最好的办法就是花点时间来弄清是什么开销。发现JConsole开销最简单的办法是,首先独自运行一个应用程序,然后在分析器下运行,并测量差异。(应用程序不能太大或者太小;我最喜欢使用JDK附带的SwingSet2样本。)因此,我使用-verbose:gc尝试运行SwingSet2来查看垃圾收集清理,然后运行同一个应用程序并将JConsole分析器连接到它。当JConsole连接好了之后,一个稳定的GC清理流出现,否则不会出现。这就是分析器的性能开销。

      JConsole或VisualVM?

      JConsole从Java 5开始就随着Java平台版本一起发布,而VisualVM是在NetBeans基础上升级的一个分析器,在Java 6的更新版12中第一次发布。多数还没有更新到Java 6,因此这篇文章主要介绍JConsole。然而,多数技巧和这两个分析器都有关。

    2.远程连接进程

      因为Web应用程序分析工具假设通过一个套接字进行连通性分析,您只需要进行少许配置来设置JConsole(或者是基于JVMTI的分析器,就这点而言),监控/分析远程运行的应用程序。

      如果Tomcat运行在一个名为“webserve”的机器上,且JVM已经启动了JMX并监听端口9004,从JConsole(或者任何JMX客户端)连接它需要一个JMX URL“service:jmx:rmi:///jndi/rmi://webserver:9004/jmxrmi”。

      基本上,要分析一个运行在远程数据中心的应用程序服务器,您所需要的仅仅是一个JMX URL。

    3.跟踪统计

      JConsole有许多对收集统计数据有用的选项卡,包括:

      ◆Memory:在JVM垃圾收集器中针对各个堆跟踪活动。

      ◆Threads:在目标JVM中检查当前线程活动。

      ◆Classes:观察VM已加载类的总数。

      这些选项卡(和相关的图表)都是由每个Java 5及更高版本VM在JMX服务器上注册的JMX对象提供的,是内置到JVM的。一个给定JVM中可用bean的完整清单在MBeans选项卡上列出,包括一些元数据和一个有限的用户界面来查看数据或执行操作。(然而,注册通知是在JConsole用户界面之外。)

      使用统计数据

      假设一个Tomcat进程死于OutOfMemoryError。如果您想要弄清楚发生了什么,打开JConsole,单击Classes选项卡,过一段时间查看一次类计数。如果数量稳定上升,您可以假设应用程序服务器或者您的代码某个地方有一个ClassLoader漏洞,不久之后将耗尽PermGen空间。如果需要更进一步的确认问题,请看Memory选项卡。

      不要成为典型

      发现应用程序代码中性能问题的常用响应多种多样,但也是可预测的。早期的Java编程人员对旧的IDE可能十分生气,并开始进行代码库中主要部分的代码复查,在源代码中寻找熟悉的“红色标志”,像异步块、对象配额等等。随着编程经验的增加,开发人员可能会仔细研究JVM支持的-X标志,寻找优化垃圾收集器的方法。当然,对于新手,直接去Google查询,希望有其他人发现了JVM的神奇的“make it go fast”转换,避免重写代码。

      从本质上来说,这些方法没什么错,但都是有风险的。对于一个性能问题最有效的响应就是使用一个分析器——现在它们内置在Java平台,我们确实没有理由不这样做!

      4.为离线分析创建一个堆转储

      生产环境中一切都在快速地进行着,您可能没有时间花费在您的应用程序分析器上,相反地,您可以为Java环境中的每个事件照一个快照保存下来过后再看。在JConsole中您也可以这样做,在VisualVM中甚至会做得更好。

      先找到MBeans选项卡,在其中打开com.sun.management节点,接着是HotSpotDiagnostic节点。现在,选择Operations,注意右边面板中的“dumpHeap”按钮。如果您在第一个(“字符串”)输入框中向dumpHeap传递一个文件名来转储,它将为整个JVM堆照一个快照,并将其转储到那个文件。

      稍后,您可以使用各种不同的商业分析器来分析文件,或者使用VisualVM分析快照。(记住,VisualVM是在Java 6中可用的,且是单独下载的。)

      5.JConsole并不是高深莫测的

      作为一个分析器实用工具,JConsole是极好的,但是还有更好的工具。一些分析插件附带分析器或者灵巧的用户界面,默认情况下比JConsole跟踪更多的数据。

      JConsole真正吸引人的是整个程序是用“普通旧式Java”编写的,这意味着任何Java开发人员都可以编写这样一个实用工具。事实上,JDK其中甚至包括如何通过创建一个插件来定制JConsole的示例。建立在NetBeans顶部的VisualVM进一步延伸了插件概念。

      如果JConsole(或者VisualVM,或者其他任何工具)不符合您的需求,或者不能跟踪您想要跟踪的,或者不能按照您的方式跟踪,您可以编写属于自己的工具。如果您觉得Java代码很麻烦,Groovy或JRuby或很多其他JVM语言都可以帮助您更快完成。

      您真正需要的是一个快速而粗糙(quick-and-dirty)的由JVM连接的命令行工具,可以以您想要的方式确切地跟踪您感兴趣的数据。

    作者:张锋
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
    更多精彩文章可以观注
    微信公众号 soft张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    Redis源码分析(二十一)--- anet网络通信的封装
    leetcode 总结part1
    leetcode String to Integer (atoi)
    leetcode 165. Compare Version Numbers
    leetcode 189. Rotate Array
    leetcode 168. Excel Sheet Column Title
    leetcode 155. Min Stack
    leetcode 228. Summary Ranges
    leetcode 204. Count Primes
    leetcode 6. ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/skyme/p/1901167.html
Copyright © 2011-2022 走看看