目录

​一、JDK源码​

​1.HashMap​

​2.concurrentHashMap​

​3.volatile​

​4.linkedList、ArrayList​

​5.线程池​

​6.设计模式​

​二、JVM、GC、G1​

​1.jvm内部​

​2.加载​

​3.堆​

​4.方法区​

​5.jit即时编译器​

​6.垃圾回收​

​7.垃圾回收器​

​三、springboot、springcloud​

​1.注解​

​2.spring源码​

​3.AOP​

​4.事务​

​5.自动配置原理​

​6.请求处理原理​

​7.springcloud​

​四、docker、k8​

​五、netty​

​六、xxljob​

​七、处理生产问题​

​八、redis​

​1.string​

​2.hash​

​3.list​

​4.set(无序)​

​5.zset​

​九、es​

​十、mysql​


一、JDK源码

1.HashMap

jdk7:hash冲突会存放在链表中,

jdk8:hash冲突过多,链表会转变为红黑树。‘

红黑树(Red Black Tree) 是一种自平衡二叉查找树。’

2.concurrentHashMap

jdk7:分段锁。

jdk8:不用分段锁了,使用cas+

3.volatile

可见性,不保证原子性,防止指令重排序。

cas:比较并交换

4.linkedList、ArrayList

CountDownLacth:他经常用于监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作。

CyclicBarrier:只要有一个人没有准备好,大家都等待

Semaphore信号量

Callable和Future的使用

CopyOnWriteArrayList(读写分离,写时复制)、CopyOnWriteArraySet(HashSet不安全)、

5.线程池

  newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()、newScheduledThreadPool()

线程池七大参数

1.corePoolSize:线程池中的常驻核心线程数。

    在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行任务,近似理解为今日当值线程。

    当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中。

2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1。

3.keepAliveTime:多余的空闲线程的存活时间。

    当前线程池线程数量超过corePoolSize时,当空闲时间达到keepAliveTime值时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。

4.unit:keepAliveTime的单位。

5.workQueue:任务队列,被提交但尚未被执行的任务。

6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程,一般用默认的即可。

7.handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝。

6.设计模式

​设计模式简介 | 菜鸟教程​

二、JVM、GC、G1

1.jvm内部

类加载子系统、堆、栈、方法区、直接内存、垃圾回收系统、执行引擎、本地方法栈、PC寄存器

2.加载

加载-链接(验证、准备、解析)-初始化

类加载器:系统类加载器、扩展类加载器、引导类加载器(启动类加载器)、用户自定义加载器

双亲委派打破:1.jdk1.2之前还没有,引入了线程上下文类加载器,热代码替换热部署

3.堆

jdk7:新生代、老年代、永久代

jdk8:新生代、老年代、元空间

参数

-Xms、-Xmx设置堆内存大小

新生代一般占1,老年代占2,eden比Survivor为8:1:1,朝生夕死。

垃圾收集:

频繁在新生区收集,很少在养老区收集,几乎不再永久区/元空间收集。

TLAB:线程私有缓存,避免线程不安全问题,TLAB仅占有eden区的百分之一,优先在TLAB分配,分配失败会加锁然后在eden区分配内存。

逃逸分析、标量替换(JIT即时编译器会将对象拆解为基本数据类型):栈上分配。

4.方法区

jdk7:方法区-永久代

jdk8:元空间-方法区

常量池(数量值、字符串值、类引用、字段、方法引用)vs运行时常量池(int、string)

方法区的垃圾回收(很难回收)

方法区的演变

抓住金三银四好机会,超齐全java大厂面试题汇总(请自寻学习查找答案)_spring

 抓住金三银四好机会,超齐全java大厂面试题汇总(请自寻学习查找答案)_java_02

 抓住金三银四好机会,超齐全java大厂面试题汇总(请自寻学习查找答案)_spring_03


5.jit即时编译器

6.垃圾回收

stop the world、安全点与安全区域,强软弱虚、内存溢出与内存泄漏。

引用计数法(循环引用问题无法解决)、可达性分析算法(GC ROOts,栈引用的对象、本地方法引用的对象、静态属性引用的对象、方法区中引用的对象例如字符串常量、同步锁持有的对象、系统类加载器加载的对象等等)

finalize(),对象被销毁之前会调用(只有一次复活机会)

标记-清除算法,复制算法,标记-压缩算法,分代回收,分区算法(G1)

7.垃圾回收器

串行新生代老年代回收(serial GC)单核cpu

并行垃圾新生代老年代回收器(parallel GC),吞吐量优先

parnew + CMS并发,但是需要有个兜底方案(低延迟)

G1区域化分代式,混合回收。分区域所以有个记忆集的概念,

zgc,革命性的。

三、springboot、springcloud

1.注解

@Bean、@Configuration、@ComponentScan扫描包(包括排除等等@Filter排除规则)、@Scope("prototype")(设置单实例多实例)、@Lazy-bean懒加载、@Conditional-按照条件注册bean、@Import导入组件

