什么是调优?
1、根据需求进行jvm规划和预调优
2、优化运行jvm运行环境(慢、卡顿)(怎么才能定位一个系统的瓶颈?压测)
3、解决jvm运行过程中出现的各种问题(Memory Lack OOM)
-Xms:最小堆大小
-Xmx: 最大堆大小
-XX:+printGC:在运行之中把垃圾回收器的日志打印出来
注意:-Xms为什么设置-Xmx一样? 防止内存抖动(内存扩容)
分配失败-> 54m->1m(回收了53m)(剩余199m) 回收时间
参数调优 :
线程跟踪
jinfo 进程:查看进程相关的属性
jstate 进程 500:java的跟踪信息(500ms更新一次)
jstack 进程:打印出该进程对应的线程 如果发现多个线程都是wating on codeine就是可能出
现死锁
面试题:jvm中的cpu爆了,如何定位问题?
top 进程: 查看cpu的占用内存的大小(多观察几次就会发现内存是忽高忽低)
top -Hp 进程:查看进程中对应的线程占用CPU的大小
解答: top 进程:查看哪个进程中占用的cup比较高
top -Hp 进程:查看进程中哪个cup比较高
jstatck 线程:1、如果wating on codeine :VM GC 问题(查看GC日志看是不是频繁GC)
2、如果是业务问题:对应哪个类哪个方法出现问题
jmap -histo 进程|head 20 : 1、查询堆内存不同类占用内存的比重(内存一直回收不掉就是
占用比重比较多的对象引起的)
jmap -dump:format=b;file=xxx.hprof 进程
2、产生堆转储文件
面试题:如何定位频繁GC?
回收不了:说明内存里面都全被占用了,并且有引用指向,导致垃圾回收机制回收不了
定位完问题后就开始查业务逻辑
频繁GC:每次只回收6k
jmap -histo 进程|head 20:(只查看前20个)
编号 对象数 所占字节 class名称
面试题:实际开发中如何定位频繁GC?
1、使用jmap进行堆转储文件,然后放到jvisuaivm.exe(jdk自带)中观察
注意:实际开发中可以远程连接linux去观察
但是实际开发中还是不能去调用jmap,只能通过参数去控制
java -Xms200M -Xmx200M -XX:+UserParallelGC --XX:+HeapDumpOnOutOfMemoryError
xxx
--XX:+HeapDumpOnOutOfMemoryError:产生oom的时候会自动生成堆转储文件
2、arthas:阿里的开源的工具--影响性能10%-15%
java -jar arthas-boot.jar
headdump(jmap):
thread -b:显示进程中所有的线程(查找哪个线程占用的cpu多) -b(jstack 中wating on
condition):查找死锁
jvm(jinfo): 显示参数的信息
面试题:如果在程序不宕机的情况下修改程序的class文件?
jad xxx:反编译
defefind xxx:在线修改class文件
vim xxx.java:修改文件
javac xxx.java:反编译文件
defefind /root/xxx.class:在线上传class文件
集群:只能用脚本批量替换
面试题:如何定位系统的系统瓶颈? (链式调用是哪个出现问题)
trace xxx(类) xx(方法)
找到对应的方法哪个有问题