• jvm调优相关


    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

    3、将jmxremote.password权限修改为600(chmod 600 jmxremote.password)

    4、将jmxremote.access和jmxremote.password用户/用户组设置成相同(chown 用户:用户组 jmxremote.password)

  • 相关阅读:
    (转)Netfilter分析
    (转)offsetof与container_of宏[总结]
    GNU GCC 扩展属性
    eclipse快捷键
    数据库SQL优化大总结之 百万级数据库优化方案(转载)
    公钥,私钥和数字签名这样最好理解 (转载)
    注解方式实现输入参数验证
    统一异常处理@RestContrllerAdvice,@ExceptionHandler(转载)
    JSONField解决序列化与反序列化字段匹配问题
    JDBC事务控制管理(转载)
  • 原文地址:https://www.cnblogs.com/jis121/p/11226489.html
Copyright © 2020-2023  润新知