第二节 锁、JVM|Tomcat调优

第二节

1、指令重排序会遵循happens-before的规则,代码编译成汇编语言的时候,会进行JIT优化,可能进行一些指令重排序等规则;
2、volatile关键字可以解决可见性问题,不可解决原子操作性问题;比如常量加上volatile关键字后,CPU不会缓存,程序在读数据的时候会第一时间读取到最新的值。
3、ThreadLocal可以解决线程封闭,会对每个线程生成单独的副本,相互之间不影响;换句话说ThreadLocal只针对线程内有效。
4、可重入锁(ReentrantLock),线程拿到一个锁后可进行再次的获取锁,注意线程加锁多少次后,就要解锁几次,否则其他程序获取不到这把锁;
5、读写锁(ReentrantReadWriteLock):维护一堆关联锁,一个用于只读操作,一个用于写入;读锁可以有多个读线程同时持有,写锁是排他的。适合读取线程比写入线程多的场景,改进互斥锁的性能,示例场景:缓存组件、集合的并发线程安全性改造。
锁降级 指的是写锁降级成为读锁。把持住当前拥有的写锁的同时,再获取到读锁,随后释放写锁的过程。
写锁是线程独占,读锁是共享,所以写->读是升级。(读->写,是不能实现的)
写锁只能在读锁释放后获得。

JVM

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

串行收集器在运行过程中,会停止一切其他线程,会造成程序响应有点延迟。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JDK内置工具

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Tomcat 调优
在这里插入图片描述
在这里插入图片描述
生成内存快照方法:
1、jcmd查看进程pid
2、jmap -dump:format=b,file=XX.hprof -F
3、下载eclipse mat工具对内存快照进行分析

问题:
1、当线上发现一个接口返回很慢的时候,如何来定位问题;
首先:利用jmeter工具进行分析,设置测试计划,循环调用;
其次:查看服务器资源,利用Linux命令行工具top进行CPU以及内存的使用情况进行查看
最后:在接口多次请求的前提下,系统资源利用率还是正常的,这时候我们需要对当前系统中进程进行分析,分析这些进程卡在哪,需要抓取这些进程快照;
方法:利用jcmd查看当前进程的pid
再使用jstack分析进程的状态:
jstack pid > a.log
查看a.log内容,可以搜索自己业务包进行快速定位,可以多次抓取进程快照来分析,看是否卡在同一个地方,那就要去查看具体地方的代码。

jstack pid 也可以帮你进行死锁检测

jstat -gc pid 查看GC信息

2、当线上发现CPU消耗达到100%以上,如何定位问题,如何查找系统代码问题;
利用Linux命令,输入 top -H -p javapid ,来查看指定java程序中的线程情况,查看占用资源最多的线程,并将占用资源最多的线程pid转成16进制(方法:printf “%x\n” pid);再通过jstack pid > a.log 将java程序的线程放到a.log文件中进行查看,再讲16进制的id在a.log中比对是否有一样的nid(nativeid),就会找出问题代码所在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值