openjdk

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

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

我指的CLI工具是:

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

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

当我使用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

openjdk

openjdk_从CLI监视OpenJDK相关推荐

  1. 从CLI监视OpenJDK

    目前,我大部分时间在Java虚拟机 (JVM)内或周围进行大量工作,大部分时间是在Linux上. 当事情变得不对劲并且我试图确定原因时,我接触了Java性能分析工具. 这些工具有两种形式,一种是精美的 ...

  2. jvm调试工具_调试JVM

    jvm调试工具 在某些(极少数)情况下,您可能会遇到使JVM本身崩溃的情况. 我最近通过将ThreadGroup的名称设置为null来进行管理 . 在这些情况下,调试JVM本身很有用,这样可以更精确地 ...

  3. jrockit_1.6下载_Oracle JRockit Mission Control 4.1发布

    jrockit_1.6下载 Oracle发布了以前的仅JRockit专用工具Mission Control Suite(JRMC)的新版本. 4.1版本是次要版本升级,直接遵循4.0.1(该版本发布于 ...

  4. Oracle JRockit Mission Control 4.1发布

    Oracle发布了以前的仅JRockit专用工具Mission Control Suite(JRMC)的新版本. 4.1版本是次要版本升级,直接遵循4.0.1(该版本发布于2010年中期). 但是,即 ...

  5. 使用Java VisualVM分析您的应用程序

    当您需要发现应用程序的哪个部分消耗更多的CPU或内存时,必须使用探查器执行此操作. 默认情况下,Sun JDK中附带的一个探查器是Java VisualVM. 这个事件探查器非常简单易用,功能强大. ...

  6. docker logstash_用于监视Kubernetes和Docker的六大开源工具

    Kubernetes和Docker是在DevOps圈中最常听到的两个词.Docker是一个工具,它使你能够以容器化的方式运行应用程序,Kubernetes是一个用于编排.管理容器的平台--如果你想使用 ...

  7. java离群值,监视-衡量Java中单线程复杂算法的最佳宏基准测试工具/框架是什么?...

    以下是我找到的所有工具的字母顺序列表. 提到的方面是: 它易于参数化 它是Java库还是至少可以轻松集成到Java程序中 它可以处理JVM微型基准测试吗,例如 使用热身阶段 它可以直观地绘制结果吗 是 ...

  8. 肝!22款超好用的CLI工具

    作者 | switowski 策划 | 万佳 作者根据多年的终端使用经验,详细介绍了一些实用的 CLI 工具,希望它们能帮读者提高生产力. 前段时间,我写过一篇我最喜欢的 Mac 应用的文章.其实,我 ...

  9. .NET Core CLI 的性能诊断工具介绍

    前言 开发人员的.NET Core项目上线后,经常会出现各种问题,内存泄漏,CPU 100%,处理时间长等, 这个时候就需要快速并准确的发现问题,并解决问题, 除了项目本身的日志记录外,NET Cor ...

最新文章

  1. iOS 中 OC项目使用swift第三方工具(OC、swift 混合)
  2. 常见加密算法分类,用途,原理以及比较
  3. fatal error: hdf5.h: No such file or directory
  4. SpringBoot2.0 以上 WebMvcConfigurerAdapter 方法过时 解决办法
  5. python的用算法进制转换详解_学习python第五天进制转换
  6. 百度贴吧10亿量级LAMP架构分享
  7. 原创 | 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?
  8. mysql privileges
  9. NLP文本分类大杀器:PET范式
  10. 数据结构与算法——贪心算法汇总整理
  11. 提供Gmail与Wallop邀请各两个
  12. 云服务器上划虚拟主机,云服务器上划虚拟主机
  13. 解决AndroidStudio更新后在 Building gradle project info 一直卡住
  14. 通过表面分析评估 Cu-CMP 工艺
  15. Google推出网页加速工具 - Page Speed (Firefox插件)
  16. linux压缩文件方式,在 Linux 上压缩文件的 5 种方法
  17. webrtc 快速搭建 视频通话 视频会议
  18. 微信小程序wx.chooseImage选择图片并上传避坑/真机上传无效
  19. 怎么修复索尼摄像机死机断电损坏的MXF视频文件
  20. APP闪退有哪些原因造成的?

热门文章

  1. .sync的一个用法
  2. 不好意思,你这个加分理由不行……
  3. 英语不会读怎么办?它来教你……
  4. 《四世同堂》金句摘抄(四)
  5. sql server案例总结
  6. Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
  7. java design按钮_DesignJava 设计模式,讲述 的各种 方便在项目中进行 框架结构 Develop 238万源代码下载- www.pudn.com...
  8. 计算机二级c语言考试模拟试题,计算机二级C语言考前模拟试题及答案2016
  9. Mybatis报错:nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX‘ not found
  10. 数据结构和算法的基本概念