什么是虚拟线程
是JDK而不是OS实现的轻量级线程,由JVM调度,许多虚拟线程共享同一个操作系统,虚拟线程的数量可以远大于操作系统线程的数量
虚拟线程是非常轻量级的,可以在单个线程中创建成百上千个虚拟线程而不会导致过多的线程创建和上下文切换。减少资源开销,由于虚拟线程是由于JVM实现,它能够更高效的利用底层资源,例如CPU和内存,虚拟线程的上下文切换比平台线程更轻量。
为什么先更新数据库再删缓存
先更新数据库,再删除缓存会出现数据不一致的问题,但是概率不高。因为缓存的写入通常要远远快于数据库的写入,所以再次删除缓存时,会将带有旧值的缓存删除。
linux kill-9
系统会发出sigkill命令,他要求接受到该信号的程序立即结束执行,不能被阻塞或者忽略
服务端大量的链接是timewait状态原因
TIME_WAIT状态下,TCP连接占用的本地端口将一直无法释放
如果TIME_WAIT连接吧所有可用端口都占完了(TCP端口数量上限是65535) 而且还未被系统回收,就会出现无法向服务器创建新的socket连接的情况。
产生的原因是大量短连接的存在,浏览器和服务器每进行一次HTTP操作,就会建立一次连接,任务结束后就会断开连接,而断开连接这个请求是由server去发起,主动关闭连接请求一端才会有TIME_WAIT状态连接
object中的方法
getClass()用于final关键字修饰,故不允许子类重写
hashCode()用于返回对象的哈希码,主要使用在哈希表中
clone()用于创建并返回当前对象的一份拷贝
equals()用于比较2个对象的内存地址是否相等
toString() 返回类的名字实例的哈希码的16进制的字符串
notify()唤醒一个在此对象监视器上等待的线程,如果有多个线程在等待只会任意唤醒一个
wait()暂停线程的执行,sleep方法没有释放锁,而wait释放了锁
Limit查询深度分页问题的解决
一是通过主键索引优化
二是使用ES的游标scroll
IO多路复用
指的是复用一个线程,处理多个socket中的事件,能够资源复用,防止创建过多线程导致的上下文切换的开销。
select实现多路复用是将已连接的socket都放到一个文件描述符集合,然后调用select函数将文件描述符结合拷贝到内核里,让内核来检查是否有网络事件发生,检查的方式很粗暴,就是通过遍历文件描述符集合的方式,当检查到有事件产生后,将此socket标记为可读可写,接着把整个文件描述符拷贝回用户态里,然后用户态还需要再通过遍历的方法找到可读或可写的socket
poll实现多路复用与select区别是使用的是动态数组来存储进程关注的socket集合,其他无本质区别
epoll实现多路复用,内核里使用红黑树跟踪进程所有待检测的文件描述字,把需要监控的socket通过epoll_ctl()函数加入内核中的红黑树里。epoll使用事件驱动的机制,内核里维护了一个链表来记录就绪事件,当某个socket有事件发生时,通过回调函数内核会将其加入到这个就绪事件列表中,当用户调用epoll_wait函数时,只会返回有事件发生的文件描述符的个数。
MVCC实现原理
MVCC允许多个事务同时读取同一行数据,而不会彼此阻塞,每个事务看到的数据版本是该事务开始时的数据版本。对于读已提交,每个select语句执行前都会重新生成一个Read View。对于可重复读,执行第一条select时,生成一个Read View,然后整个事务期间都在用这个Read View
ReadView四个核心字段:
creator_trx_id:创建该read view的事务的事务id
m_ids:创建Read View时,当前数据库中活跃且未提交的事务id列表
min_trx_id:创建Read View时当前数据库中活跃且未提交的事务中最小的事务id
max_trx_id:创建Read View时当前数据库中应该给下一个事务的id值
Java反射
反射机制是运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法,对于任意一个对象,都能够调用他的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能就称为反射。
运行时类信息访问:反射机制允许程序在运行时获取类的完整结构信息,包括类名,包名,父类,实现的接口,构造函数,方法或者字段等
动态对象创建:可以使用反射动态创建对象实例,即使在编译时不知道具体的类名,可以通过class类的newInstance()方法来实现
动态方法调用:可以在运行时动态地调用对象的方法,包括私有方法,这通过method类的invoke方法实现
访问和修改字段值:反射允许程序在运行时访问和修改对象的字段值
HTTP 和 HTTPS 的区别
Http是超文本传输协议,信息是明文传输,存在安全风险的问题,https则解决http不安全的缺陷,在tcp和http网络层之间加入了ssl/tls安全协议,使得报文能够加密传输
http连接建立相对简单,tcp三次握手之后便可以进行http的报文传输。而https在tcp三次握手之后,还需进行ssl/tls握手过程,才可进入加密报文传输
两者的默认端口不一样,http默认端口号是80,https默认端口号是443
https协议需要向CA申请数字证书,来保证服务器的身份是可信的
左连接和右连接
左连接返回左表中的所有行,即使在右表中没有匹配的行,没有匹配到的右表列会包含null
右连接返回右表的所有行,即使左表中没有匹配的行,没有匹配的左表列包含null
jmap jhat jstack
jmap:生成堆转储快照
jhat:用于分析heapdump文件,会建立一个html文件,用户可以查看分析结果
jstack:生成虚拟机当前时刻的线程快照
Java中的阻塞队列
ArrayBlockingQueue:使用数组实现的有界阻塞队列,在创建时需要指定容量大小,并支持公平和非公平两种方式的锁访问机制
LinkedBlockingQueue:使用单向链表实现的可选有界阻塞队列,在创建时可以指定容量大小,如果不指定则默认为Integer,.Max_Value
PriorityBlockingQueue:支持优先级排序的无界阻塞队列,元素必须实现comparable接口
delayQueue:延迟队列,其中的元素只有到了其指定的延迟时间,才能够从队列中出队
参考资料: