tomcat尽量使用ip_hash规则,这样同一ip的连接会在同一台机器上。
Tomcat性能优化
Jps
Jstack
Jmap
一、Jps
用来查看基于HotSpot JVM里面所有进程的具体状态,包括进程ID,进程启动的路径等等。
与unix上的ps类似,用来显示本地有权限的java进程,可以查看本地运行着几个java程序,
并显示他们的进程号。使用jps时,不需要传递进程号做为参数。
Jps也可以显示远程系统上的JAVA进程,这需要远程服务商开启了jstat服务,以及RMI注及服务,
不过常用都是对本地的JAVA进程的查看。
命令格式:
jps [options][hostid]
常用参数说明:
-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。
-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。
-v 输出传给JVM的参数。
常用命令:
查看进程ID:jps
查看程序启动路径等:jps -lvm
二、Jstack
如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如果崩溃和在程序何处发生问题。另外,jstack工具还可以附属在正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
命令格式:
$jstack[option]pid
$jstack[option]executable core
$jstack[option][server-id@]remote-hostname-or-IP
常用参数说明:
OPTIONS
-F jstack [-l] pid 无法响应时,强制打印堆栈
-l 长列表,打印关于锁的附加信息,例如属于 java.util.concurrent的ownable synchronizers列表
-m 混合模式输出(包括java和本地c/c++片段)堆栈。
pid: java应用程序的进程号,一般可以通过jps来获得;
executable:产生core dump的java可执行程序;
core:打印出的core文件;
remote-hostname-or-ip:远程debug服务器的名称或IP;
server-id:唯一id,假如一台主机上多个远程debug服务;
三、Jmap
打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。
可以输出所有内存中对象的工具,甚至可以将VM中的heap,以二进制输出成文本 。使用方法jmap -histo pid.
如果连用SHELL jmap -histo pid>a.log 可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format =b,file=outfile 3024可以将3024进程的内存heap输出出来到outfile文件中,再配合MAT(内存分析工具)(Memory Analysis Tool)或与jhat(Java Heap Analysis Tool)一起使用,能够以图像的形式直观的展示当前内存是否有问题。
64位机上使用需要使用如下方式:
jmap -J-d64 -heap pid
命令格式:
jmap [option]pid
jmap [option]executable core
jmap [option][server-id@]remote-hostname-or-IP
参数说明
1)、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服务
2)、基本参数:
-dump:[live]format=b,file= 使用hprof二进制形式,输出jvm的heap内容到文件=.live子选项是可选的,
假如指定live选项,那么只输出活的对象到文件。
-finalizerinfo 打印正等候回收的对象的信息
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况
-histo[:live]打印每个class的实例数目,内存占用,类全名信息。VM的内部类名字开头会加上前缀"*".如果live子参数加上后,只统计活的对象数量。
-permstat打印classload和jvm head长久层的信息.包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量。另外,内部String的数量和占用内存数也会打印出来。
-F 强迫.在pid没有相应的时候使用-dump 或者-histo参数.在这个模式下,live子参数无效.
-h|-help 打印辅助信息
-J 传递参数给jmap启动的jvm.
pid需要被打印配相信息的java进程id
企业案例:JAVA进程占用CPU过高
jps获取java进程的PID。
jstack pid >> java.txt 导出CPU占用高进程的线程栈。
top -H -p PID 查看对应进程的哪个线程占用CPU过高。
echo “obase=16; PID”|bc 将进程的PID转换为16进制。
在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。
分析负载高的线程栈都是什么业务操作。优化程序并处理问题。