从CLI监视OpenJDK

目前,我大部分时间在Java虚拟机 (JVM)内或周围进行大量工作,大部分时间是在Linux上。

当事情变得不对劲并且我试图确定原因时,我接触了Java性能分析工具。 这些工具有两种形式,一种是精美的GUI(称为visualvm) ,当我在本地计算机上工作时会使用它;另一种是Java开发工具包(JDK)附带的cli工具(当我在远程工作时使用)。

我指的CLI工具是:

  • jps – JVM进程状态工具
  • jstat – JVM统计信息监视工具
  • jhat – Java堆分析工具
  • jstack – Java堆栈跟踪工具

我最常用的工具是jps,jstat和jstack,jahat工具也非常方便,但实际上确实需要一个完整的博客文章,因为您疯狂地使用它可以做什么。 在这篇文章中,我整理了一些技巧,观察和示例输出,以说明如何使用它们。

当我使用ubuntu 11.10(仅安装Java运行时环境(JRE))时,我将需要安装JDK。 就我而言,我决定尝试一下openjdk 7,但是版本6可以正常工作。

root@oneric:~# apt-get install openjdk-7-jdk

要尝试这些命令,我​​已经安装了tomcat7,可以通过ubuntu上的apt来完成,同样,以前的版本是tomcat 6。

root@oneric:~# apt-get install tomcat7

现在我已经安装了tomcat,我想列出Java进程,请注意,这样做时最好假定使用与服务相同的用户帐户。 在ubuntu上,我将使用用户帐户,因为tomcat7用户是系统帐户,我必须覆盖shell,因为默认情况下它是/ bin / nologin ,然后我可以以该用户身份运行jps。

jps命令输出java进程的PID以及启动时传递给它的主类名称和参数。

root@oneric:~# su - tomcat7 -s /bin/bash 
tomcat7@oneric:~$ jps -ml
12728 org.apache.catalina.startup.Bootstrap start
13926 sun.tools.jps.Jps -ml
tomcat7@oneric:~$

现在我们有了这些进程的PID,可以运行jstat了,我使用的第一个开关是-gcutil,这使我对jvm中的堆使用有了一个总体了解。 如果出现暂停或性能下降的情况,我将查看最后两列。 其中包含垃圾收集时间(GCT)和完整垃圾收集时间(FGCT)。 如果FGCT列每秒增加一次,则可能是我们遇到了问题。

下面的示例针对tomcat的PID运行jstat 。 我还指示该命令每20行显示表头并以1000毫秒的间隔连续打印统计信息,就像正常的控件C一样,在输出末尾显示。

此示例显示了一个很少发生的新启动的tomcat 7,这从完全垃圾收集时间(FGCT)和垃圾收集时间(GCT)列中的值可以清楚地看出。

还要注意的是,目前的Permgen空间(P)占70%。 permgen空间是堆的重要区域,因为它保存用户类,方法名称和内部jvm对象。 如果您使用tomcat已有一段时间,您将看到java.lang.OutOfMemoryError:PermGen空间错误,该错误指示何时该空间被填满并且无法被垃圾回收。 重新部署大型Web应用程序时经常发生这种情况。

同样在示例中,我们可以看到幸存者0(S0),幸存者1(S1),伊甸园和旧空间具有相当大的可用空间。

tomcat7@oneric:~$ jstat -gcutil -h20 12728 1000S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   0.00  17.90  32.12   4.81  71.41      5    0.009     1    0.023    0.0320.00  17.90  32.12   4.81  71.41      5    0.009     1    0.023    0.0320.00  17.90  32.12   4.81  71.41      5    0.009     1    0.023    0.032

为了说明相比之下,tomcat的负载情况,我们可以安装一个称为Apache Bench的工具。

root@oneric:~# apt-get install apache2-utils

并运行以下命令以同时访问具有大量请求的基本页面。

markw@oneric:~$ ab -n 1000000 -c 100 http://localhost:8080/

下面是该测试运行了一段时间后的输出,因为我们可以看到幸存者1,伊甸园和旧空间有了相当大的增长,但是服务器并没有花费很多时间来进行完整的垃圾收集,如下所示完整垃圾收集计数(FGC)的值只有10,从年轻一代收集计数(YGC)的增加可以看出,大部分工作是在年轻一代中进行的。

还要注意的是,permgen空间没有太多变化,实际上下降了,这是由于堆大小的增加。

tomcat7@oneric:~$ jstat -gcutil -h20 12728 1000S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   0.00 100.00  52.02  81.84  59.62    117    1.176    10    0.074    1.2500.00 100.00  52.02  81.84  59.62    117    1.176    10    0.074    1.2500.00 100.00  52.02  81.84  59.62    117    1.176    10    0.074    1.2500.00 100.00  52.02  81.84  59.62    117    1.176    10    0.074    1.250

为了更深入地了解垃圾收集的原因,我们使用了带有-gccause选项的jstat命令,该命令显示的列与上一个命令相同,但有两个额外的列提供了GC的原因。

在下面的示例中,我们可以看到分配失败的示例,这表明由于堆太小,正在执行完整的gc。

