快速掌握Linux JVM可视化监控技巧 (linux jvm可视化监控)

在当今计算机技术不断发展的时代,Linux已成为了一个非常流行的操作系统。而Java虚拟机(JVM)则是许多企业级和互联网应用程序的关键组成部分。在这样的情况下,Linux JVM的可视化监控技巧变得尤为重要。本文将为读者介绍Linux JVM的可视化监控技巧,帮助读者更好地了解和掌握这一技术。

1. 使用JVisualVM

JVisualVM是一个可视化监控工具,它可以帮助用户对JVM进行监控和分析。它可以展示各种数据,比如吞吐量、堆大小、垃圾回收信息等等。JVisualVM是一个自带的工具,因此无需进行任何安装即可使用。只需要输入jvisualvm命令即可打开它。

在界面上,可以看到JVM进程的列表。选择所需的进程,点击“监视”按钮即可开始监控。此时,JVisualVM会提供进一步的详细信息和图表,包括堆大小和使用情况、线程信息、类信息和垃圾回收状态等等。可以根据这些信息进行分析和调试。

2. 使用JConsole

类似于JVisualVM,JConsole也是一个监控JVM并提供运行时信息的工具。不同的是,它是一个轻量级的工具。与JVisualVM不同的是,JConsole需要手动启动JMX服务。可以使用以下命令启动:

“`

java -Dcom.sun.management.jmxremote.port= \

-Dcom.sun.management.jmxremote.authenticate=false \

-Dcom.sun.management.jmxremote.ssl=false \

-jar /path/to/jconsole.jar

“`

启动JConsole后,选择所需的进程,即可开始监控。类似于JVisualVM,JConsole会提供堆大小、线程信息、类信息和垃圾回收信息等等。

3. 使用VisualVM插件

VisualVM是一个用于分析JVM的开源工具。它具有扩展性,并支持多种插件。其中,VisualGC和VisualVM VSX插件被广泛使用来监控和分析JVM。

要安装这些插件,请打开VisualVM,选择“工具” -> “插件”菜单,然后选择所需的插件进行安装。接下来,选择所需的JVM进程,使用VisualGC和VisualVM VSX插件进行监控和分析。

4. 使用命令行工具

如果需要使用命令行工具来监控JVM,则可以使用Jstat和Jmap命令。Jstat命令可用于监控JVM性能。它可以显示堆和垃圾回收信息。Jmap则可以用于生成JVM内存的Dump文件。

以下是Jstat命令的使用示例:

“`

jstat -gcutil 1000 10

“`

此命令将显示指定进程的垃圾回收情况,每秒更新一次,共持续10次。

以下是Jmap命令的使用示例:

“`

jmap -dump:format=b,file=myfile.bin

“`

此命令将生成一个名为myfile.bin的Dump文件,包含指定进程的JVM内容。

结论

相关问题拓展阅读:

JVM对于signal的处理及案例分析

Windows的Signal相对少一些, 如下:

Linux的Signal比较多, 如下:

Linux中的Signal可以由 kill 命令发起, 比如 kill -1 是对某一个进程发出SIGHUP信息.

JVM 所使用的信号:

信号的类型为

异常、错误、中断和控制码郑

表 1

注:

信号名称后提供的数字是该信号的标准数值。

使用 -Xrs(减少信号使用)选项来防止 JVM 处理大多数的信号。有关更多信息,请参阅 Oracle 的 Java™ 应用程序启动程序页面 。

JVM 线程上的信号 1(SIGHUP)、2(SIGINT)、4(SIGILL)、7(SIGBUS)、8(SIGFPE)、11(SIGSEGV)和 15(SIGTERM)导致 JVM 关闭;因此,应用程序信号处理程序不应该尝试从这些信号恢复,除非它不再需要 JVM。

以上表格引用原文链接:

至于JVM是如何处理这些Signal的, 请参考以下链接:

除了JVM默认处理Signal的行为, 我们还可以自定义 SignalHandler 来做一些额外的工作, 比如在关闭JVM之前做一些回收或记录的事情.

例子:

关闭钩子使用的方法也很简单, Runtime.getRuntime().addShutdownHook(Thread hook) 即可。关闭钩子其实可以看成是一个已经初始化了的但还没启动的线程,当

JVM关闭时会并发地执行注册的所有关闭钩子

JVM的关闭方式可以分为三种:

注意:

Hook线程在JVM

正常关闭

才会执行,在强制关闭时不会执行。(异常关闭没试过, 有空试一下..)

另外在使用关闭钩子还要注意以下几点:

Spring

在初始化容器的时候就会注册一个hook线程用于清理容器.

JVM进程已经不在了, 重迟枣颂启后, 几分钟到半小时之间, 会看到获取不到spring bean的错误日志, 同时系统服务异常.

奇怪的是, 2台集群中的其他一台一直都是稳定运行, 只有这台是一直异常状态.

从以上的日志, 可以看出spring容器已经在销毁中了, 感觉是一个正常的关闭系统的流程.

在监控系统(Marvin)中观察了内存的情况, 没有什么波动, 基本排除了oom的情况.

接下来, 我使用jstack输出了当时的线程栈信息, 保留现场痕迹.

