作者文章归档:wangxiuwen
正则表达式
正则表达式 NFA DFA
DFA自动机(Deterministic Final Automaton 确定有限状态自动机)和NFA自动机(Non deterministic Finite Automaton 非确定有限状态自动机)。
对比来看,构造DFA自动机的代价远大于NFA自动机,但DFA自动机的执行效率高于NFA自动机
假设一个字符串的长度是n,如果用DFA自动机作为正则表达式引擎,则匹配的时间复杂度为O(n);如果用NFA自动机作为正则表达式引擎,由于NFA自动机在匹配过程中存在大量的分支和回溯,假设NFA的状态数为s,则该匹配算法的时间复杂度为O(ns)。
NFA自动机的优势是支持更
如何制定调优策略
如何预热?
可以通过设置CompileThreshold参数降低执行方法次数阈值来提前预热代码,也可以通过调用WarmUpContextListener.invoke方法指定需要预热的方法,当然也可以在启动时提前写个循环或多线程调用该方法。
我们还可以使用一些工具来预热,例如之前有同学提到的JMH。
V8 内存机制
AQS
机器的cpu高如何排查?
- 使用top命令查看各个进程的cpu使用率
- top -H -p 进程ID 查看具体线程的cpu使用率
- jstack 导出系统日志进行分析
rpc 通信
hashMap 发生 发生哈希冲突时, 如何解决?
开放定址法、再哈希函数法和链地址法
异常
抛出异常需要构建异常栈,对异常进行捕获和处理,这个过程比较消耗系统的性能,怎么理解?
创建异常对象时会调用父类Throwable的fillInStackTrace()方法生成栈追踪信息,也就是调用native的fillInStackTrace()方法去爬取线程堆栈信息,为运行时栈做一份快照,正是这一部分开销很大
如何实现自定义异常?
继承RuntimeException,然后将writableStackTrace设置为false。
以下是RuntimeException的构造函数:
protected RuntimeException(String message, Throwable cau
端口被CLOSE_WAIT占用如何排查?
可以通过tcpdump抓包看看连接状态,分析是否是服务端的FIN packet没有发出去。
正常的关闭流程是:服务端在接收到客户端发送的关闭请求FIN后,会进入CLOSE_WAIT状态,同时发送ACK回去。在完成与客户端直接的通信操作之后,再向客户端发送FIN,进入LAST_ACK状态。
如果连接是CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Client,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。
建议确定关闭请求的四次握手,哪个环节出了问题,再去排查业务代码,可能是由于超时或者异常导致没有正常关闭连接。