jvm基本知识
-Xms3072M java堆内存大小
-Xmx3072M java堆内存的最大大小
-Xmn2048M java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了
-Xss1M 每个线程的栈内存大小
-XX:PermSize=256M 永久代大小
-XX:MaxPermSize=256M 永久代最大大小
-XX:SurvivorRatio=8 伊甸区和幸存区的比例8:1:1
-XX:MaxTenuringThreshold=5 5次YGC还没有回收掉的话,则进入老年代
-XX:PretenureSizeThreshold=1M 1M的对象直接进入老年代
-XX:+UseParNewGC 新生代使用ParNew
-XX:+UseConcMarkSweepGC 老年代使用CMS
-XX:CMSInitiatingOccupancyFaction=92 老年代空间使用超过92%,此时自行触发fullGC
-XX:+UseCMSCompactAtFullCollection 此项默认打开,意思是Full GC之后,要Stop the World ,然后进行碎片整理
-XX:CMSFullGCsBeforeCompaction=0 设置为0时,每次fullGC后都做一次碎片整理
-XX:+PrintGCDetails 打印gc日志
-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFaction=92 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0
查找占用cpu过高的线程,并排查原因
1、查找jvm进程
(1)jps -l
(2)ps -ef|grep java
这一步骤可以得到进程号,假如进程号为9527
2、查找该jvm进程中占用cpu比较高的线程
(1)top -Hp 9527
这一步可以得到一批线程号,根据使用率从高到低排序,找到使用率最高的那个,假如线程号为3366110
(2)printf "%x
" 3366110
将此线程号转成16进制,结果为:335cde
3、从stack信息中找到335cde所对应的线程及内容
(1)jstack -l 9527 | grep -C 5 335cde
-l 可以查看线程中的锁的附加信息,也可以不加-l
9527为pid
grep -C 5 549d为输出《335cde》前后5行
335cde为16进制的线程编号
4、分析335cde所对应的内容,一般很容易定位到代码,并找到原因
注:第三步也可以改为 -> 导出stack信息,然后查找335cde
jstack pid > jstack4756jis
从jstack4756jis这个文件中查找335cde,即可找到消耗资源最高的线程执行的程序
如果jstack pid卡住了,可以使用jstack -F pid 强行输入
导出堆信息进行排查
jmap获取堆信息
jmap -dump:format=b,file=fileName.hprof pid
查看内存回收情况
jstat -gcutil pid
jconsole、jvisualvm连接远程服务,服务端的配置
1、修改catalina.sh信息,添加以下
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=47.107.80.230 -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=true"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.access.file=/hzx/installsoftware/java/jdk1.8.0_192/jre/lib/management/jmxremote.access"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.pwd.file=/hzx/installsoftware/java/jdk1.8.0_192/jre/lib/management/jmxremote.password"
2、修改用户jdk安装目录jre/lib/management下jmxremote.access和jmxremote.password信息
jmxremote.access添加以下信息
admin readonly
root readwrite
create javax.management.monitor.,javax.management.timer.
jmxremote.password添加以下信息
monitorRole 12345678 //用户名:monitorRole,这个名字系统是预先设置好的
admin 123456 //自定义了用户名:admin
root 123456 //自定义了用户名:root