tomcat7@oneric:~$ jstat -gccause -h20 12728 1000
100.00   0.00   0.00  78.91  59.67    168    1.680    14    0.083    1.763 unknown GCCause      No GC               
100.00   0.00  72.61  83.73  59.67    170    1.698    14    0.083    1.781 unknown GCCause      No GC               0.00 100.00  46.24  91.83  59.67    173    1.729    14    0.083    1.811 unknown GCCause      No GC               
100.00   0.00  11.39  29.80  59.67    176    1.759    16    0.086    1.846 unknown GCCause      No GC               
100.00   0.00  92.41  35.30  59.67    179    1.777    16    0.086    1.864 unknown GCCause      Allocation Failure  0.00 100.00  62.58  43.05  59.67    181    1.803    16    0.086    1.889 unknown GCCause      No GC

诊断性能问题时,我还想研究的另一个领域是虚拟机中运行的线程。 这可以帮助我理解是否有任何组件超载,因此可以运行许多线程来追赶。 这主要仅适用于异步过程,例如消息传递或调度例程。

要转储线程及其当前堆栈的列表,请使用jstack命令,如下面的示例所示,我通常再次以进程所有者的身份运行它。

tomcat7@oneric:~$ jstack 12728
2011-10-16 14:53:58
Full thread dump OpenJDK 64-Bit Server VM (20.0-b11 mixed mode):"Attach Listener" daemon prio=10 tid=0x00000000015be800 nid=0x4004 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"http-bio-8080-exec-182" daemon prio=10 tid=0x00007f9d84274800 nid=0x3cd3 waiting on condition [0x00007f9d7a0df000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x00000000ef16da38> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject. await(AbstractQueuedSynchronizer.java:2043)at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:386)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(ThreadPoolExecutor.java:1043)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)at java.lang.Thread.run(Thread.java:679)
...

我计划用jruby在一些可视化工具上做一些工作,但是这可能是我下一篇文章的重点。 在撰写本文的过程中,我找到了一些有趣的文章,这些文章链接如下:

  • Sun Microsystems的Chuk-Munn Lee对Java SE 6部署进行故障排除
  • 解释java.lang.OutOfMemoryError:PermGen空间



参考: Mark Wolfe博客上的 JCG合作伙伴 Mark Wolfe 从CLI监视OpenJDK 。

相关文章 :
  • 任何软件开发公司应存在的服务,实践和工具,第1部分
  • 这是在您的业务逻辑之前!
  • 您的代码中有几个错误?
  • 使用FindBugs产生更少的错误代码
  • 引入新技术–如何抵抗阻力
  • Java工具:源代码优化和分析
  • 我们可以更好地理解需求规范吗?
  • 每个程序员都应该知道的事情
  • 为什么自动化测试可以提高您的开发速度

翻译自: https://www.javacodegeeks.com/2011/10/monitoring-openjdk-from-cli.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python数据库优化_python | Mysql性能优化一

对mysql优化是一个综合性的技术&#xff0c;主要包括表的设计合理化(符合3NF)添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]分表技术(水平分割、垂直分割)读写[写: update/delete/add]分离存储过程 [模块化编程&#xff0c;可以提高速度]对mysql配…

MySQL中文乱码问题

项目中用到MySQL数据库时中文出现乱码问题&#xff08;中文字符都变成了&#xff1f;&#xff09;解决&#xff1a; 1、统一项目与数据库的编码&#xff0c;项目中用的是UTF-8因此我的把数据库的编码统一成UTF-8 修改方式&#xff1a;修改 MySQL根目录中的 my.ini 文件替换d…

json与字符串互转

