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

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); 推荐(没有字符串拼接)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343