`
44424742
  • 浏览: 233101 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Java编程

阅读更多

文章分类:Java编程

一直没有做过jvm监控, 总以为要找些专门的工具才能做jvm监控, 如jprofile之类的工具, 但这类工具都是收费的。

经过查找,发现其实sun的jdk中就带有这类工具,从jdk5开始命令行有了jstat,jps,jstatd,图形监控有了jconsole;而到了jdk6,命令有了jmap, jinfo, jstack,图形有了jvisualvm。经过简单试用,这些命令+图形工具 已经足够强大, 能满足一般的监控要求了,如对各类内存、垃圾回收、线程状态的监控。

命令:

以下转自:http://hqman.iteye.com/blog/167796

jstatd
启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。
实例:jstatd -J-Djava.security.policy=my.policy

my.policy文件需要自己建立,内如如下:
grant codebase "file:$JAVA_HOME/lib/tools.jar" {
permission java.security.AllPermission;
};
这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作

jps
列出所有的jvm实例
实例:
jps
列出本机所有的jvm实例

jps 192.168.0.77
列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099
(前提是远程服务器提供jstatd服务)

输出内容如下:
jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps
6286 Jps
6174 Jstat

jconsole
一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。

jinfo(linux下特有)
观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
实例:jinfo 2083
其中2083就是java进程id号,可以用jps得到这个id号。
输出内容太多了,不在这里一一列举,大家可以自己尝试这个命令。

jstack(linux下特有)
可以观察到jvm中当前所有线程的运行情况和线程当前状态
jstack 2083
输出内容如下:


jmap(linux下特有,也是很常用的一个命令)
观察运行中的jvm物理内存的占用情况。
参数如下:
-heap
:打印jvm heap的情况
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况
-permstat:打印permanent generation heap情况

命令使用:
jmap -heap 2083
可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况
输出内容:


jmap -histo 2083 | jmap -histo:live 2083
可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
输出内容:

写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。

jstat
最后要重点介绍下这个命令。
这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息
具体参数如下:
-class:统计class loader行为信息
-compile:统计编译行为信息
-gc:统计jdk gc时heap信息
-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件
-gcnew:统计gc时,新生代的情况
-gcnewcapacity:统计gc时,新生代heap容量
-gcold:统计gc时,老年区的情况
-gcoldcapacity:统计gc时,老年区heap容量
-gcpermcapacity:统计gc时,permanent区heap容量
-gcutil:统计gc时,heap情况
-printcompilation:不知道干什么的,一直没用过。

jstat也提供远程能力,



一般比较常用的几个参数是:
jstat -class 2083 1000 10 (每隔1秒监控一次,一共做10次)
输出内容含义如下:

Loaded Number of classes loaded.
Bytes Number of Kbytes loaded.
Unloaded Number of classes unloaded.
Bytes Number of Kbytes unloaded.
Time Time spent performing class load and unload operations.









jstat -gc 2083 2000 20(每隔2秒监控一次,共做10)
输出内容含义如下:

S0C Current survivor space 0 capacity (KB).
EC Current eden space capacity (KB).
EU Eden space utilization (KB).
OC Current old space capacity (KB).
OU Old space utilization (KB).
PC Current permanent space capacity (KB).
PU Permanent space utilization (KB).
YGC Number of young generation GC Events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.



















输出内容:

图形:

visualvm

http://www.iteye.com/topic/516447

如果是本地监控,则可以直接在本地的 窗口中看到java应用程序。双击点开即可打开监控窗口。

我们再看一下图1,左边的窗口中,第二个节点—Remote,它可以用来操作远程机器。远程机器需要启动一个daemon:jstatd

1、远程机器启动jstatd

1.1、首先需要准备一个java.policy文件,保存到如/home/admin/jstatd.java.policy

grant codebase "file:${java.home}/../lib/tools.jar" {

permission java.security.AllPermission;

};

1.2、启动jstatd

jstatd -J-Djava.security.policy=/home/admin/jstatd.java.policy -J-Djava.rmi.server.logCalls=true

1.3、同时需要执行一个命令看看(linux需要)

Hostname –i

如果显示是127.0.0.1,则需要修改/etc/hosts文件,去掉对本机名的配置,让本机名解析到它的IP地址,如10.20.131.214

2、连接远程机器



(8)

3、点击OK,看到会连接到远程机器,并显示出它下面的java进程。


jconsole

http://www.blogjava.net/beansoft/archive/2006/12/13/87494.html

监控本地应用

首先就是启动您要监控的应用, 例如我用 JDK 1.6 来启动了 Tomcat, 或者 Eclipse 也可以, 可以在任务管理器(Ctrl+Alt+Del可以调出来, 或者在任务栏点击右键)里看到进程ID, 例如我这里是 6132.

接着在 JDK 安装目录中(<JDK_HOME>/bin/jconsole.exe)启动 jconsole.exe (双击或者在 cmd 里面敲入 jconsole), 主界面会提示您建立一个新连接:

可以看到进程ID, 选择它, 然后点击"连接". 这些 ID 必须都是用 JDK 1.6 的 java.exe 启动的, 否则在列表里看不到.

JConsle 能监控内存,线程,类的数目和CPU然后点击各个 Tab 可以看到详细的输出, 详细的输出包括:
内存: 堆/非堆, 峰值, 内存的各个部分, 例如 Perm, Eden 等的大小曲线图.
线程: 峰值, 所有线程的列表, 堆栈跟踪(哪个对象中的线程)等. 还可以强制执行GC.
类: 峰值, 类总数曲线图.
MBean: 一些 JVM 参数的详细 MBean 信息.

监控远程进程

首先需要在运行的应用上启用远程管理, 参数如下(简单期间就不加用户验证了):
java -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar ../demo/jfc/Java2D/Java2Demo.jar

然后连接的时候选择远程进程, 地址输入:

localhost:1090

即可.当然在别的电脑上(一般是局域网)可以输入那个电脑的IP.

综述: 使用 JConsole 可以简单的监控 Server 状态, 但是本身要占一定的资源, 不过 JVM 自带的监控, 理论上讲应该是占资源很小很小的, 可以用它来方便的了解 Web 服务器应用进程的状态. 如果要调优应用, 还是使用 JProfiler 等工具更好一些, 当然它们占的资源也更大.

a)使用 jps 查看远端机器有哪些 JVM 进程在使用当中,命令如下:

jps 172.25.1.24 // 远端机器的 IP 地址或名称

屏幕输入如下:

13686 Jstatd

14115 XXXJavaServer

15117 Jserver

b)从上面可以看到远端机器的 Jstatd 进程已经启动起来了。我们就可以使用 jstat 对相关进程的具体情况进行查看。

Jstat 命令用法如下:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

解释如下:

Option 包括以下选项:

-class

-compiler

-gc

-gccapacity

-gccause

-gcnew

-gcnewcapacity

-gcold

-gcoldcapacity

-gcpermcapacity

-gcutil

-printcompilation

Vmid 就是 jps 查看到的进程 id ,如上 Jserver 的进程 id 是 15117 。

Interval 是时间间隔,单位为毫秒, 1000 就是一秒。

Count 就是需要查看的次数。

例子假设我们需要查看 172.25.1.24 机器 vmid 为 15117 的 gc 的情况,可以输入下面的命令:

jstat -gc 15117@172.25.1.24 1000 3

然后你能看到四行信息(一行为 title ,剩下的就是你要的信息了),仔细看看就可以发现很多信息的了。

c) jstat还有一个可视化的监控包, 叫做jvmstat ,可以从sun的主页下载到。下载好了后,解压到任意目录。

执行 visualgc <pid> ,其实命令跟jstat很像,也可以监控到远程主机。然后就可以看到可视化的监控窗口。还挺酷的。

分享到:
评论

相关推荐

    JAVA编程题全集(100题及答案)——直接打印

    JAVA 编程题全集知识点总结 本资源提供了一个完整的 JAVA 编程题全集,涵盖了大量的题目和经典的解法,非常适合刷学完基础、刷题前的知识总结与开拓。以下是从资源中提取的重要知识点: 1. JAVA 基础知识:资源中...

    Hbase JAVA编程开发实验

    Hbase JAVA编程开发实验报告以及代码,1 按照“Hbase应用开发实验1.pdf”中给出的说明,完成相关相关实验及JAVA程序的编写、调试和运行,提交JAVA源程序(AccessObject.java, HBaseTester.java, User.java)及运行...

    Java编程开发 JAVA程序设计课程标准.doc

    通过以上内容的学习,学生将逐步建立起Java编程的知识框架,为后续更复杂的编程挑战做好准备。此外,课程还鼓励学生积极参与实践,通过实际编程项目来巩固所学,提高问题解决能力,最终形成具备职业竞争力的Java...

    高质量java编程

    《高质量Java程序设计》是林锐的一本经典著作,它深入浅出地讲解了如何编写出高质量、可维护的Java程序。这本书对于Java开发者来说,是提升编程技能和理解Java精髓的重要参考资料。以下是对该书内容的一些关键知识点...

    java程序设计例题全集

    本资源“java程序设计例题全集”显然是一份涵盖了大学Java程序设计课程中各种实例的集合,旨在帮助学习者深入理解和掌握Java编程。 标题中的“java程序设计例题全集”意味着这份资料包含了大量关于Java编程的实践...

    Java程序设计实验报告

    作为Java编程的入门示例,"Hello World"程序展示了最基本的程序结构。在实验中,学生被要求使用EditPlus和Eclipse分别编写并运行这个程序,输出"Hello World"。通过这个简单的例子,学生可以理解Java程序的基本框架...

    [Java] Java 编程面试揭秘 英文版

    [Wrox] Java 编程面试揭秘 英文版 [Wrox] Java Programming Interviews Exposed E Book ☆ 图书概要:☆ If you are a skilled Java programmer but are concerned about the Java coding interview process ...

    JAVA程序设计教程第2版.pdf

    该标签清晰地表明了该资源的主要内容是关于 JAVA 编程和程序设计的。该标签包括三个部分:java、开发、程序设计。 知识点: * JAVA 是一种编程语言,主要用于开发大型应用程序。 * JAVA 编程需要学习和掌握各种...

    Java程序设计精讲课件

    Java程序设计精讲课件是一套全面讲解Java编程的教育资源,主要涵盖了泛型、集合类、Java输入输出以及反射等核心概念。这套课程旨在帮助初学者深入理解和熟练掌握Java编程技术,同时也适合有一定基础的开发者进行知识...

    基于计算机软件开发的JAVA编程应用初探.pdf

    在计算机软件开发中,Java编程语言的应用是极为广泛与深远的。Java语言自问世以来就以其独特的特性和优势吸引了大量开发者的注意,这些特性包括但不限于其平台独立性、内存管理优化、面向对象的编程设计以及其强大的...

    JAVA编程题-全集(含答案).pdf

    本资源汇集了多个 Java 程序设计题目,涵盖了 Java 基础知识、控制结构、函数设计、面向对象编程等多方面的知识点。 1. Java 程序设计总复习题 1:编写一个 Java 程序在屏幕上输出“你好!”。本题目考察了 Java ...

    java程序设计教程课后答案

    课后答案可以帮助你验证对这些概念的理解,找出不足之处,加深对Java编程的掌握。同时,分享和讨论这些答案也能促进团队学习,共同进步。在实践中不断应用和反思,将理论知识转化为实际编程能力,是成为一名优秀的...

    Java编程入门.pdf

    Java编程入门是计算机编程语言Java的基础学习指南,它向初学者介绍了Java编程语言的核心概念和基础知识。这份资料特别强调了Java编程在手机游戏开发中的应用,但其内容并不局限于此,而是包含了更广泛的Java基础知识...

    Java程序设计 基础、编程抽象与算法策略源码

    这本书通过丰富的实例和练习,引导读者逐步掌握Java编程的核心知识,培养解决问题和设计程序的能力。 1. **Java基础知识**:书中首先介绍了Java语言的基础,包括语法特性、数据类型、变量、运算符、流程控制语句...

    Java编程语言的第一个程序.docx

    Java 编程语言的第一个程序 一、Java 基础知识 Java 是一种高级语言,用于开发大型应用程序。Java 的第一个程序是学习 Java 的基础,了解 Java 的基本概念和结构是非常必要的。 二、JDK、JRE、JVM 的关系 JDK...

    计算机软件Java编程特点及其技术分析 (1).pdf

    Java编程是目前世界上最流行的编程语言之一,广泛应用于企业级应用开发、移动应用、Web应用等各个领域。Java语言之所以能够得到如此广泛的应用,主要得益于其众多独特的优势和特点。 首先,Java语言是一种面向对象...

    Java编程的逻辑

    Java编程的逻辑是软件开发领域中的重要组成部分,尤其对于初学者和有经验的开发者来说,深入理解Java语言的原理和逻辑至关重要。Java以其跨平台、面向对象和强大的库支持等特性,成为全球范围内广泛使用的编程语言之...

    清华Java程序设计实例教程

    《清华Java程序设计实例教程》全面覆盖了Java编程的基础知识和面向对象编程的概念,结合实例帮助读者理解和应用。通过学习,读者不仅能够掌握Java语法,还能理解如何利用Java进行软件开发,包括异常处理、集合框架的...

Global site tag (gtag.js) - Google Analytics