业界有很多强大的java profile的工具,比如Jporfiler,yourkit,这些收费的东西我就不想说了,想说的是,其实java自己就提供了很多内存监控的小工具,下面列举的工具只是一小部分,仔细研究下jdk的工具,还是蛮有意思的呢:)
1:gc日志输出
在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime,jvm将会按照这些参数顺序输出gc概要信息,详细信息,gc时间信息,gc造成的应用暂停时间。如果在刚才的参数后面加入参数 -Xloggc:文件路径,gc信息将会输出到指定的文件中。其他参数还有
-verbose:gc和-XX:+PrintTenuringDistribution等。
2:jconsole
jconsole是jdk自带的一个内存分析工具,它提供了图形界面。可以查看到被监控的jvm的内存信息,线程信息,类加载信息,MBean信息。
jconsole位于jdk目录下的bin目录,在windows下是jconsole.exe,在unix和linux下是jconsole.sh,jconsole可以监控本地应用,也可以监控远程应用。 要监控本地应用,执行jconsole pid,pid就是运行的java进程id,如果不带上pid参数,则执行jconsole命令后,会看到一个对话框弹出,上面列出了本地的java进程,可以选择一个进行监控。如果要远程监控,则要在远程服务器的jvm参数里加入一些东西,因为jconsole的远程监控基于jmx的,关于jconsole详细用法,请见专门介绍jconsle的文章,我也会在博客里专门详细介绍jconsole
3:jviusalvm
在JDK6 update 7之后,jdk推出了另外一个工具:jvisualvm,java可视化虚拟机,它不但提供了jconsole类似的功能,还提供了jvm内存和cpu实时诊断,还有手动dump出jvm内存情况,手动执行gc。
和jconsole一样,运行jviusalvm,在jdk的bin目录下执行jviusalvm,windows下是jviusalvm.exe,linux和unix下是jviusalvm.sh。
4:jmap
jmap是jdk自带的jvm内存分析的工具,位于jdk的bin目录。jdk1.6中jmap命令用法:
Usage:
jmap -histo <pid>
(to connect to running process and print histogram of java object heap
jmap -dump:<dump-options> <pid>
(to connect to running process and dump java heap)
dump-options:
format=b binary default
file=<file> dump heap to <file>
Example: jmap -dump:format=b,file=heap.bin <pid>
jmap -histo <pid>在屏幕上显示出指定pid的jvm内存状况。以我本机为例,执行该命令,屏幕显示:
num #instances #bytes class name
----------------------------------------------
1: 24206 2791864 <constMethodKlass>
2: 22371 2145216 [C
3: 24206 1940648 <methodKlass>
4: 1951 1364496 <constantPoolKlass>
5: 26543 1282560 <symbolKlass>
6: 6377 1081744 [B
7: 1793 909688 <constantPoolCacheKlass>
8: 1471 614624 <instanceKlassKlass>
9: 14581 548336 [Ljava.lang.Object;
10: 3863 513640 [I
11: 20677 496248 java.lang.String
12: 3621 312776 [Ljava.util.HashMap$Entry;
13: 3335 266800 java.lang.reflect.Method
14: 8256 264192 java.io.ObjectStreamClass$WeakClassKey
15: 7066 226112 java.util.TreeMap$Entry
16: 2355 173304 [S
17: 1687 161952 java.lang.Class
18: 2769 150112 [[I
19: 3563 142520 java.util.HashMap
20: 5562 133488 java.util.HashMap$Entry
Total 239019 17140408
为了方便查看,我删掉了一些行。从上面的信息很容易看出,#instance指的是对象数量,#bytes指的是这些对象占用的内存大小,class name指的是对象类型。
再看jmap的dump选项,这个选项是将jvm的堆中内存信息输出到一个文件中,在我本机执行
jmap -dump:file=c:\dump.txt 340
注意340是我本机的java进程pid,dump出来的文件比较大有10几M,而且我只是开了tomcat,跑了一个很简单的应用,且没有任何访问,可以想象,大型繁忙的服务器上,dump出来的文件该有多大。需要知道的是,dump出来的文件信息是很原始的,绝不适合人直接观看,而jmap -histo显示的内容又太简单,例如只显示某些类型的对象占用多大内存,以及这些对象的数量,但是没有更详细的信息,例如这些对象分别是由谁创建的。那这么说,dump出来的文件有什么用呢?当然有用,因为有专门分析jvm的内存dump文件的工具。
5:jhat
上面说了,有很多工具都能分析jvm的内存dump文件,jhat就是sun jdk6及以上版本自带的工具,位于jdk的bin目录,执行 jhat -J -Xmx512m [file] ,file就是dump文件路径。jhat内置一个简单的web服务器,此命令执行后,jhat在命令行里显示分析结果的访问地址,可以用-port选项指定端口,具体用法可以执行jhat -heap查看帮助信息。访问指定地址后,就能看到页面上显示的信息,比jmap -histo命令显示的丰富得多,更为详细。
6:eclipse内存分析器
上面说了jhat,它能分析jvm的dump文件,但是全部是文字显示,eclipse memory analyzer,是一个eclipse提供用于分析jvm 堆dump的插件,网址为 http://www.eclipse.org/mat ,它的分析速度比jhat快,分析结果是图形界面显示,比jhat的可读性更高。其实jvisualvm也可以分析dump文件,也是有图形界面显示的。
7:jstat
如果说jmap倾向于分析jvm内存中对象信息的话,那么jsta就是倾向于分析jvm内存的gc情况。都是jvm内存分析工具,但显然,它们是从不同维度来分析的。jsat常用的参数有很多,如 -gc,-gcutil,-gccause,这些选项具体作用可查看jsat帮助信息,我经常用-gcutil,这个参数的作用不断的显示当前指定的jvm内存的垃圾收集的信息。
我在本机执行 jstat -gcutil 340 10000,这个命令是每个10秒钟输出一次jvm的gc信息,10000指的是间隔时间为10000毫秒。屏幕上显示如下信息(我只取了第一行,因为是按的一定频率显示,所以实际执行的时候,会有很多行):
S0 S1 E O P YGC YGCT FGC FGCT GCT
54.62 0.00 42.87 43.52 86.24 1792 5.093 33 7.670 12.763
额……怎么说呢,要看懂这些信息代表什么意思,还必须对jvm的gc机制有一定的了解才行啊。其实如果对sun的 hot spot jvm的gc比较了解的人,应该很容易看懂这些信息,但是不清楚gc机制的人,有点莫名其妙,所以在这里我还是先讲讲sun的jvm的gc机制吧。说到gc,其实不仅仅只是java的概念,其实在java之前,就有很多语言有gc的概念了,gc嘛就是垃圾收集的意思,更多的是一种算法性的东西,而跟具体语言没太大关系,所以关于gc的历史,gc的主流算法我就不讲了,那扯得太远了,扯得太远了就是扯淡。sun现在的jvm,内存的管理模型是分代模型,所以gc当然是分代收集了。分代是什么意思呢?就是将对象按照生命周期分成三个层次,分别是:新生代,旧生代,持久代。对象刚开始分配的时候,大部分都在新生代,当新生代gc提交被触发后了,执行一次新生代范围内的gc,这叫minor gc,如果执行了几次minor gc后,还有对象存活,将这些对象转入旧生代,因为这些对象已经经过了组织的重重考验了哇。旧生代的gc频率会更低一些,如果旧生代执行了gc,那就是full gc,因为不是局部gc,而是全内存范围的gc,这会造成应用停顿,因为全内存收集,必须封锁内存,不许有新的对象分配到内存,持久代就是一些jvm期间,基本不会消失的对象,例如class的定义,jvm方法区信息,例如静态块。需要主要的是,新生代里又分了三个空间:eden,susvivor0,susvivor1,按字面上来理解,就是伊甸园区,幸存1区,幸存2区。新对象分配在eden区中,eden区满时,采用标记-复制算法,即检查出eden区存活 的对象,并将这些对象复制到是s0或s1中,然后清空eden区。jvm的gc说开来,不只是这么简单,例如还有串行收集,并行收集,并发收集,还有着名的火车算法,不过那说得太远了,现在对这个有大致了解就好。说到这里,再来看一下上面输出的信息:
S0 S1 E O P YGC YGCT FGC FGCT GCT
54.62 0.00 42.87 43.52 86.24 1792 5.093 33 7.670 12.763
S0:新生代的susvivor0区,空间使用率为5462%
S1:新生代的susvivor1区,空间使用率为0.00%(因为还没有执行第二次minor收集)
E:eden区,空间使用率42.87%
O:旧生代,空间使用率43.52%
P:持久带,空间使用率86.24%
YGC:minor gc执行次数1792次
YGCT:minor gc耗费的时间5.093毫秒
FGC:full gc执行次数33
FGCT:full gc耗费的时间7.670毫秒
GCT:gc耗费的总时间12.763毫秒
怎样选择工具
上面列举的一些工具,各有利弊,其实如果在开发环境,使用什么样的工具是无所谓的,只要能得到结果就好。但是在生产环境里,却不能乱选择,因为这些工具本身就会耗费大量的系统资源,如果在一个生产服务器压力很大的时候,贸然执行这些工具,可能会造成很意外的情况。最好不要在服务器本机监控,远程监控会比较好一些,但是如果要远程监控,服务器端的启动脚本要加入一些jvm参数,例如用jconsloe远程监控tomcat或jboss等,都需要设置jvm的jmx参数,如果仅仅只是分析服务器的内存分配和gc信息,强烈推荐,先用jmap导出服务器端的jvm的堆dump文件,然后再用jhat,或者jvisualvm,或者eclipse内存分析器来分析内存状况。
一波三折的rmi调用 | 在路上
分享到:
相关推荐
### 本地转发与集中转发详解 #### 一、引言 在无线网络环境中,本地转发与集中转发是两种常见的数据处理方式。这两种模式各有特点,适用于不同场景下的网络架构设计。本文将详细介绍本地转发和集中转发的工作原理...
绿芽短信转发是一款可以将备用手机中的短信自动转发到微信上的助手软件,主要应用于以下场景: 旅居国外:在国外旅居的用户,希望身在国外时,也能方便地收取到国内手机中的短信。 - 多卡用户:同时拥有多张手机卡...
在IT领域,端口转发是一种网络技术,它允许网络数据包从一个端口转发到另一个不同的端口,通常跨越不同的网络或设备。这种技术在多种场景下非常有用,例如访问受限制的网络服务、测试本地服务器或者保护隐私。在这个...
UDP数据转发工具则是利用UDP协议特性实现数据包从一个网络接口转发到另一个网络接口的应用。 在UDP数据转发中,主要有以下几个关键知识点: 1. **无连接性**:与TCP不同,UDP不建立连接即可发送数据,这意味着它...
在"Netty数据转发工具"的场景中,描述提到的"Netty实现端口数据转发:3000进4000出"意味着通过Netty框架,我们可以构建一个服务器,将接收到的3000端口的数据转发到4000端口。这种数据转发功能在许多网络服务中都有...
用于将一个串口的数据转发到其它多个串口,组成网络,需要占用串口。 本人使用虚拟串口来测试软件的。 如: COM1-2是一对虚拟串口, COM3-4是一对虚拟串口,COM5-6是一对虚拟串口,如果我用工具将COM2的数据转发到...
串口转发工具是一种高效实用的通信技术,它允许用户通过一个物理串口接收数据,并将这些数据实时转发到其他多个串口,以便于在不同设备或应用之间共享数据。在这个场景中,我们可以看到一个名为“串口转发配置.exe”...
端口转发工具是网络通信中的一种重要技术,它允许用户通过一个特定的网络接口(端口)访问在其他网络接口上的服务。PortTunnel作为一款高效实用的端口转发工具,其功能强大,能帮助用户轻松实现TCP和UDP端口的数据...
标题 "PHP域名url转发源码 支持隐性转发.zip" 暗示这是一个使用PHP编写的程序,其主要功能是实现域名URL的转发,并且支持隐性(或透明)转发。这种技术常用于网站管理和SEO优化,允许一个URL重定向到另一个URL,而...
在IT行业中,微信朋友圈一键转发插件是一种便捷的工具,尤其在进行社交媒体营销或数据分析时,能够大大提高效率。本文将详细解析如何通过Java代码实现这一功能,并探讨其背后的技术原理和注意事项。 首先,我们要...
TCP多端口转发工具是一种网络通信技术,它允许数据包从一个特定的源端口转发到多个目标端口。在给定的项目中,数据原本是发送到单一端口的,但现在通过编程实现了一个功能,使得这些数据可以被随机地转发到多个不同...
放大转发是中继通信的基本模式之一,其工作原理是中继节点接收到信号后不进行解码,而是直接将其放大并转发给目的节点。这种方法的优点在于实现简单,但缺点是可能会将噪声一并放大,因此适用于信噪比较高的环境。 ...
本文将详细讲解如何在Servlet中实现请求转发以及用户登录验证。 首先,我们来理解请求转发(Request Forward)。在Servlet中,请求转发是一种在服务器内部将一个请求从一个资源传递到另一个资源的技术。这种方式是...
串口转发助手是一款专为IT专业人士设计的实用工具,它主要功能是帮助用户在不同接口设备之间进行数据通信和调试。在嵌入式系统、物联网(IoT)、自动化设备和许多其他领域的开发工作中,串口通信是常见的硬件接口技术...
在某些情况下,我们可能需要在Windows系统中实现UDP端口的转发,例如,当本地机器需要通过特定端口接收远程服务器的数据,或者隐藏或重定向服务时。Windows 7的内置命令`netsh interface portproxy`虽然能方便地进行...
端口转发-c++一个不错的参考,类似lcx.exe工具 Dos下的软件大家应该会用吧,x:lcx –listen 34 2389,说明一下这句指令的意思,这句话的意思就是监听本机的34端口然后将数据转发到2389端口,当然这里的34 2389端口是...
短信转发器——监控Android手机短信、来电、APP通知,并根据指定规则转发到其他手机:钉钉机器人、企业微信群机器人、飞书机器人、企业微信应用消息、邮箱、bark、webhook、Telegram机器人、Server酱、PushPlus、...
代理转发功能注意事项 在本文中,我们将讨论如何使用 WebLogic 设置代理转发功能,包括简单代理转发功能的注意事项和集群分发的配置步骤。 设置简单代理转发功能 要设置简单代理转发功能,需要创建一个服务或集群...
在很多应用场景中,对于数据的持续和稳定传输有着严格的要求,这就需要使用到Historian的存储转发功能。存储转发功能的配置在Wonderware系统中是一个重要的步骤,它能够确保数据即便在网络不稳定或暂时中断的情况下...
交换机转发实验 计网实验作业-交换机转发实验是计算机网络实验中的一项重要实验,旨在验证交换机的转发功能。该实验涉及到交换机转发实验、哈希函数、转发表、ARP 协议、ICMP 协议等多个知识点。 一、交换机转发...