一台64G内存的服务器QPS可以达到9W,TPS(事务)可以达到5K,每个TPS大约包含18个QPS.只读的话QPS可以达到30~40万.阿里云有相关测试工具、测试方法、测试结果。
1、volatile 保证可见性,禁止指令重排,避免多线程环境下乱序执行
(1)及时通知
(2)变量前后加内存屏障,前加读屏障,后加写屏障
2、automicInteger 原子性:
原理:调用unsafe类,使用底层原语直接操作内存地址+1
3、有序性:编译器指令重排
指令并行的重排
如何禁止指令重排:在关键变量前加volatile或sycnizied
************************锁****************
1、重量级锁:又叫悲观锁。java的jvm中启动一个线程,一定在操作系统中启动一个线程,所以叫重量级锁。
叫重量级是因为要结果系统处理。
go语言中几百几千个协程才会在系统中创建一个线程。
在队列中等待系统调用,此时不占用系统资源。
2、轻量级锁:又叫自旋锁/乐观锁/CAS。一般用while循环实现,此时占用系统资源。
叫轻量级是因为不需要经过系统调度处理,在程序中自行解决。
cas如下图:compareAndSwap
cas会存在A->B->A问题,解决方法,加版本号。
cas另外一个问题:比较后修改前,工作被其它线程打断并修改了……--->调用c++的unsafe方法:unsafe_compareAndSwap-->Atomic::cmpxchg汇编语言(LOCK_IF_MP:如果是多核就上锁)
**所以执行时间较长的,用户数较多的不适合轻量级锁,因为会导致cpu不停的切换。
***************内存屏障
inter cpu:lfence,sfence,mfence
jvm虚拟机:
loadLoadBarrier:读语句和读语句之间的屏障
LoadStoreBarrier:读语句和写语句之间的屏障
StoreLoadBarrier:写语句和读语句之间的屏障
StoreStoreBarrier:写语句和写语句之间的屏障
*****************IOC 控制反转
***************************Bean的生命周期
*************************spring中用了哪些設計模式
**************************循環依賴****************************
************************AOP实现原理****************************
******************************spring 事务回滚**************************
****************************jvm****************************
服务器调优:
阿里巴巴开源调优工具:Arthas
通过内核查看内存信息:sudo cat /proc/meminfo | grep -i slab
设置打开文件数限制到100万:ulimit -n 1024000
查看可以端口范围(默认是32768~ 60999):$ sysctl -a | grep net.ipv4.ip_local_port_range
设置可用端口范围:
sudo sysctl -w net.ipv4.ip_local_port_range="1026 61999"
**********并发连接时间会越来越长的问题解决******************
linux优先给 bind(o)分配奇数端口,如果奇数端口号分配完了,才去尝试分配偶数端口
linux优先给connect 分配偶数端口。如果偶数端口号分配完了,才去尝试分配奇数端口
所以每次要遍历端口,花的时间就越来越长。解决的办法就是手动指定绑定端口和连接端口一致。
客户端机器测试并发时,可以虚拟ip:ifconfig enp0s31f6:$i ${IPS[$i]} netmask $NETMASK up
Redis:setNx解决重复下单等幂等性问题,记得加过期时间,如3秒
Bitmap可以解决是否签到等场景中数据存储问题
Redis中Sintersiore可以把两个set中的交集放在新的set中
Neo4j可以用来存储社交好友的问题
visualVM查看java内存
idea中jclasslib工具可查看jvm指令码
改为原子性,来保证线程安全,比synchronized效率更高
原子性的具体使用方法:
*************************************锁**************************************
悲观锁:synchronized、lock
乐观锁:并发的概率不高的情况下使用,读多写少。
占用cpu时间比较久的时候,可以用互斥锁(synchronized);反之用自旋锁(即cas)
2、ReentrantLock:
2.1显式锁
2.2ReentrantLock尝试锁tryLock
2.3ReentrantLock可以中断
******************************************************
Mysql中,尽量先用explain分析一下sqk语句
**********************************************
Redis监控:普罗米修斯
*********************************************Spring*******************************************