如何通过jmx 监控java进程程

主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》研发主编,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:
作者:Chris Ward
翻译:雨言
译者注:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。通常情况下,监控的主要目的在于:减少宕机时间、扩展和性能管理、资源计划、识别异常事件和故障排除分析等。本文作者介绍了5种方法帮助你在Docker中监控Java应用程序。你知道有什么好的方法可以在Docker容器中监控Java应用程序吗?在容器中运行应用程序是一种日益流行的维护大型分布式栈的方法,这种栈基于需求而变化。对于基于容器的架构来说,Java虚拟机是一种理想的编程语言。由于存在很多活动的部件和组成元素,在容器中监控Java应用程序时,需要提前计划和选择正确的工具,从而有效地监控对你有用的地方。在一个监控堆栈中需要考虑5个部分的因素。首先,我会简要介绍前面两个部分,并且指出覆盖到这两部分的有用的资源,然后我将着重讲解后面三部分。目录
生成有用的日志当然,Java会生成自己的应用程序日志,但是通常需要额外的工具去增加这些日志的可读性和可用性,其中包括公认的、大型的工具,例如,或小型的(但性能相当)工具,例如。需要考虑的主要因素是你正在使用或计划与Docker集成的日志管理工具的性能如何。通常,与Docker集成会成为安装过程中另一个基本步骤,不需要绕什么弯路。存在的缺陷就是,生成的日志只会和你选择的信息一样好,而其他的工具就可以填补这些空缺。性能监控应用程序性能监控(APM)工具可以识别代码或基础设施中的性能瓶颈,让你知道有哪些地方需要进一步提升。这是一个繁忙的空间,常用的工具有和。和日志管理工具一样,从Docker的角度出发需要考虑的主要问题是集成工作的性能怎样。Docker容器已经成熟到足以成为APM安装过程中的一个步骤。错误追踪应用程序会生成错误,但是利用现有的复杂的interwoven和分布式代码基通常难以直接定位错误来源。可以通过监控生产中的应用程序帮你解决这个难题。其中有一款叫做OverOps的工具脱颖而出,这是一款完全专注于基于JVM(Java虚拟机)应用程序的工具,是一款高度优化的本地代理,使用过程中最多增加1%的CPU开销,几乎不存在网络或存储开销。这对于内存空间和性能要求较高的基于容器的JVM来说是一个理想的选择。你可以看到实时异常,并记录错误或警告,然后过滤出特定的错误,例如与JVM、数据库或网络有关的错误。如果你发现一些错误需要进一步了解细节,你可以点进去,里面会显示整个调用堆栈内引发错误的代码和错误发生时具体的变量状态。,你可以通过在Dockerfile中添加少量的代码来访问和使用,其中包括Debian /Ubuntu、CentOS / RedHat和Alpine Linux。一般来说,容器通常在持续变化的应用环境中使用,会定期介绍新代码,OverOps可以快速识别新增的错误并深入分析其原因。如果你的应用程序是在一个容器集群上运行,那么设置过程也是一样的,OverOps也可以监测并整合所有的错误。容器测量指标容器本质上是小型的、独立的机器,所以,例如CPU和内存使用率等指标对于跟踪高级应用程序问题来说至关重要。接下来我将重点介绍基于Docker的容器,也会稍微提一下这个工具是否支持其他选项。
Docker Stats
首先,我说一下Docker自带的API接口,因为很多其他的工具是基于这个接口提供的数据,然后添加来自其他地方的信息。一个简单的docker stats命令可以让你一览容器的CPU、内存和I/O使用情况,其他API端点可以提供任务、日志、时间等等指标的具体情况。
我是在一次Docker交流会上接触到的Portainer,Portainer是一款公认好用的开源Docker管理工具,它本身是在容器内运行,位于两个无害的链接后面,这两个链接分别在应用程序的两个容器上。Portainer可以提供界面友好的可视化统计数据和日志明细,应该可以满足你的要求,另一个吸引人的地方就是这个项目简单易行并且成本低廉。
Datadog主要用于为整个堆栈提供详细的测量指标,您可以将所有被监控的点排列成定制的仪表板,以满足你的需要,并根据问题和严重性触发适当的通知,当它标记一个潜在问题时,会有内置到Datadog的通信工具来进行注释和讨论,并且重点突出任何可能衍生的问题,帮你做到提前预防。如果有一些数据是你的应用程序想要监控但是Datadog却缺乏正式集成的,你可以使用它们的全访问API去获取数据,然后把它们输入到相同的仪表板、警报和协同工具中。对于在容器中运行的JVM应用程序来说,有几个组件反映了Datadog函数的粒度。你可以为你的主机操作系统添加一个代理,然后,监控独立容器性能和监控容器性能的Docker集成与它们正在运行的应用程序会关联起来。安装过程有可能很复杂,这取决于你的主机/Docker配置,由于Datadog想要监控主机、容器引擎和应用程序的性能,所以,将呈现出一个完整的画面。比如,如下图所示,Docker运行在我的Mac上几个对于Datadog来说非常重要的层:为了监控容器的内部情况,你通过把每一个代理加入到Dockerfile中,然后运行各个容器内部的代理。如果是监控应用程序的话,使用,你可以监控到任何你想监控的数据。如果这些还不能满足你,Datadog还可以让你通过statsD发送测量指标,它们会提供一个Java库帮你完成。
虽然可以配置好文中提到的所有服务并与微服务友好协作,但这对于SignalFX来说却是主要关注点之一。SignalFX服务是基于开源统计守护进程的,统计守护进程提供了一个现成的生态系统和社区,意味着你可以把collected插件添加到SignalFX默认模式时无法访问的collect数据中。对于Docker容器,SignalFX将使用stats API来监控数据从而显示CPU、内存和硬盘使用情况。一个仪表板将首先向你提供跨所有容器的指标的聚合视图,并让你深入到每个docker主机和容器中查看性能问题所在。我喜欢SignalFX的一个特性是在系统级别上安装代理,因此更简单。比如,如果你想在Ubuntu和Debian上安装一个Java插件(其他分布是一个包括两个步骤的过程),你只需要通过技术安装代理,它包括Java支持和其他代理,你可以在Java应用程序中为来自SignalFX的库添加自定义集合点。
Wavefront和本文中的其他方法不一样,它不是提供特定的日志解决方案,而是从其他日志服务(包括collectd、statsd和JMX)收集时间序列数据。对于Docker容器,Wavefront有,cAdvisor是一个类似容器的轻量级代理,它用来监控CPU、内存和硬盘等底层资源利用率。如果你正在使用ECS、Kubernetes、Mesos或Docker Swarm等容器服务,那么Wavefront可以提供打包集成选项,这个选项在默认情况下可以提供跨集群的聚合指标。Orchestration随着容器架构越来越复杂,需求日益变化,你应该需要使用到orchestration工具去构建和管理你的应用程序,同时保持容器和机器问题的一致性。在这个空间里有几个主要的玩家,它们都提供了一个监控测量指标的解决方案,因为测量指标是一个非常关键的组件。
Prometheus
Prometheus是一个项目,它是一个系统和服务的监控系统,当条件为真时,它会触发警报。这是现在很流行的一款开源工具,所以,你需要花费一定的时间对它进行配置以满足自己的需求。如果你使用Mesos或Kubernetes去管理和安排你的容器,那么对于很多用这些工具的人来说,Prometheus会是一个优先选择。
Kubernetes Dashboard
覆盖Kubernetes集群的选项本身就是另一篇文章,但值得一提的是默认的Kubernetes仪表板选项,以免你用Kubernetes去管理你的容器,它为每个’pod’、日志和作业查看器提供了资源使用的整体情况。
Mesos Metrics
如果你在用Mesos管理你的容器,同样,它也有自己内置的选项去监控它运行的容器。虽然不像Kubernetes仪表板那样可视性强,但是它可以提供一系列的端点,你需要自己去实现,或者使用一种工具将这些数据可视化。结语容器是小型的、独立的机器,通常,它的监控能力和一个“正常的”物理机或虚拟机差不多,主要的区别在于你的应用程序中容器数量的多少,并且它们的生存周期很短,容器不适用于长期运行的服务。组装好监控堆栈之后,确保你选择的解决方案使实例的数量容易变化,并且度量标准提供了对你的应用程序的一致概述。&&完java web项目如何监控各服务运行状态是否正常?需求就是用java写个web项目监控各服务运行状态是否正常,服务包括tomcat、mysql、openfire、redis等服务。1个牛币所有回答列表(3)&LV4有专业的监控软件,比如zabbix。也可以自己写个简单的动态页面,该页面只是连接db或redis等,成功则返回200,失败则500,在写个定时任务请求该页面就ok最佳答案&可以试试&LV3APM等完等等等等等等等等等等相关问答等完完等完等完等完等等完最近浏览暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友Linux下Java线程详细监控和其dump的分析使用—-分析Java性能瓶颈 - 为程序员服务
Linux下Java线程详细监控和其dump的分析使用—-分析Java性能瓶颈
12676 阅读
这里对linux下、sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结;
linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找:
(一):通过【 top
-p 12377 -H】 查看java进程的有哪些线程的运行情况;
和通过【jstack 12377 & stack.log】生成Java线程的dump详细信息;
先用top命令找出占用资源厉害的java进程id,如图:# top
如上图所示,java的进程id为&#′,接下来用top命令单独对这个进程中的所有线程作监视:
-p 52554 -H
top视图里面里面可以通过快捷键依次b ,x高亮显示top的列找出需要的线程,默认CPU排序,Shift+& ,Shift+&可以左右移动高亮排序的列;
如图:(这时就看出来哪个java线程CPU高,哪个线程内存用的多)
如上图所示,linux下,所有的java内部线程,其实都对应了一个进程id,也就是说,linux上的sun jvm将java程序中的线程映射为了操作系统进程;我们看到,占用CPU资源最高的那个进程id是&#′,这个进程id对应java线程信息中的’nid’(‘n’ stands for ‘native’);
(1)要想找到到底是哪段具体的代码占用了如此多的资源,先使用jstack打出当前栈信息到一个文件里, 比如stack.log:
jstack 52554 & stack.log
然后使用’jtgrep’脚本把这个进程号为&#′的java线程在stack.log中抓出来:
jtgrep 9757 stack.log
其中,’jtgrep’是自己随便写的一个shell脚本:
nid=`python -c
"print hex($1)" `
-i $nid $2
道理很简单,就是 把&#′转换成16进制后,直接grep stack.可以看到,被grep出的那个线程的nid=0x3c39,正好是15417的16进制表示。
(2) 通过(windows程序–&计算器),选择程序员计算器将进程ID转换成16进制 到dump里面的nid 就可以搜索到
“http-nio-8080-exec-25″ daemon prio=10 tid=0xb4800 nid=0x1ce5 waiting on condition [0xcf000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
– parking to wait for
&0x3ec8& (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
(二)第二种通过 Java visualMv结合 jconsole.exe
工具即可查看如图所示;(第一种方式可能更准确一些)
三:在Java Visualvm工具里面安装JTA插件,分析线程dump文件,注意,正常阶段的dump文件与非正常时期的Dump文件进行比较更容易分析出问题:
(1)下载:https://java.net/projects/tda/downloads/directory/visualvm
(2)安装与使用:
(3)使用:
四:直接通过tda-bin-2.2\bin\tda.sh 来分析导出ThreadDump文件;(在没有JMX监控的情况下手动查看threadDump信息)
下载地址:https://java.net/projects/tda/downloads/directory/visualvm
IT技术文章geek资讯
原文地址:, 感谢原作者分享。
您可能感兴趣的代码利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 - CSDN博客
利用jdk自带的运行监控工具JConsole观察分析Java程序的运行
一、JConsole是什么
&&& 从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。
二、如何启动JConsole
如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole 即可。
如果从 GUI shell 启动,找到 JDK 安装路径,打开 bin 文件夹,双击&jconsole&。
&&& 当分析工具弹出时(取决于正在运行的 Java 版本以及正在运行的 Java 程序数量),可能会出现一个对话框,要求输入一个进程的 URL 来连接,也可能列出许多不同的本地 Java 进程(有时包含 JConsole 进程本身)来连接。如图所示:
想分析那个程序就双击那个进程。
三、如何设置JAVA程序运行时可以被JConsolse连接分析
本地程序(相对于开启JConsole的计算机),无需设置任何参数就可以被本地开启的JConsole连接(Java SE 6开始无需设置,之前还是需要设置运行时参数 -Dcom.sun.management.jmxremote )
无认证连接 (下面的设置表示:连接的端口为8999、无需认证就可以被连接)
如果考虑到安全因素,需要认证,需要安全连接,也是可以搞定的。参考:
四、JConsole如何连接远程机器的JAVA程序(举例说明)
1、写一个简单的一直运行的JAVA程序,运行在某台机器上如(192.168.0.181)
2、另外一台机器进行连接
可以直接使用命令:
&也可以在已经打开的JConsole界面操作 连接-&新建连接-&选择远程进程-&输入远程主机IP和端口号-&点击“连接”,如图:
&然后就会进入分析界面:&
下面说说如何分析,如何使用这六个标签
概述:&Displays overview information about the Java VM and monitored values.内存:&显示内存使用信息线程:&显示线程使用信息类:&显示类装载信息*VM摘要:*显示java VM信息MBeans:&显示 MBeans.
&&& 概述很简单没啥说的,自己看看吧,不过值得一提的是对着图点击右键可以保存数据到CSV文件,以后可以使用其他工具来分析这些数据。
&&& 这个比较有价值,参看堆内存,非堆内存,内存池的状况总体内存的分配和使用情况以及不同的GC进行垃圾回收的次数和时间。可以手动进行GC查看内存变化。
&& 在分析JAVA内存问题进行调优时候非常有用,你要学习JVM内存模型,之后会发现这里的每个值都具有意义。
&& GC的算法和参数对性能有显著的影响,注意垃圾回收次数、时间、以及partial GC和full GC,调整你所使用的不同GC和以及各个GC下的参数,然后在这个视图下观察,以得到好的性能。
这里贴一下 Java&&VM garbage collector
下generational GC 的各代的划分图:
关于GC,可以参考:我的关于GC的文章
&&& 左下角显示所有的活动线程(如果线程过多,可以在下面的过滤栏中输入字符串过滤出你想要观察的线程)。点击某个显示会显示这个线程的名称、状态、阻塞和等待的次数、堆栈的信息。
&&& 统计图显示的是线程数目的峰值(红色)和当前活动的线程(蓝色)。
&& 另外下面有个按钮“检测到死锁”,有时候会有用处。
没啥要说的。
也没啥要说的,看看吧,内存状况,操作系统...
这里可以有一些额外的操作。
一看便知,是个什么东西。
本文已收录于以下专栏:
相关文章推荐
VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用、JVM堆内存消耗、线程、类加载的实时监控,内存dump文件分析,垃圾回收运行情况的可视化分析等,对故障排查和性能调优很...
这时候要注意 Xmx和MaxPermSize的和 不要超过系统支持最大的jvm堆的大小,否则tomcat也无法启动。可以通过
java -Xmx###M -version 来测试系统支持最大的j...
摘要:在程序开发过程中,一些IDE的配置、常用代类的积累以及常用框架的使用。能帮助我们迅速写好代码,快速定位错误。同时,又有利于我们快速构造和部署,以及进行后续的迭代开发。
想验证你对 jvm 配的一些调优参数有没有起作用吗?想不想实时监控你自定义的线程池的在实际运行时的线程个数、有没有死锁?想不想实时监控你的 Java 应用的堆内存使用情况,并根据峰值等数据设置最适合你...
转载:http://liubingwwww./blog/static//JConsole的使用:       JConsole是一...
一篇Sun项目主页上介绍JConsole使用的文章,前段时间性能测试的时候大概翻译了一下以便学习,今天整理一下发上来,有些地方也不知道怎么翻,就保留了原文,可能还好理解点,呵呵,水平有限,翻的不好,大...
写在前面的话:此文只能说是Java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线...
package com.rainteen.framework.util.
import java.io.BufferedInputS
import java.io.Closeable...
Java进程监控与分析
    JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)SHELL脚本监控JAVA进程的代码
投稿:mdxy-dxy
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了SHELL脚本监控JAVA进程,需要的朋友可以参考下
脚本内容:java_check.sh
#! /bin/bash
if [ -z `pidof java` ]; then
echo -e `date +%Y-%m-%d` `date +%R`. “33[31m33[1m(JAVA)Process does not exist! 33[0m” && /data/logs/java_check.log
/usr/local/tomcat/bin/startup.sh &/dev/null 2&&1
netstat -tnlp && /data/logs/java_check.log
echo -e “r” && /data/logs/java_check.log
计划任务,十五分钟执行一次
*/15 * * * * root /usr/local/bin/java_check.sh
一个监控java程序运行的shell
export J_LIB=/data/sms/
export CLASSPATH=.:$J_LIB/jtds-1.2.jar:$J_LIB/log4j-1.2.12.jar:$J_LIB/postgresql-8.1-404.jdbc3.
export JAVA_HOME=/usr/java/jdk1.5.0_05
export JRE=/usr/local/jdk/jre
export SHELL=/bin/bash
export HOME=/data/sms
#java check status
if /bin/ps ax | /bin/grep -v grep | /bin/grep "java XinTai"; then
cd /data/sms/
/usr/java/jdk1.5.0_05/bin/java XinTai &/dev/null &
定时执行可以保证 java XinTai可以一直在运行
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 监控java进程 的文章

 

随机推荐