1 字符串转JSON var objeval((str"))var objJSON.parse(str)var objstr.parseJSON()2 JSON转字符串 var strobj.toJSONString()var strJSON.stringify(obj)转载于:https://www.cnblogs.com/liu-xia/p/5050878.html

使用RequestFactory API进行Spring GWT集成

从GWT 2.4开始&#xff0c;将RequestFactory API与后端的Spring服务集成很容易&#xff0c;您需要做的就是在服务器上创建一个自定义ServiceLocator&#xff0c;GWT将使用它来正确定位被调用的服务&#xff1a; public class SpringServiceLocator implements ServiceLocator {…

C++实例讲解Binder通信

binder是android里面的通信机制&#xff0c;这就不说它如何如何好了&#xff0c;Goog已经说过了&#xff0c;这里不多说。binder是一个面向对象的编程方法&#xff0c;大量使用虚函数类。最近研究binder看到一网友写的&#xff0c;就借鉴一下。这个例子很好的解释里binder通信关…

2014编程之美初赛第一场

题目1 : 焦距 时间限制:2000ms单点时限:1000ms内存限制:256MB描述 一般来说&#xff0c;我们采用针孔相机模型&#xff0c;也就是认为它用到的是小孔成像原理。 在相机坐标系下&#xff0c;一般来说&#xff0c;我们用到的单位长度&#xff0c;不是“米”这样的国际单位&#x…

高中python公开课怎么上好_如何上好高中英语公开课

谈如何上好高中英语公开课对青年教师来说&#xff0c;开一节公开课&#xff0c;如同完成一次蜕变&#xff0c;累掉一层皮&#xff0c;有着刻骨铭心的阵痛&#xff0c;但换来的是突飞猛进的专业成长。可以说&#xff0c;公开课是青年教师培训的有效途径&#xff0c;是名师培养的…

Codeforces Round #261 (Div. 2) - E (459E)

题目连接&#xff1a;http://codeforces.com/contest/459/problem/E 题目大意&#xff1a;给定一张有向图&#xff0c;无自环无重边&#xff0c;每条边有一个边权&#xff0c;求最长严格上升路径长度。(1≤n&#xff0c;m≤3 *10^5) 初见此题觉得以边为点&#xff0c;以点为边&…

回收对象以提高性能

总览 在上一篇文章中&#xff0c;我说过对象反序列化更快的原因是由于使用了回收对象。 由于两个原因&#xff0c;这可能令人惊讶&#xff1a;1&#xff09;相信如今创建对象是如此之快&#xff0c;无关紧要或与回收自己一样快&#xff0c;2&#xff09;默认情况下&#xff0c;…

jquery GET POST

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <head> <!--引入百度库--> <script src"http://libs.baidu.com/jquery/1.10.2/jquery.min.js"> </script> <title></title> <scrip…

C++高精度运算类bign (重载操作符)

大数据操作&#xff0c;有如下问题&#xff1a; 计算&#xff1a;45678913561232654213212314875231656511323132 456789135612326542132123*14875231656511323132 比较&#xff1a;7531479535511335666686565>753147953551451213356666865 ? long long类型存储不了&…

oj系统格式错误_论文查重会不会检查格式?【paperpp吧】

高等学校一般都会要求大学生在毕业时需要写作毕业论文&#xff0c;并且会提前发出关于毕业论文的通知&#xff0c;在通知上一般会说明论文写作的相关要求&#xff0c;其中就会规定论文的相关格式。当然&#xff0c;学校也会在通知中说明论文查重的相关事宜&#xff0c;那么论文…

JavaScript Cookies

相关&#xff1a;jquery-cookie cookie 是存储于访问者的计算机中的变量&#xff0c;常用来存储用户名字&#xff0c;密码&#xff0c;日期&#xff0e; 示例&#xff1a; 1 document.cookie"usernameJohn Doe"; 2 document.cookie"usernameJohn Doe; expiresTh…

大数据 -- Hadoop集群搭建

Hadoop集群搭建 1.修改/etc/hosts文件 在每台linux机器上&#xff0c;sudo vim /etc/hosts 编写hosts文件。将主机名和ip地址的映射填写进去。编辑完后&#xff0c;结果如下&#xff1a; 2.配置ssh&#xff0c;实现无密码登录 四台虚拟机上&#xff0c;使用&#xff1a; ssh-ke…

通过示例休眠–第2部分(DetachedCriteria)

所以上次我们帮助正义联盟有效地管理了他们的超级英雄。 今天&#xff0c;我们集中讨论“复仇者联盟”将如何使用冬眠的“分离标准”找出每个超级英雄的敌人&#xff0c;以保护他们的超级英雄。 您可以从此处下载工作示例。 在此示例中&#xff0c;我们仅考虑两个实体。 复仇者…

2014编程之美初赛第二场

题目1 : 神奇的数列 时间限制:2000ms单点时限:1000ms内存限制:256MB描述 大神同学是一个热爱数字的孩子&#xff0c;她无时无刻不在思考生活与数学的联系。有一天&#xff0c;她发现其实公历的设计是有讲究的。 每4年就会多闰一天&#xff0c;每一百年又会有一年不是闰年&#…

usb大容量存储设备驱动_usb无法识别怎么办 如何解决usb识别故障【详细步骤】...

usb无法识别怎么办? 随着计算机硬件飞速发展&#xff0c;外围设备日益增多&#xff0c;键盘、鼠标等早已为人所共知&#xff0c;数码相机、MP3随身听接踵而至&#xff0c;这么多的设备&#xff0c;如何接入个人计算机?USB就是基于这个目的产生的。USB是一个使计算机周边设备连…

CSDN编程挑战——《交替字符串》

交替字符串 题目详情: 如果字符串str3能够由str1和str2中的字符按顺序交替形成&#xff0c;那么称str3为str1和str2的交替字符串。例如str1"abc"&#xff0c;str2"def"&#xff0c;那么"adbecf", "abcdef", "abdecf", "…

hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

题目链接&#xff1a; Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1037 Accepted Submission(s): 298 Problem DescriptionBi Luo is a magic boy, he also has …

Java EE过去,现在和云7

最近的JavaOne 2011的一个突出主题是下一个主要的Java EE 7版本。 正如主题发言中所述&#xff0c;有关工作正在进行中。 它将包含我们已经从先行者那里知道的28个规范以及一些新规范。 没人可以告诉您确切的号码&#xff0c;因为EE 7仅在“及时”完成时才会接受新的规范。 这意…