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