openjdk_从CLI监视OpenJDK

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

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

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

相关文章

Html.RenderPartial和Html.Partial在Razor视图中的区别

Html.RenderPartial和Html.Partial在Razor视图中的区别两者都可以输出一个Partial视图&#xff1b;其区别如下&#xff1a;1. Partial有返回值(MvcHtmlString)&#xff1b;RenderPartial没有返回值(Void)。  定义 1 //PartialExtensions.Partial 方法 (HtmlHelper, String) 2…

孙叫兽进阶之路之软件测试基础知识

简介:软件测试是使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 从是否关心软件内部结构和具体实现的角度划分,测试方法主要有白盒测试和黑盒测试。白盒测试方法主要有代码检査法、静态结构…

交叉驰豫的影响因素_深度讲解:膝关节韧带为什么容易断裂?这5点因素影响非常大...

小科普&#xff1a;ACL 膝关节前交叉韧带 PCL后交叉韧带除了了解ACL损伤机制&#xff0c;弄清ACL损伤的风险因素对预防ACL损伤也是至关重要的。ACL损伤的风险因素也包括解剖学因素、生物力学因素、神经肌肉因素。所有的风险因素的确定有助于预防损伤。解剖学风险因素包括关节松…

CNVD-2022-10207:向日葵RCE

一&#xff1a;漏洞摘要 向日葵远程控制是一款面向企业和专业人员的远程pc管理和控制的服务软件。可以在任何有网络的情况下&#xff0c;轻松访问并控制安装了向日葵客户端的远程主机。同时还能实现远程文件传输、远程视频监控等功能&#xff0c;这不仅为用户的使用带来很多便捷…

手把手教你用Java设计并实现一个城市公交查询系统

背景:近年来, Internet推动了以互联网技术为核心的各项工作蓬勃展开,互联网的强大也大大的促进了社会的发展,整个社会信息化进程逐步加快,网络也变成了我们日常活动中越来越重要的组成成分。为了使得我国公交乘客出行及查询有关信息更方便,本文运用JAVA语言技术,Jsp技术,…

[Cogs14] [网络流24题#1] 飞行员分配方案 [网络流,最大流,二分图匹配]

经典二分图匹配&#xff0c;可以用匈牙利算法&#xff0c;也可以用最大流 代码如下&#xff08;Dinic&#xff09;&#xff1a; #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <c…

叉/连接框架

本文是我们学院课程中名为Java Concurrency Essentials的一部分 。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全之类的概念。 在这里查看 &#xff01; 目录 1.简介 2.叉/连…

python 建筑建模_不可错过的python 街道数据爬取和分析神器!

hello 大家好&#xff01;最近遇到一堆关于街道数据分析的问题&#xff0c;又不想去使用百度和高德的API&#xff0c;有的功能还是得付费&#xff0c;为了学习不想掏钱&#xff0c;那么有什么办法么&#xff1f;答&#xff1a; 有&#xff01;必须有&#xff01;今天给大家分享…

​qemu-img 转换:raw、qcow2、qed、vdi、vmdk、vhd虚拟磁盘格式

qemu-img 转换&#xff1a;raw、qcow2、qed、vdi、vmdk、vhd 所述的qemu-IMG转换命令可以执行多种格式&#xff0c;包括之间的转换qcow2&#xff0c;qed&#xff0c; raw&#xff0c;vdi&#xff0c;vhd&#xff0c;和vmdk。 qemu-img 格式字符串 图片格式 qemu-img 的参数 …

我是如何使用git把本地代码上传到CODECHINA上的,值得借鉴

背景&#xff1a;最近开发了一款城市公交查询系统。没有把代码上传到github&#xff0c;传到CODECHINA试试&#xff0c;先占个坑。 首先进入自己的个人主页&#xff0c;没有自己资料信息的先设置一下&#xff0c; codeChina官网&#xff1a;https://codechina.csdn.net/ 上传需…

Vmware中centos7共享文件夹

1.安装vmtools的步骤 1.进入centos 2.点击vm菜单的->install vmware tools 3.centos会出现一个vm的安装包 &#xff0c;xx.tar.gz 4.拷贝到/opt 5.使用解压命令tar&#xff0c;得到一个安装文件 cd /opt //进入到opt目录 tar -zxvf xx.tar.gz //解压缩命令 …

Cookie和Session简介与区别

1、Cookie和Session简介与区别 在非常多时候&#xff0c;我们需要跟踪浏览者在整个网站的活动&#xff0c;对他们身份进行自动或半自动的识别&#xff08;也就是平时常说的网站登陆之类的功能&#xff09;&#xff0c;这时候&#xff0c;我们常采用Cookie与 Session来跟踪和判断…

电感发出声音怎么解决_如何解决多层PCB设计时的EMI

解决EMI问题的办法很多&#xff0c;现代的EMI抑制方法包括&#xff1a;利用EMI抑制涂层、选用合适的EMI抑制零配件和EMI仿真设计等。本文从最基本的PCB布板出发&#xff0c;讨论PCB分层堆叠在控制EMI辐射中的作用和设计技巧。电源汇流排在IC的电源引脚附近合理地安置适当容量的…

电子商务网站放大效果的三种常用的实现方式。

预览效果(这里截取静态,有兴趣的可以运行下面的代码): 实现方式1. <!DOCTYPE html> <html> <head><meta charset="UTF-8"><title>电子商务网站放大镜效果1</title><style type="text/css">html, body, div…

CentOS宝塔搭建(超详细)

本文讲述CentOS搭建宝塔全过程&#xff0c;我会手把手的教你哦~ 1、云平台控制台创建及安装CentOS系统。 不管哪个云应该都有这个系统的。 注意事项&#xff1a; &#xff08;1&#xff09;CentOS系统建议7.4、7.6版本&#xff0c;切勿安装8版本&#xff01; &#xff08;2&…

又发现一个visual studio 2015的坑啊。

又发现一个visual studio 2015的坑啊。。。我的后台管理的目录名称叫duck&#xff0c; 但是在新版VS2015中打开项目后编译&#xff0c;出现错误&#xff1a; Error opening response file 。。。。。晕。。编译的目录名中不能有符号啊啊啊。。在之前都是可以的。。郁闷死啊。啊…

api 定位 微信小程序 精度_小程序的api是什么

微信小程序API(Application Programming Interface)&#xff0c;应用程序编程接口&#xff0c;也是程序员口中常说的接口。其实api并不专属于小程序&#xff0c;任何编程语言或程序形态都有相对应的api。而我们今天谈的小程序api&#xff0c;是微信小程序团队为了方便开发人员制…

前端全栈大佬是如何使用javaScript实现一个焦点图

效果图: 代码如下: <!DOCTYPE html> <html> <head lang="en"><meta charset="UTF-8"><title>焦点图</title><style>ul,li{list-style: none;}#outer{width: 400px;height: 300px;position: relative;margin:…

Spark入门:也可以用Java创建轻量级的RESTful应用程序

最近&#xff0c;我一直在使用Spark &#xff08;一种Java的Web框架&#xff0c;与Apache Spark 不相关&#xff09;编写RESTful服务。 当我们计划写这篇文章时&#xff0c;我已经做好了不可避免的接口&#xff0c;样板代码和深层层次结构的Java风格的准备。 我很惊讶地发现&am…

前端全栈大佬是如何使用javaScript实现一个轮播图

效果图: 代码如下: <!DOCTYPE html> <html> <head lang="en"><meta charset="UTF-8"><title>轮播图</title><style>ul,li{list-style: none;}#outer{width: 400px;height: 300px;position: relative;margin:…