知识点关注

基础篇

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分布式缓存同步


原文地址:https://www.cnblogs.com/milicool/p/11239305.html