jvm参数类型、bin目录下工具、gc算法/常见垃圾收集器
jvm参数类型
1.标准参数
1.-vserion
2.-help
2.X参数(非标准化参数)
1.-Xinit:解释执行
2.-Xcomp:第一次使用就编译成本地代码
3.-Xmixed:混合模式,jvm自己来决定是否编译成本地代码
3.XX参数
1.非标准化参数
2.相对不稳定
3.主要用于jvm调优和debug
4.类型
1)boolean类型-XX[+-]<name>表示启用或者禁用name属性
2)非boolean类型key-value,-XX<name>=<value>表示name属性的值是value
-Xms = -XX:InitialHeapSize:初始化堆大小
-Xmx = -XX:MaxHeapSize:最大堆大小
运行时jvm参数查看
-XX:+PrintFlagsFinal
=表示默认值
:=表示用户或者JVM修改后的值
例:java -XX:+PrintFlagsFinal -version
jps
jps -l
jinfo:
查看属性值:
jinfo -flags pid
查看最大堆:
jinfo -flag MaxHeapSize pid
查看最大栈:
jinfo -flag ThreadStackSize pid
查看元空间:
jinfo -flag MetaspaceSize pid
jinfo -flags pid
Non-default VM flags:系统默认的
Command line:自己配置的
jstat查看虚拟机统计信息
类加载
jstat -class pid 1000(毫秒) 10(次数)
Loaded Bytes Unloaded Bytes Time
17330 32996.8 0 0.0 11.21
17330 32996.8 0 0.0 11.21
17330 32996.8 0 0.0 11.21
17330 32996.8 0 0.0 11.21
17330 32996.8 0 0.0 11.21
17330 32996.8 0 0.0 11.21
17330 32996.8 0 0.0 11.21
17330 32996.8 0 0.0 11.21
17330 32996.8 0 0.0 11.21
17330 32996.8 0 0.0 11.21
垃圾收集:-gc、-gcutil、-gccause、-gcnew、-gcold
jstat -gc pid
jstat -gc pid 1000(毫秒) 10(次数)
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
209664.0 209664.0 0.0 111833.9 1677824.0 525792.0 6291456.0 22526.1 105860.0 102988.4 12288.0 11705.9 17 1.121 4 0.390 1.511
S0C、S1C、S0U、S1U:s0和s1的总量与使用量
EC、EU:Eden区总量与使用量
OC、OU:old区总量与使用量
MC、MU:metaspache区总量与使用量
CCSC、CCSU:压缩空间总量与使用量
YGC、YGCT:youngGC的次数与时间
FGC、FGCT:FullGC的次数与时间
GCT:总的GC时间
JIT编译:
jstat -compiler pid
Compiled Failed Invalid Time FailedType FailedMethod
18681 5 0 118.76 1 com/alibaba/fastjson/parser/DefaultJSONParser parseObject
jstat -printcompilation pid
Compiled Size Type Method
18790 862 1 org/springframework/core/annotation/AnnotatedElementUtils hasAnnotation
jmap+MAT实战内存溢出
如果导出内存映像文件
1.内存溢出自动导出
-XX:+HeapDumpOnOutOfMemoryERROR
-XX:HeapDumpPath=./
2.使用jmap命令手动导出
jps看下进程号
jmap -dump:format=b,file=xxx.hprof pid
mat工具分析导出堆内存导出文件
jstack实战死循环与死锁
jstack pid
实战死循环导致cpu飙高
jstack pid > 文件
top -p pid -H
printf "%x" 线程号(转化进制)
基于JVisualVm的可视化监控
1.监控本地tomcat
2.监控远程tomcat
修改jmx Catalina.sh
3.监控普通是java进程
基于btrace的监控调试
tomcat:
tomcat远程debug
jdwp(java debug wire protocol)
tomcat-manager监控,需要配置user、manager
psi-probe监控,需要配置user、manager
tomcat调优
1.内存优化
2.线程优化:http.html
maxConnection
acceptCount
maxThreads
minSpareThreads
3.配置优化
autoDeploy
enableLookups
reloadable
protocol
4.session优化
如果是jsp,可以禁用session
1.nginx
1.ngx_http_stub_status监控连接信息
2.ngxtop监控请求信息
3.nginx-rrd图形化监控
4.nginx优化
2.增加工作线程数和并发连接数
worker_processes
worker_connections
multi_accept on;
use epoll
3.启用长连接
4.启用缓存、压缩
5.操作系统优化
6.配置/etc/sysctl.conf
jvm层gc调优
jvm的内存结构
1.运行时数据区
程序计数器pc register
虚拟机栈jvm stacks
堆heap
方法区method area(非堆)
方法区里面有常量池
本地方法栈native method stacks
垃圾回收算法
思想:枚举根节点,做可达性分析
根节点:类加载器、thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法栈的变量等等
算法:
1.标记清除
算法分为标记和清除两个阶段;首先标记出所有需要回收的对线。在标记完成后统一回收所有
缺点:效率不高、标记和清除两个过程的效率都不高,产生碎片。碎片太多会导致提前gc
2.复制
它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象
复制到另外一块上面,然后再把使用过的内存空间一次清理掉
优缺点:实现简单,运行高效,但是空间利用率低
3.标记整理
标记过程和标记清除算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后清理掉边界以外的内存
优缺点:没有了内存碎片,但是整理内存比较耗时
分带垃圾回收
1.young区采用复制算法
2.old区采用标记清除或者标记整理
对象分配
1.对象优先在eden区分配
2.大对象直接进入老年代:-XX:PretenureSizeThreshold
3.长期存活的对象进入老年代:-XX MaxTenuringThreshold
垃圾收集器:
1.串行收集器serial:serial、serial old(一般不采用,client模式下的默认收集器)
-XX:+UseSerialGC -XX:UseSerialOldGC(jd8以后废弃)
2.并行收集器:parallel:parallel scacenge、parallel old,吞吐量(server模式下的默认收集器,根据cpu、内存自动判断)
-XX:+UseParallelGC -XX:UseParallelOldGC
3.并发收集器concurrent: cms、G1,停顿时间
1.响应时间优先
CMS(老年代收集器?):XX:+useConcMarkSweepGC -XX:+UseParNewGC
cms垃圾收集过程
1.CMS inital mark:初始标记Root,STW
2.CMS concurrent mark:并发标记
3.CMS-concurrent-preclean:并发预清理
4.CMS remark:重新标记,STW
5.CMS concurrent sweep:并发清除
6.CMS-concurrent-reset:并发重置
缺点:cpu敏感,浮动垃圾,空间碎片
相关参数:
1.-XX:ConcGCThreads:并发的gc线程数
2.-XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩
3.-XX:CMSFullGCsbeforeCompaction:多少次fullGC之后压缩一次
4.-XX:CMSInitationOCcupancyFraction:触发FullGC
5.-XX:+UseCMSInitiationOccupancyOnly:是否动态调
6.-XX:+CMSScaveBeforeRemark:fullGC之前先做yongGC
7.-XX:+CMSClassUnloadingEnabled:启用回收Perm区
I-CMS:适用于单核或者双核(jdk8后废弃)
4.G1(java 8):-XX:+UseG1GC(jdk8推荐)
新生代和老年代收集器
1.region
2.SATB:Snapshot-At-The-Beginning:它是通过Root Tracing得到的,GC开始时候存活对象的快照
3.RSet:记录了其他Region中的对象引用本Region中对象的关系,属于points-into结构(谁引用了我的对象)
YoungGC
1.新对象进入Eden区
2.存活对象拷贝到Survivor区
3.存活时间达到年龄阀值时,对象晋升到old区
MixdGC
1.不是FullGC,回收所有的young和部分的Old
2.global concurrent marking:全局的并发标记
MixdGC时机
是否需要切换到G1
5.ZGC(java 11)
G1调优
即仅使用-Xms,-Xmx和暂停时间目标-XX:MaxGCPauseMillis
并行vs并发
停顿时间vs吞吐量
垃圾收集器搭配
如何选择垃圾收集器
可视化gc日志分析工具
1.在线工具:http://gceasy.io
allocated:分配的
promoted:晋升的
1)Key Performance Indicators:关键性能指标
1.Throughput:吞吐量
2.Latency:响应时间
Avg Pause GC Time :平均gc时间
Max Pause GC Time :最大gc时间
2.GCViewer
tomcat的gc调优实战
jvm字节码指令
javap -verbose xxx.class > file
基于栈架构
i++与++i字节码指令是一样的,效率一样
字符串拼接:
每一次循环都会new一个StringBuilder
StringBuffer new一次
try-finally return
String Constant Variable
intern
常见代码优化方法
1.尽量重用对象,不要循环创建对象,比如:for循环字符串拼接
2.容器类初始化的时候指定长度
3.ArrayList随机遍历快,linkedList添加删除快
4.集合遍历尽量减少重复计算
5.使用entry遍历map
5.大数组复制用System.arraycopy
6.尽量使用基本类型而不是包装类型
7.不要手动调用system.gc()
8.及时消除过期对象的引用,防止内存泄漏
9.尽量使用局部变量,减小变量的作用域
10.尽量使用非同步的容器ArrayList VS Vector
11.尽量减小同步作用范围,synchronzied方法VS代码块
12.ThreadLocal缓存不安全的对象,SimpleDateFormat
13.尽量使用延迟加载
14.尽量减少使用反射,加缓存
15.尽量使用连接池、线程池、对象池、缓存
16.及时释放资源,i/o流、socket、数据库连接
17.慎用异常,不要用抛异常来表示正常的业务逻辑
18.String操作尽量少用正则表达式
19.日志输出注意使用不同的级别
20.日志中参数拼接使用占位符