由上图所示, 从jstack日志中发现了2个关键的点:

自此, 大家可能已经看出来,

SIGHUP

正是JVM会处理的Signal之一, 并且在上面的表格中已经清楚的写着

SIGHUP

的操作是

挂起, 让JVM正常退出

,

SIGHUP

中断

类型的信号, 上面对于

中断

类型的信号是这样描述的:

将从 JVM 进程外部异步发出中断信号以请求关闭。

结论:

可惜的是, 找了很多资料, 始终没有找到确定信号来源的方案. Linux本身也没有相关的日志, JVM也只能获取信号的名称, 对于信号源也是无法确定.(如果有这方面研究的同学望告知..)

找不到根本原因, 那么只能是想办法绕过这个问题.

所幸的是, 在搜索问题的时候, 让我知道了Linux还有一个岩漏 nohup 的命令.

nohup命令可以将

程序以忽略挂起信号(

SIGHUP)的方式运行起来,被运行的程序的输出信息将不会显示到终端。

于是把JVM的启动脚本改动了一下:

再次启动后, 稳定运行, 问题解决.

实际上通过JVM本身 -Xrs 的参数应该也能控制忽略SIGHUP信号的, 但是时间关系, 我没去实验..

这里案例也让我学到了很多JVM的处理细节.

同时也有了一些思考:

排查线上故障的基本步骤无非就是

实际上, 前面3步基本上已经能解决大部分的问题了, 剩下的一些疑难问题才会用到第4步. 但是第4步的操作对于实时性的要求是更高的, 必须之一时间搞定, 晚一点可能你就捕捉不到有效的证据了.

怎么查看linux的jvm内存

以WAS为例:

$ ps -ef | grep java

root 1 0 Sep17 ?:02:48 /opt/IBM/带帆WebSphere/AppServer/java/bin/java -Xms50m -Xmx256m

-Xms 和 -Xmx 分别代表分配JVM的最小内存和更大内存。

dump内存format b什么意思

其中jmap是java自带的工具查看整个JVM内存状态jmap-heap要注意的是在使用CMSGC情况下,jmap-heap的执行有可能会备消导致JAVA进程挂起查看JVM堆中对象详细占用情况jmap-histo导出整个JVM中内存信息jmap-dump:format=b,file=文件名jhat是sun1.6及以上版本中自带的一个用于分析JVM堆DUMP文件的工具,基于此工具可分析JVMHEAP中对象的内存占用情况jhat-J-Xmx1024M执行后等待console中输入startHTTPserveronport7000即可使用浏览器访问IP:7000eclipseMemoryAnalyzerEclipse提供的一个用于分析JVM堆Dump文件的插件。借助这个插件可查看对象的内存占用状况,引用关系,分析内存泄露等。kill-3在Linux上找到Java所在的进程号,然后执行以上命令,线程的相关信息就输出到consolejstackjstack是sunJDK自带的工具,通过该工具可以看到JVM中线程的运行状况,包括锁等待,线程是否在运行执行jstack,线程的所有堆栈信息”http”daemonprio=10tid=x0a949bb60nid=0x884waitingformonitorentry”http”这个线程处于等待状态。waitingformonitorentry如果在连续几次输出线程堆栈信息都存在于同一个或多个线程上时,则说明系统中有锁竞争激烈,死锁,或锁饿死的想象。“http”daemonprio=10tix=nid=inobject.wait()java.lang.Thread.State:waiting(onobjectmonitor)该表示http的线程处芹搏于对象的Wait上,等待其他线程的唤醒,这也是线程池的常见用法。“LowMemoryDetector”daemonprio=10tix=xxnid=runnablejava.lang.Thread.State:runnable表示“LowMemoryDetector”的线程处于Runable状态,等待获取CPU的使用权.参考:/blog/static//jvisualvm一.JavaVisualVM概述对于使用命令行远程监控jvm太麻烦。在jdk1.6中Oracle提供了一个新的可视化的。JVM监控工具JavaVisualVM。jvisualvm.exe在JDK的bin目录下。双击启动JavaVisualVM后可以看到窗口左侧“应用程序”栏中有“本地”、“远程”、“快照”三个项目。“本地”下显示的是在localhost运行的Java程序的资源占用情况,如果本地有Java程序在运行的话启动JavaVisualVM即可看到相应的程序名,点击程序名打开相应的资源监控菜单,以图形的形式列出程序嫌滚祥所占用的CPU、Heap、PermGen、类、线程的统计信息。“远程”项下列出的远程主机上的Java程序的资源占用情况,但需要在远程主机上运行jstatd守护程序VisualVM分为3类,本地它会自动侦测到,并显示出来双击Local下的任一节点,看到右边的变化,你可以监控CPU,内存,类,线程等运行状况,实时监控服务器性能。右键VisualVM我们可以看到ThreadDump,HeapDump做ThreadDump很快,马上就可以看到结果HeapDump要稍花费一些时间(可以看到当前heap里对象的数量及占用的比例,做OOM很好用)对其功能不再做描述,可以查阅网上相关质量,我们主要讲的是如何使用VisualVM远程监控。关于linux jvm可视化监控的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 快速掌握Linux JVM可视化监控技巧 (linux jvm可视化监控)