//监控CPU、内存、网卡
dstat -t -clmnsyr --tcp --net-packets -N eth0,eth1
//查看接口连接数
netstat -an |grep 20888 |awk '{print $5}'|awk -F: '{print $4}' |sort |uniq -c | sort --sort=n
//监控CPU、内存、网卡
sar -u -n DEV -n TCP -b -B -q -W -S -t 1
抓堆栈
/usr/java/jdk1.7.0_76/bin/jstack (pid)21792 >/tmp/of.txt
堆栈
jmap -heap pid
JVM 抓取GC的回收频次和回收时间
jstat -gcutil pid 1000 300
JVM 调优分配
1、分配JVM内存可以通过xms分配最小内存,xmx分配最大内存,最好xms=xmx, 以避免每次垃圾回收完成后JVM重新分配内存。。
2、jvm内存回收,采用分代试回收,jvm 分为新生代(Eden区、survivor区)、老年代。
3、-xmn来制定新生代大小,通过-XX:SurvivorRation来调整eden和survivor两个区域的大小。
4、-Xmn2g设置年轻代大小为2G。总内存分配大小为4G,年轻代大小为2G,持久代大小默认为64M,增大年轻代,注定要减少老年代的内存分配大小。
5、-Xss128K,设置每个线程的堆栈大小为128K,默认每个线程大小为1M,内存固定的情况下,减少每个线程的大小将会生成更多的线程。理想的值应该在3000-5000范围内。
另一种方式为通过比例设置( java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0):
1、JVM内存分配最大内存4G,最小内存为4G,避免每次垃圾回收后,重新分配JVM内存。
2、-Xss128k 设置每个线程的大小为128K。
3、-XX:NewRatio=4:设置年轻代和老年代占比,年轻代包含(eden和两个survivor)与老年代的占比(除去持久代)。年轻代与老年代的占比为1:4。
4、-XX:SurvivorRation=4设置年轻代,eden区和survivor的占比,单一survivor占比为1/6
5、-XX:MaxPermSize=16m 设置之久代的大小为16M
6、-XX:MaxTenuringThreshold=0,这3
7、吞吐量优先的场景,选择并行收集。响应时间优先,选择并发收集。
8、 响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
* 并发垃圾收集信息
* 持久代并发收集次数
* 传统GC信息
* 花在年轻代和年老代回收上的时间比例