@Controller、@Service、@Repository、@Component注册名称都是类名首字母小写

@Value赋值、@PropertySource加载配置文件、@EnableConfigurationProperties + @ConfigurationProperties自动配置绑定

@Autowired自动注入(优先按照类型,多个类型就根据属性名查找)@Autowired:可以标注 构造器、参数、方法、属性。

@Qualifier指定需要装配的组件名称

@Primary装配首选bean

@Resource默认是按照属性名装配

@Inject自动装配,与@Autowired一样

@RestController、@Controller、@ResponseBody、@RequestMapping("/hello")

@SpringBootApplication启动类,容器注册

@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody、@RequestAttribute

@ControllerAdvice+@ExceptionHandler处理全局异常(推荐)

2.spring源码

BeanPostProcessor后置处理器,bean赋值,注入其他组件、@Autowired、生命周期注解功能、@Async、等等很多功能都用到了BeanPostProcessor。

ApplicationContextAwareProcessor注入源码

3.AOP

前置 后置 环绕 异常 返回通知。

在组件创建完成之后,判断组件是否需要增强,需要增强就返回一个代理对象。

拦截器链的概念

4.事务

@Transactional

底层使用AOP,

5.自动配置原理

@EnableAutoConfiguration

* SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration

* 每个自动配置类按照条件进行生效(@Conditionalxxxx),默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定

* 生效的配置类就会给容器中装配很多组件

* 只要容器中有这些组件,相当于这些功能就有了

* SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先(@ConditionalOnMissingBean)

*定制化配置:① 用户直接自己@Bean替换底层的组件② 用户去看这个组件是获取的配置文件什么值就去修改。

xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties

6.请求处理原理

HttpServlet -> HttpServletBean -> FrameworkServlet -> DispatcherServlet(实现doService-> doDispatch方法处理请求)

处理请求、解析参数、拦截器HandlerInterceptor

7.springcloud

nacos、feign openfeign、hystrix、gateway、sleuth zipkin、

sentinel、seata(AT模式、SAGA模式)

四、docker、k8

docker使用

五、netty

RPC框架、心跳检测、http服务器、即时通讯、消息推送

Channel通道,用来读写连接等,

EventLoop用来处理事件。

异步非阻塞。

CPU核心数*2

bossGroup:接收连接。

workerGroup:负责具体的处理,交由对应的 Handler 处理。

自带的解码器

六、xxljob

分布式任务调度,配合springbatch使用(但是springbatch比较复杂,reader、writer、processor等,所以直接用的tasklet)

七、处理生产问题

jstack 、 jmap

jps:显示当前java县城

jstack:查看当前进程的线程栈,通常查看死锁、锁等待等。

jmap:显示各种信息,还可以生成堆dump快照(会stop应用,生产慎用)

jstat查看堆内存

八、redis

string

hash

list

set

zset(sortedSet)

bitmap(位图)

HyperLogLog(统计)

GEO(地理)

stream

1.string

set get

ttl 查看过期时间

setnx 不存在创建

商品id等、点赞数、阅读量,incr命令递增

2.hash

hset hget

做缓存用

3.list

lpush:向左添加

rpush:向右添加

订阅列表

4.set(无序)

sadd、srem

交集、差集、并集运算,随机弹出元素(SPOP弹出并删除,SRANDMEMBER弹出不删除)。

抽奖小程序、点赞用户列表

微博社交关系(关注的人、我关注的人也关注她、可能认识的人、共同关注等)

5.zset

zadd、

商品排序(排行榜)、抖音热搜、

分布式锁、redisson、内存淘汰策略lru(最近最少使用)

哨兵、集群、持久化(快照、aof)

九、es

elk、查询、倒排索引、IK分词器、javaAPI


Relational DB(MySQL)



Elasticsearch



数据库(database)



索引(indices)(就和数据库一样)



表(tables)



类型types(慢慢会被弃用)



行(rows)



文档documents



字段(columns)



字段fields


十、mysql

MyISAM和InnoDB(支持行锁)

索引:单值索引、唯一索引、主键索引、复合索引

B+树,真实数据存在叶子结点,非叶子节点不存储真实数据,只存储索引方向。

需要索引:主键、频繁查询、频繁更新、高并发下更倾向于用复合索引、排序字段、统计分组字段。

不需要:表记录少、经常删改的、重复多的字段

explain:

id越大越先被执行

type最好达到ref级别

key_len:越短越好。

索引失效:

1.全值匹配我最爱。

2.最佳左前缀法则。

3.不在索引列上计算、函数、类型转换,字符串不加引号导致类型转换。

4.范围索引右边的列会失效。

5.尽量使用覆盖索引,少用select*

6.!= <>无法用索引

76.is null is not null

8.like以通配符开头的

9.少用or

慢查询日志、druid会有sql执行时间

乐观锁悲观锁