Java语言
1. Difference between Thread.sleep and Object.wait
Thread.sleep: 会让当前线程休眠进入阻塞状态并释放CPU,提供其他线程运行机会且不考虑优先级,但如果持有同步锁,不会释放
Thread.yield: 类似sleep方法,但无法指定时间并只会提供相同优先级或更高优先级线程运行机会,不推荐使用
Thread.join: 一种特殊的wait,当前运行线程调用另一线程的join方法,当前线程进入阻塞状态直到另一线程运行结束
Object.wait: 必须放在循环体和同步代码块中,执行该方法的线程会释放线程锁
2. ThreadLocal (线程局部变量)
为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,为多线程环境下出现并发访问问题提供了一种隔离机制
3. GC
- Eden满了,触发Young GC。1.回收没用Object 2.把还被引用的对象移到Survivor 3. 把Survivor里引用次数较多的移到Old
- Old满了,触发Full GC。Full GC很消耗内存,把Young和Old大部分对象回收掉,这时候用户线程会被Block
- JVM堆的大小决定了GC的运行时间,如果JVM堆大小超过一定先对,那么GC的运行时间会很长
- 通常情况下,JVM堆的大小应为物理内存的80%
- jmap -heap PID :heap概要信息,GC使用算法
- jstat -gcutil PID : 类加载,GC等次数
- Full GC(System) 应该是调用System.gc()
4. SpringBoot
- Fat Jar
- Starter 自动配置
- Actuator 自带监控
5. fail-fast机制 | fail-safe机制
- 针对迭代器而言。快速失败,当在迭代一个集合时,如果有另外一个线程在修改这个集合,就会抛出ConcurrentModification异常,java.util下都是快速失败;安全失败,在迭代时候会在集合二层做一个拷贝,所有在修改集合上层元素不会影响下层,在java.util.concurrent下都是安全失败。
6. mysql组合索引
- 最左前缀: a_b_c的组合索引, 会同时创建a | a_b 的索引
7. RPC框架的长连接
- TCP的keep-alive机制是用来检测长时间不活跃的连接,但在真是的复杂网络环境下,不适合用来及时检测连接的状态,采用应用层的心跳包机制会更灵活可靠
8. 线程状态 | notify¬ifyAll
9. 线程池参数 | BlockingQueue | netty | io|nio
10. LRU cache
11. JVM调试
- jdb 命令行调试工具
- jps 列出所有Java进程的PID
- jstack 列出虚拟机进程的所有线程运行状态
- jmap 列出堆内存上的对象状态
- jstat 记录虚拟机运行的状态,监控性能
- jconsole 虚拟机性能/状态检查可视化工具
load高排查步骤:
1. top查找耗资源的进程
2. ps + grep找到对应的java进程/线程
3. jstack 分析哪些线程阻塞
4. jstat FullGC频率
5. jmap 查看是否有内存泄露