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&notifyAll 

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 查看是否有内存泄露

原文地址:https://www.cnblogs.com/hwu2014/p/7469639.html