目录
5.线程池
6.设计模式
2.加载
3.堆
4.方法区
6.垃圾回收
1.注解
3.AOP
4.事务
2.hash
3.list
5.zset
九、es
一、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)
方法区的垃圾回收(很难回收)
方法区的演变
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执行时间
乐观锁悲观锁