2012年4月19日星期四

JVM命令行分析工具

先附上一张JVM参数大全:http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm
1. jstat-是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。
命令行格式:

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]


jstatOptions:
-gcutil 打印gc的统计信息,例如 jstat -gcutil 1234 1000 100 表示每隔1秒打印一次pid为1234的gc统计信息,打印100次;

S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
100.00   0.00   7.86  96.32  99.36 124512  329.588   346  161.916  491.504
  0.00  97.27  21.61  96.33  99.36 124513  329.591   346  161.916  491.507
  0.00  91.02  99.64  96.38  99.36 124515  329.597   346  161.916  491.513
E:Eden区使用的百分比;
O:Old区使用的百分比;
P:perm区使用的百分比;
YGC:youngGC的次数;
YGCT:youngGC总共耗时(秒)
FGC:fullGC的次数
FGCT:fullGC的总耗时(秒)
GCT:GC总共耗时
-----------
其他选项:

-class Option 显示class的数量和占用空间等情况
-compiler Option 显示VM实时编译的数量等信息;
-gc Option 显示GC的一些信息,包含各个区所占大小和GC的次数以及时间统计
-gccapacity Option
-gccause Option
-gcnew Option
-gcnewcapacity Option
-gcold Option
-gcoldcapacity Option
-gcpermcapacity Option
-printcompilation Option
2.jstack 打印JVM堆栈信息,可以通过这个命令查询cpu过高或死锁一类的问题。
例如:jstack -l 1234 打印pid为1234的JVM的堆栈信息;
如果cpu占用过高,可以关注那些runnable的进程;
如果停止响应,可以关注那写locked的进程信息;
3.jmap-对JVM的内存进行查询或dump操作的命令;例如:jmap -histo pid 可以打印出JVM中占用内存按排名的java对象个数和所占内存大小;
命令行格式:

       jmap [ option ] pid
       jmap [ option ] executable core
       jmap [ option ] [server-id@]remote-hostname-or-IP

options:
executable Java executable from which the core dump was produced.
(可能是产生core dump的java可执行程序)
core 将被打印信息的core dump文件
remote-hostname-or-IP 远程debug服务的主机名或ip
server-id 唯一id,假如一台主机上多个远程debug服务
基本参数:
-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-h | -help 打印辅助信息
-J 传递参数给jmap启动的jvm.
pid 需要被打印配相信息的java进程id,创业与打工的区别 - 博文预览,可以用jps查问.
常用命令:
jmap -histo pid 打印内存中的对象信息;
jmap -dump:format=b file=heap.bin pid 将JVM以2进制文件的形式dump到磁盘上;
heap.bin可以通过mat或jhat进行进一步分析;
4. jhat&mat
分析jvm-dump的二进制文件的两种方法,其中mat是eclipse插件,jhat是命令行工具;
命令格式:
jhat [ options ] <heap-dump-file>


例如:jhat -J-Xmx512m heap.bin 可以在本地的7000端口启动一个服务,可以通过浏览器来访问获取统计信息;

2012年4月13日星期五

zookeeper笔记

zookeeper是hadoop的开源子项目。地址:http://zookeeper.apache.org
1. zookeeper是分布式的;
2. zookeeper是开源的;
3. zookeeper是一个协调服务,用于协调分布式应用的;
4. 典型应用:同步,配置维护,集群和命名服务;
设计目标:
1. 简单易用
2. 互相复制
3. 有序操作
4. 性能强大,处理速度快;
命名空间被设计成很类似一个文件系统,只不过无论是文件还是文件夹,都会有它自己的value。
zookeeper保证:
  • 顺序一致性 - Updates from a client will be applied in the order that they were sent.
  • 原子性 - Updates either succeed or fail. No partial results.
  • 单一的系统视图 - A client will see the same view of the service regardless of the server that it connects to.
  • 可靠性 - Once an update has been applied, it will persist from that time forward until a client overwrites the update.
  • 及时性 - The clients view of the system is guaranteed to be up-to-date within a certain time bound.

zookeeper的简单API:

create  creates a node at a location in the tree


delete  deletes a node
exists  tests if a node exists at a location
get data  reads the data from a node
set data writes data to a node
get children retrieves a list of children of a node
sync  waits for data to be propagated


更多可以查看zookeeper的官方文档:http://zookeeper.apache.org/doc/r3.3.2/zookeeperOver.html
zookeeper的应用场景:
1. 实时配置信息(client有一个watcher监控变化,实时改变)
2. 全局变量(是分布式应用级的,而非某单独事例)
3. 动态数据获取和更新(动态数据获取,以及人为更新,可以不通过接口方式实现)
4. 命名服务(Naming)
5. push的心跳检测,可以通过配置检测服务与zookeeper交互,而不直接与server交互)
6. 分布式锁(有点类似memcached的mutex模式中的add)
7. 集群, 例如分布式服务管理,动态增加或删除一个分布式服务,而无需重启。
8. 分布式队列
一个使用zookeeper作为协调RMI服务的例子。
目的:
         使用zookeeper作为RMI协调服务。在使用spring管理RMI服务的基础上,修改spring加载RMI的代码,加入zookeeper,使得spring由固定代理一个指定的RMI stub,变为动态加载多个RMI stub并且可以动态增减。

2012年4月12日星期四