美文网首页
Java生产环境下性能监控与调优

Java生产环境下性能监控与调优

作者: 技术灭霸 | 来源:发表于2020-09-16 09:05 被阅读0次

    1、JVM参数

    分为三大类,标准参数、X参数、XX参数

    标准参数

    • -help
    • -server
    • -client
    • -version
    • -showversion
    • -cp
    • -classpath

    X参数

    • -Xint:解释执行
    • -Xcomp:第一次使用就编译成本地代码
    • -Xmixed:混合模式,JVM自己来决定是否编译成本地代码

    XX参数:用于调优和debug

    Boolean类型

    格式:-XX:[+ -]<name>表示启动或禁用name属性:+代表启动 -代表禁用
    比如:-XX: +UseConcMarkSweepGC
    -XX: + UseG1GC

    非Boolean类型,也就是key value类型

    格式:-XX:<name>=<value>表示name的属性的值是value
    比如:-XX:MaxGCPauseMills=500
    -XX:GCTimeRatio=19

    -Xmx -Xms

    它们也属于XX参数
    -Xms等价于-XX:InitialHeapSize 初始化堆大小
    -Xmx等价于-XX:MaxHeapSize 最大堆内存

    jinfo

    jinfo -flag MaxHeapSize 17393 查看端口为17393的最大堆内存
    -XX:MaxHeapSize=2147483648

    jinfo -flag ThreadStackSize 17393 查看线程的内存堆栈大小
    -XX:ThreadStackSize=1024

    2、查看JVM运行时参数

    -XX: +PrintFlagsInitial 初始值
    -XX: +PrintFlagsFinal 结束值

    java -XX:+PrintFlagsFinal -version通过这个命令来查看

    3、如何导出内存映射文件

    第一种:内存溢出自动导出

    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=./

    第二种:使用jmap命令手动导出

    1、先用jps命令找到对应的程序pid


    image.png

    2、使用jmap命令手动导出(当前目录,自定义hprof,后面是程序pid)
    jmap -dump:format=b,file=123.hprof 24077
    3、将生成的hporf文件导入mat

    4、jstack实战死循环与死锁

    $ jps -l

    15222 com.intellij.idea.Main
    17238 sun.tools.jps.Jps
    15547 com.imooc.monitor_tuning.MonitorTuningApplication
    15532 org.jetbrains.jps.cmdline.Launcher
    15453 org.jetbrains.idea.maven.server.RemoteMavenServer36

    $ jstack 15547 > MonitorTuningApplication.txt

    "Thread-21":
        at com.jacky.imserver.controller.UserController.lambda$deadlock$1(UserController.java:41)
        - waiting to lock <0x00000007fbb68fe0> (a java.lang.Object)
        - locked <0x00000007fbb68ff0> (a java.lang.Object)
        at com.jacky.imserver.controller.UserController$$Lambda$427/1168450100.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:748)
    "Thread-20":
        at com.jacky.imserver.controller.UserController.lambda$deadlock$0(UserController.java:29)
        - waiting to lock <0x00000007fbb68ff0> (a java.lang.Object)
        - locked <0x00000007fbb68fe0> (a java.lang.Object)
        at com.jacky.imserver.controller.UserController$$Lambda$426/169622243.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:748)
    
    Found 1 deadlock.
    

    5、基于JVisualVM 的可视化监控

    1、监控本地java进程
    2、监控远程java进程

    6、使用 BTrace 进行拦截调试

    • BTrace是一种动态跟踪分析一个运行中的Java应用程序的工具。
    • BTrace动态地向目标应用程序的字节码注入追踪代码(字节码追踪),也就是BTrace脚本。
    • 使用的技术有 JavaCompilerApi, JVMTI, Agent, Instrumentation+ASM
    • BTrace的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息。而不需要不断地修改代码。

    1、拦截方法

    在@OnMethod注解中,需要指定class、method以及location等,class表明需要监控的类,method表明需要监控的方法。

    2、拦截时机

    @Location定义Btrace对方法的拦截位置,通过@Location注解指定,默认为Kind.ENTRY,Kind.RETURN,Kind.CALL,Kind.LINE和Kind.ERROR, Kind.THROW, Kind.CATCH

    @BTrace
    public class PrintRegex {
    
        @OnMethod(
                clazz="com.imooc.monitor_tuning.chapter4.Ch4Controller",
                method="/.*/"   )
        public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn) {
            BTraceUtils.println(pcn+","+pmn);
            BTraceUtils.println();
        }
    }
    

    7、Tomcat 性能监控与调优

    1、线程优化

    • maxConnections: 最大链接数现在nio 1w,之前apr8192
    • acceptCount :最大排队数,超过最大连接数后的队列 默认100
    • maxThreads : 工作线程,最大并发
    • minSpareThreads :最小空闲线程,不能设置太小

    2、配置优化

    • autoDeploy: 周期性检查是否有新应用部署,默认true,生产千万不能true
    • enableLookups(http.html):默认false,千万不能true
    • reloadable(context.html):默认false,千万不要true
    • protocol="org.apache.coyote.http11.Http11AprProtocol"
    • 8.5以后nio、apr用于大并发 比较合适
    • Session 优化:如果是 JSP, 可以禁用原生 Session=false、session放在redis

    8、Nginx 性能监控与调优

    1、配置线程数和并发数

    增加工作线程数和并发连接数
    [root@localhost /]# vi /etc/nginx/nginx.conf
    worker_processes  4; # 一般CPU 是几核就设置为几 也可以设置成auto
    events {
        worker_connections  10240; # 每个进程打开的最大连接数,包含了 Nginx 与客户端和 Nginx 与 upstream 之间的连接
        multi_accept on; # 可以一次建立多个连接
        use epoll;   #epoll这种网络模型
    }
    

    2、查看nginx 语法是否正确

    [root@localhost /]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    

    3、启用长连接

    upstream server_pool{
        server localhost:8080 weight=1 max_fails=2 fail_timeout=30s;
        keepalive 300; # 300个长连接 提高效率
    }
    

    4、配置反向代理服务

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://server_pool;  #所有请求都代理给server_pool
    }
    

    5、配置压缩

    gzip on;
    gzip_http_version 1.1;
    gzip_disable "MSIE [1-6].(?!.*SV1)";
    gzip_proxied any;
    gzip_types text/plain text/css application/javascript application/x-javascript application/json application/xml application/vnd.ms-fontobject application/x-font-ttf application/svg+xml application/x-icon;
    gzip_vary on;
    gzip_static on;
    

    6、操作系统优化

    配置文件/etc/sysctl.conf

    sysctl -w net.ipv4.tcp_syncookies=1 # 防止一个套接字在有过多试图连接到时引起过载
    sysctl -w net.core.somaxconn=1024 # 默认128,操作系统连接队列
    sysctl -w net.ipv4.tcp_fin_timeout=10 # timewait 的超时时间
    sysctl -w net.ipv4.tcp_tw_reuse=1 # os 直接使用 timewait的连接
    sysctl -w net.ipv4.tcp_tw_recycle=0 # 回收禁用
    

    7、其它优化

    sendfile    on; # 减少文件在应用和内核之间拷贝
    tcp_nopush  on; # 当数据包达到一定大小再发送
    tcp_nodelay off; # 有数据随时发送
    

    9、JVM层GC调优

    1、如何选择垃圾收集器

    1、优先调整堆的大小让服务器自己来选择
    2、如果内存小于100m,使用串行收集器
    3、如果是单核,并且没有停顿时间的要求,串行或者jvm自己选
    4、如果允许停顿时间超过1s,选择并行或者jvm自己选
    5、如果响应时间最重要,并且不能超过1s,使用并发收集器

    2、GCViewer

    3、Tomcat 的 GC 调优实战 ParallelGC调优

    1、设置 Metaspace 大小 -XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M
    2、添加吞吐量和停顿时间参数 -XX:GCTimeRatio=99 -XX:MaxGCPauseMillis=100
    3、修改动态扩容增量 -XX:YoungGenerationSizeIncrement=30

    4、G1 GC 最佳实践

    1、-XX:InitiatingHeapOccupancyPercent: Use to change the marking threshold.
    2、-XX:G1MixedGCLiveThresholdPercent and -XX:G1HeapWastePercent: Use to change the mixed garbage collection decisions.
    3、-XX:G1MixedGCCountTarget and -XX:G1OldCSetRegionThresholdPercent: Use to adjust the CSet for old regions.

    5、JAVA代码层调优

    1、尽量重用对象,不要循环创建对象,比如:for 循环字符串拼接(不在 for中使用+拼接,先new 一个StringBuilder再在 for 里 append)
    2、容器类初始化的地时候指定长度(扩容比较耗时)
    3、ArrayList(底层数组)随机遍历快,LinkedList(底层双向链表)添加删除快只需移动一个指针,hashmap底层数组+链表
    4、集合遍历尽量减少重复计算
    5、使用 Entry 遍历 Map
    6、大数组复制使用System.arraycopy
    7、尽量使用基本类型而不是包装类型 Integer底层使用缓存,因为没有1000没有缓存,所以要new
    8、不要手动调用 System.gc()
    9、及时消除过期对象的引用,防止内存泄漏
    10、尽量使用局部变量,减小变量的作用域
    11、尽量使用非同步的容器ArraryList vs. Vector(建议使用ArraryList)手动加锁
    12、尽量减小同步作用范围, synchronized 方法 vs. 代码块(建议synchronized 方法)
    13、用ThreadLocal 缓存线程不安全的对象,SimpleDateFormat
    14、尽量使用延迟加载
    15、尽量减少使用反射,必须用加缓存
    16、尽量使用连接池、线程池、对象池、缓存
    17、及时释放资源, I/O 流、Socket、数据库连接
    18、慎用异常,不要用抛异常来表示正常的业务逻辑
    19、String 操作尽量少用正则表达式
    20、日志输出注意使用不同的级别
    21、日志中参数拼接使用占位符 log.info("orderId:" + orderId); 不推荐 log.info("orderId:{}", orderId); 推荐(没有字符串拼接)

    相关文章

      网友评论

          本文标题:Java生产环境下性能监控与调优

          本文链接:https://www.haomeiwen.com/subject/aafxxktx.html