知识点关注
基础篇
1. JVM相关,JAVA里的垃圾回收有什么目的?什么时候会触发?(追问:频繁full GC问题排查思路,GVM调优)
垃圾回收的目的,内存管理,释放无用的对象;
能够完成的描述一次垃圾回收的过程。(年轻代、老年代、永久代)
Full gc 现象,分析定位,解决;
2. 集合相关,HashMap实现原理?(追问:多线程环境如何使用Map)
HashMap存储,碰撞,扩容,性能,红黑树;
线程相关的HashTable,CurrentHashMap;
3. 多线程相关:线程池ThreadPoolExecutor有没有使用过,解决什么问题?(追问:线程池的扩容机制)
线程管理解耦,降低资源消耗,提高可管理性
setCorePoolSize和setMaximumPoolSize两个参数,创建和销毁的机制。
reject机制默认有Discard/DiscardOld/Abort/CallersRun, 默认为abort报错。能够讲明白原理的,标记出来 算加分
4. 锁相关:设计一个高速缓存,允许多个线程读,只允许一个线程写?
读写锁,CurrentHashMap
考虑性能和数据一致性
5. 分布式:分布式系统中不同的模块如何进行通信?
RPC、RMI、Web Service、JMS(MQ)
RPC 和 HTTP比较
RPC框架的原理(注册发现机制、路由、降级、负载均衡)
dubbo、thrift、
MQ(消息消费模式:广播、点对点)
6. 操作系统:
从那几个方面评估机器的负载
CPU ,当java进程占用CPU过高的时候,经常100%,怎么排查
top查看进程id,ps查看线程id,jstack堆栈信息
内存,java内存查看分析工具
gc日志,在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime
jconsole,jmap,jhat,jstat,MAT
load,load是怎么计算的
load 要结合cpu数量来看,我们假设cpu数量为4,每个cpu都正好满负荷运转时,load为4.如果每个cpu处理任务过程中,还有一个任务在排队等待,那么load为8。
网络IO
sar -n DEV
cat /home/a.log | grep 'abc' | sort | uniq 理解这段脚本
统计a.log中包含abc的行,正序排序并去重
用JAVA实现,画板上codeing
扩展,超大文件,MapReduce思想
7. 数据库:Mysql
MySQL中有一条SQL比较慢,如果让你去优化,你会怎么做?为什么要这样做?
explain查看执行计划,是否走索引,sql本身优化,比如模糊查询,子查询,loop
表数据量过大,分库分表
redis;
读写分离;
高级篇
分布式、集群环境中,缓存如何刷新,如何保持同步?
A、缓存如何刷新?
1、定时刷新
2、主动刷新覆盖
每个缓存框架都有自带的刷新机制, 或者说缓存失效机制, 就拿Redis和 Ehcache举例, 他们都有自带的过期机制, 另外主动刷新覆盖时, 只需获取对应的key进行数据的覆盖即可
B、缓存如何保持同步?
这个redis有自带的集群同步机制, 即复制功能, 具体参考:基于Redis分布式缓存实现, Ehcache也有分布式缓存同步的配置, 只需要配置不同服务器地址即可, 参照:Ehcache分布式缓存同步