Java项目相关监控与调优
Linux JVM Tomcat
=========Linux ===============
监控 nmon 命令:nmon -s 10 -c 60 -f -m /home
-s 10 每10s收集一次
-c 60 一共收集60次
-f 保存带时间的文件名
-m 保存目录
=========JVM ====================
监控 jps jstack jstat
jps在linux系统获得java应用进程号 命令:jps -m -l
-------------------------------------
jstat获得gc 内存分配情况 命令:jstat -gcutil pid 3000 6
3000 每3秒收集一次
6 收集6次
JVM配置:
在哪里设置,分好几种情况:
1、集成开发环境下启动并使用JVM,如eclipse需要修改根目录文件eclipse.ini;
2、Windows服务器下安装版Tomcat,可使用Tomcat7w.exe工具(tomcat目录下)和直接修改注册表两种方式修改Jvm参数;
3、Windows服务器解压版Tomcat注册Windows服务,方法同上;
4、解压版本的Tomcat, 通过startup.bat启动tomcat加载配置的,在tomcat 的bin 下catalina.bat 文件内添加;
5、Linux服务器Tomcat设置JVM,修改TOMCAT_HOME/bin/catalina.sh;
不同的中间件服务器有不同的配置方式,tomcat、jboss、weblogic、websphere等各不相同,tomcat的上面已经说了,jboss的在run.sh中设置,weblogic在setDomainEnv.sh中设置,websphere在jvm.options中设置
典型JVM参数设置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:设置JVM最大可用内存为3550M。
-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxPermSize=16m:设置持久代大小为16m。
------------------------------------------------
-----------------------jmap------dump java内存堆-----------------------
jps -m -l查找java进程pid
------------
查找此进程的端口号
netstat -nap | grep pid
netstat -nap | grep 7197
-----------
jmap -heap pid 看此进程的堆信息
dump java堆
jmap -dump:format=b,file=test.bin pid
jmap -dump:format=b,file=test.bin 7023
-----------------------------------------------------------------
-------------------------jstack------------------------------
jstack获得java进程中的堆栈信息 命令:jstack -l pid >d:stack.txt
可以在里面搜寻deadlock等信息,线程死锁。热锁。
也可以统计线程状态信息,如果大量线程都处于wait on condition,若看到线程正在等待网络读写,那么可能会出现了网络瓶颈。
---------------------------------
top查找出哪个进程消耗的cpu高
1、top ,按住shift+p结果是按照cpu占用从高到底排序拿到pid
2、top -H -p pid,然后再按shift+p。这里意思为只查看pid的进程,线程按照cpu占用从高到底排序,显示线程tid。
jstack [进程pid]|grep -A 10 [线程tid的16进制]
-A 10表示查找到所在行的后10行。21233用计算器转换为16进制52f1,注意字母是小写。
输出到文档:jstack [进程pid]|grep -A 10 [线程tid的16进制] >stack01.txt
用IBM thread and monitor dump analyzer for java工具 分析dump文件
说不定可以一下子定位到出问题的代码。
命令:jstack executable core
如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
JVM内存、垃圾回收相关的一些参数设置
JVM 类装载器,执行引擎,运行时数据区(内存)
GC 年轻代 年老代 永久代 gc, full gc
=========Tomcat=================
Tomcat是web容器,装载jsp servlet; Apache装载静态页面html
tomcat 开启文件压缩 线程池 设置等调优
Mysql监控 mysqlmtop
Oracle监控spotlight on oracle
===================iostat监控磁盘==================
yum install sysstat
iostat=>
iostat -d -k 1 10 #查看TPS和吞吐量信息(磁盘读写速度单位为KB) iostat -d -m 2 #查看TPS和吞吐量信息(磁盘读写速度单位为MB) iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)
iostat -c 1 10 #查看cpu状态