JAVA宝藏路线
2025-03-25 23:16:20 0 举报
AI智能生成
JAVA宝藏路线
作者其他创作
大纲/内容
编程思想
软件工程模型
瀑布模型
快速原型模型
增量模型
螺旋模型
喷泉模型
架构
分层架构
经典三层架构:表现层 - 业务逻辑层 - 数据交互层
客户端-服务端架构
管道-过滤器架构
主从架构
微内核架构
事件驱动架构
微服务架构
spring cloud、dubbo
领域驱动架构
基础
特性
封装
设定属性、抽象行为
继承
子类继承父类,可继承父类属性及方法,可对父类中的方法进行重写
单继承
多态
同种属性多种行为,简单理解为接口可有多实现类
多实现
泛型
参数化类型,所操作的类型作为参数,接收参数的时候可以为不同类型
面向对象
数据类型
八大基础数据类型
byte
1字节
short
2字节
int
4字节
long
8字节
double
8字节
float
4字节
boolean
1字节
char
2字节
引用数据类型
对象级别
集合
框架图
常用类型
List
线程安全
CopyOnWriteArrayList
介绍
* 并发包中唯一的并发List
* 对其进行的修改操作都是基于一个复制的数组(快照)上进行的,使用写时复制策略 不是操作的原list
* 复制的新数组长度 = 老数组长度 + 1 所以CopyOnWriteArrayList为无界list
*
* 方法内添加ReentrantLock锁(独占锁) 先获取锁才可以进行操作
* 1、无参创建时内部初始化一个长度为0的Object[]数组 该数组被volatile修饰 保证内存可见性
* 2、每次添加都创建一个新数组 将老数组复制到新数组 新数组的长度比老数组大1
*
* CopyOnWriteArrayList使用写时复制的策略来保证 list的一致性,而获取一修改一写入
* 三步操作并不是原子性的,所以在增删改的过程中都使用了独占锁,来保证在某个时间
* 只有一个线程能对 list 数组进行修改 另外CopyOnWriteArrayList提供了弱一致性的迭代器
* 从而保证在获取迭代器后其他线程对lisr的修改是不可见的,迭代器遍历的数组是一个快照
* 对其进行的修改操作都是基于一个复制的数组(快照)上进行的,使用写时复制策略 不是操作的原list
* 复制的新数组长度 = 老数组长度 + 1 所以CopyOnWriteArrayList为无界list
*
* 方法内添加ReentrantLock锁(独占锁) 先获取锁才可以进行操作
* 1、无参创建时内部初始化一个长度为0的Object[]数组 该数组被volatile修饰 保证内存可见性
* 2、每次添加都创建一个新数组 将老数组复制到新数组 新数组的长度比老数组大1
*
* CopyOnWriteArrayList使用写时复制的策略来保证 list的一致性,而获取一修改一写入
* 三步操作并不是原子性的,所以在增删改的过程中都使用了独占锁,来保证在某个时间
* 只有一个线程能对 list 数组进行修改 另外CopyOnWriteArrayList提供了弱一致性的迭代器
* 从而保证在获取迭代器后其他线程对lisr的修改是不可见的,迭代器遍历的数组是一个快照
源码剖析
Vector
介绍
* 性能不好!内部大部分方法都使用synchronized
*
* 1、无参创建时指定容量 10
* 2、有参(Collection)创建 参数转数组,有参(int,int)创建 指定初始容量和扩容容量
* 3、调用add(object)方法 add方法受synchronized保护
* 4、调用add(index,object)
* 5、扩容:若未指定扩容容量则容量增长一倍
* 6、最大容量:Integer.MAX_VALUE - 8
* 7、扩容后将老数组复制到新数组 Arrays.copyOf(elementData, newCapacity);
*
* 1、无参创建时指定容量 10
* 2、有参(Collection)创建 参数转数组,有参(int,int)创建 指定初始容量和扩容容量
* 3、调用add(object)方法 add方法受synchronized保护
* 4、调用add(index,object)
* 5、扩容:若未指定扩容容量则容量增长一倍
* 6、最大容量:Integer.MAX_VALUE - 8
* 7、扩容后将老数组复制到新数组 Arrays.copyOf(elementData, newCapacity);
源码剖析
线程不安全
ArrayList
介绍
* 数据结构:数组
* 1、ArrayList初始容量:10
* 2、ArrayList扩容规则:老数组的1.5倍
* 3、扩容方式是否为扩展老数组? 否!扩容方式为将老数组复制到一个新容量的数组;
* 4、最大容量:Integer.MAX_VALUE;
* 5、如果无法进行扩容且(老数组容量+1)< Integer.MAX_VALUE - 8 则直接将数组容量扩展为Integer.MAX_VALUE - 8;
* 6、如果(老数组容量 + 1)> Integer.MAX_VALUE - 8 数组容量直接扩展为Integer.MAX_VALUE;
* 7、为什么要使用MAX_ARRAY_SIZE作为允许的最大容量,而不是在无法扩容时直接将数组容量扩展至Integer.MAX_VALUE?
* 不同的JVM对对象的存储结构不一样,有的JVM会保存一些对象头信息在数组里面导致数组最大容量为Integer.MAX_VALUE - 对象头所占用的容量,
* 因此使用Integer.MAX_VALUE - 8 在中间做一层过渡,保证数组无法扩容但还不到最大容量时还可以继续添加新元素;
* 1、ArrayList初始容量:10
* 2、ArrayList扩容规则:老数组的1.5倍
* 3、扩容方式是否为扩展老数组? 否!扩容方式为将老数组复制到一个新容量的数组;
* 4、最大容量:Integer.MAX_VALUE;
* 5、如果无法进行扩容且(老数组容量+1)< Integer.MAX_VALUE - 8 则直接将数组容量扩展为Integer.MAX_VALUE - 8;
* 6、如果(老数组容量 + 1)> Integer.MAX_VALUE - 8 数组容量直接扩展为Integer.MAX_VALUE;
* 7、为什么要使用MAX_ARRAY_SIZE作为允许的最大容量,而不是在无法扩容时直接将数组容量扩展至Integer.MAX_VALUE?
* 不同的JVM对对象的存储结构不一样,有的JVM会保存一些对象头信息在数组里面导致数组最大容量为Integer.MAX_VALUE - 对象头所占用的容量,
* 因此使用Integer.MAX_VALUE - 8 在中间做一层过渡,保证数组无法扩容但还不到最大容量时还可以继续添加新元素;
源码剖析
LinkedList
介绍
* 数据结构:双向链表
* 1、无参创建时无任何操作
* 2、有参(Collection类型)创建时将参全部添加到LinkedList
* 3、调用add方法添加元素 尾插法将新节点放到最后因此有序 返回boolean值
* 4、调用get时判断传入的index是否小于链表长度的1/2,如果是则从头节点开始往后遍历index次
* 如果index大于链表长度的1/2,则从尾节点开始往前遍历index次
* 保证遍历次数小于链表长度的1/2
* 5、优缺点,添加删除很快 获取慢最慢需要遍历1/2长度
* 1、无参创建时无任何操作
* 2、有参(Collection类型)创建时将参全部添加到LinkedList
* 3、调用add方法添加元素 尾插法将新节点放到最后因此有序 返回boolean值
* 4、调用get时判断传入的index是否小于链表长度的1/2,如果是则从头节点开始往后遍历index次
* 如果index大于链表长度的1/2,则从尾节点开始往前遍历index次
* 保证遍历次数小于链表长度的1/2
* 5、优缺点,添加删除很快 获取慢最慢需要遍历1/2长度
源码剖析
Map
线程安全
ConcurrentHashMap
Hashtable
线程不安全
HashMap
数据结构
数组+链表+红黑树
源码剖析
LinkedHashMap
介绍
* 继承HashMap
* 大部分操作基本和HashMap一样,数据结构也是数组+链表+红黑树
* put过程中,LinkedHashMap重写了将元素放入节点的方法:newNode(),每当元素放入节点时LinkedHashMap会将这个节点追加到一条链表上
* 如果put的元素已经存在,那么修改原节点的value,
* -如果LinkedHashMap中的属性accessOrder访问顺序设置为true且当前修改的节点不是最后一个则把这个节点移动到链表的最后:afterNodeAccess()
* 大部分操作基本和HashMap一样,数据结构也是数组+链表+红黑树
* put过程中,LinkedHashMap重写了将元素放入节点的方法:newNode(),每当元素放入节点时LinkedHashMap会将这个节点追加到一条链表上
* 如果put的元素已经存在,那么修改原节点的value,
* -如果LinkedHashMap中的属性accessOrder访问顺序设置为true且当前修改的节点不是最后一个则把这个节点移动到链表的最后:afterNodeAccess()
源码剖析
TreeMap
Set
线程安全
CopyOnWriteArraySet
SynchronizedSet
线程不安全
HashSet
介绍
1、hashset数据结构:每个存储的数据对应一个对象(Object),存储的数据作为key
2、用于存储不重复的数据;
3、内部维护一个hashmap
4、无序
5、线程不安全
2、用于存储不重复的数据;
3、内部维护一个hashmap
4、无序
5、线程不安全
源码剖析
LikedHashSet
介绍
* 底层:HashSet + LinkedHashMap
* 存储还是用的HashMap 数据存储后执行一个插入后操作 newNode,维护链表
* LinkedHashSet = HashSet + LinkedHashMap
* 存储还是用的HashMap 数据存储后执行一个插入后操作 newNode,维护链表
* LinkedHashSet = HashSet + LinkedHashMap
源码剖析
TreeSet
Queue
阻塞
非阻塞
Stack
IO
字节流
字符流
文件流
缓冲流
BIO(同步阻塞流)
NIO(同步非阻塞流)
AIO(异步非阻塞流)
网络编程
客户端
服务端
并发
实现线程的几种方式
继承Thread类
实现Runnable接口
实现Callable接口
需要借助FutureTask + Thread运行,可以获取线程执行结果
线程状态
NEW
新建
RUNNABLE
运行
BLOCKED
阻塞
WAITING
等待
TIMED_WAITING
定时等待
TERMINATED
死亡
线程池
核心参数
核心线程数
一般根据机器的cpu核数设置,不会被回收的线程数,就算被回收了后续调用也会被创建
最大非核心线程数
会被回收的线程
非核心线程数存活时间
时间单位
阻塞队列
线程池内的线程都在处理任务时,新接受的任务先存储到阻塞队列
线程工厂
设置线程的一些属性
拒绝策略
线程池无法接受新任务时的处理策略
执行流程
生命周期
锁
锁类型
乐观锁
悲观锁
独占锁
共享锁
读写锁
偏向锁
锁原理
锁升级(jdk1.6)
线程八锁
原子操作类
CAS
AQS
设计模式
对象行为
简单工厂模式
抽象工厂模式
单例模式
责任链模式
策略模式
访问者模式
装饰模式
享元模式
状态模式
代理模式
原型模式
观察者模式
备忘录模式
中介者模式
迭代器模式
外观模式
组合模式
命令模式
建造者模式
桥接模式
类行为
工厂方法模式
适配器模式
模板方法模式
解释器模式
框架
mybatis
源码剖析
加载配置文件,
加载配置文件返回Reader对象(字符流)
加载配置文件返回Reader对象(字符流)
Resources.getResourceAsReader("mybatis.xml");
若不指定Resources的charset属性
则默认使用系统编码
则默认使用系统编码
Resources内部封装一个包含
五个类加载器的数组ClassLoaderWrapper
1、classLoader--自定义类加载器
2、defaultClassLoader--默认类加载器
3、Thread.currentThread().getContextClassLoader()---线程上下文类加载器
4、getClass().getClassLoader()---加载当前类的类加载器
5、systemClassLoader---系统类加载器
五个类加载器的数组ClassLoaderWrapper
1、classLoader--自定义类加载器
2、defaultClassLoader--默认类加载器
3、Thread.currentThread().getContextClassLoader()---线程上下文类加载器
4、getClass().getClassLoader()---加载当前类的类加载器
5、systemClassLoader---系统类加载器
遍历classLoaderWrapper中的类加载器
通过类加载器加载"mybatis.xml",返回InputStream
底层调用URL url = getResource(name);
涉及到双亲委派机制
通过类加载器加载"mybatis.xml",返回InputStream
底层调用URL url = getResource(name);
涉及到双亲委派机制
加载过程中,由于有的类加载器需要资源前带有"/"
因此"mybatis.xml"加载次数最少为1最大为10
因此"mybatis.xml"加载次数最少为1最大为10
构造SqlSessionFactory
new SqlSessionFactoryBuilder().build(reader)
通过被加载的Reader构造一个SqlSessionFactory实例
Reader使用xml规则解析,解析后的数据装载到XPathParser中
的一个Document属性document
的一个Document属性document
Reader解析期间,mybatis离线实体解析器(各种dtd文件装载而来)
被装载到XPathParser中
被装载到XPathParser中
包含离线实体解析器和Reader数据的XPathParser对象
被装载到XMLConfigBuilder --- xml配置构造器
被装载到XMLConfigBuilder --- xml配置构造器
构造好的xml配置构造器根据xml中的标签解析数据,构造一个Configuration对象
用于存储xml配置中的所有配置信息其中包括数据源信息、所有的mapper文件及其他mybatis配置,且只解析一次!
即Configuration实例只会存在一个
用于存储xml配置中的所有配置信息其中包括数据源信息、所有的mapper文件及其他mybatis配置,且只解析一次!
即Configuration实例只会存在一个
mybatis配置文件解析标签顺序
说明文档:https://mybatis.org/mybatis-3/zh/configuration.html
properties
属性配置
settings
解析的时候结合Configuration中的属性进行校验
如果setting中的配置属性在Configuration中找不到
报错
如果setting中的配置属性在Configuration中找不到
报错
如果settings中配置了vfsImpl,mybatis优先调用自定义的虚拟文件系统(VFS)
未配置则默认不指定
未配置则默认不指定
如果settings中配置了logImpl,则设置日志工厂为自定义的
typeAliases
设置别名
plugins
添加mybatis插件,即实现了interceptor的自定义处理器
实现Interceptor接口
objectFactory
指定对象工厂,当创建结果集时,MyBatis 会使用一个对象工厂来完成创建这个结果集实例。
在默认的情况下,MyBatis 会使用其定义的对象工厂——DefaultObjectFactory来完成对应的工作
在默认的情况下,MyBatis 会使用其定义的对象工厂——DefaultObjectFactory来完成对应的工作
实现ObjectFactory接口
objectWrapperFactory
指定对象装饰工厂
实现ObjectWrapperFactory接口
reflectorFactory
指定反射工厂
实现ReflectorFactory接口
environments
配置数据源、事务管理器
databaseIdProvider
数据库多厂商配置
typeHandlers
类型处理器
mappers
解析所有配置的mapper.xml映射文件
解析方法:XMLConfigBuilder.mapperElement()
mapper中只包含package方式配置
mappers标签中只包含resource方式配置
Resources.getResourceAsStream()获取指定类的流
通过获取到的流、Configuration、资源路径、可复用sql
构建一个XMLMapperBuilder实例
通过获取到的流、Configuration、资源路径、可复用sql
构建一个XMLMapperBuilder实例
使用Set集合存储资源路径,如果是第一次解析
通过XMLMapperBuilder.configurationElement()
解析目标文件(mapper.xml),保存mapper的namespace到一个MapperBuilderAssistant实例
通过XMLMapperBuilder.configurationElement()
解析目标文件(mapper.xml),保存mapper的namespace到一个MapperBuilderAssistant实例
如果mapper.xml中存在标签cache-ref或cache
则先将这两个标签中的内容存储到缓存
则先将这两个标签中的内容存储到缓存
通过namespace绑定mapper.xml和dao,Configuration内部维护一张注册表MapperRegistry
MapperRegistry内部为Map,key为对应dao的class,value为对应的MapperProxyFactory(映射器代理工厂)
MapperRegistry内部为Map,key为对应dao的class,value为对应的MapperProxyFactory(映射器代理工厂)
解析mapper.xml中的所有parameterMap标签
解析mapper.xml中的所有resultMap标签
解析mapper.xml中的所有sql标签
解析mapper.xml中的所有增删改查标签
mappers标签中只包含url方式配置
和resource一样
mappers标签中只包含class方式配置
通过配置的全限定名,使用反射获取加载类
调用方法:Resources.classForName("xxx.class"),和获取配置文件的逻辑差不多
通过classLoaderWrapper类加载器封装器获取,底层调用Class.forName(name, true, cl)
通过classLoaderWrapper类加载器封装器获取,底层调用Class.forName(name, true, cl)
反射获取到加载类后,调用Configuration.addMapper()
方法将其放入映射注册器(configuration内部的一个属性)中;
简单点说就是把mapper对应的class存储到一个map中,
key是class,value是这个class的一个动态代理工厂
方法将其放入映射注册器(configuration内部的一个属性)中;
简单点说就是把mapper对应的class存储到一个map中,
key是class,value是这个class的一个动态代理工厂
三种配置方式只能同时使用一种,
即不能在mappers标签中出现资源定位配置方式
即不能在mappers标签中出现资源定位配置方式
mapper.xml解析结束后,保存资源路径到Set中
避免重复解析
避免重复解析
绑定命名空间和mapper
即dao和xml的绑定
即dao和xml的绑定
最终根据Configuration实例化一个DefaultSqlSessionFactory返回
生产SqlSession
factory.openSession();
通过SqlSessionFactory生产一个会话-SqlSession
SqlSession有两个实现类
1、DefaultSqlSessionFactory
2、SqlSessionManager
显示调用的情况下使用的是DefaultSqlSessionFactory
因此调用DefaultSqlSessionFactory.openSession()生产SqlSession
1、DefaultSqlSessionFactory
2、SqlSessionManager
显示调用的情况下使用的是DefaultSqlSessionFactory
因此调用DefaultSqlSessionFactory.openSession()生产SqlSession
通过Configuration指定执行器的级别
mybatis中执行器有三个级别:
1、SIMPLE
2、REUSE
3、BATCH
如果配置文件中没有指定,默认SIMPLE
mybatis中执行器有三个级别:
1、SIMPLE
2、REUSE
3、BATCH
如果配置文件中没有指定,默认SIMPLE
openSession无参时不指定事务的隔离级别并且关闭自动提交
获取配置文件中的环境配置,
即标签<environments></environments>
中的配置,如果该标签中没有指定事务管理器,那么默认使用ManagedTransactionFactory管理事务
否则使用配置的事务管理器,mybaits中有两种事务管理器:
1、JdbcTransactionFactory
2、ManagedTransactionFactory
即标签<environments></environments>
中的配置,如果该标签中没有指定事务管理器,那么默认使用ManagedTransactionFactory管理事务
否则使用配置的事务管理器,mybaits中有两种事务管理器:
1、JdbcTransactionFactory
2、ManagedTransactionFactory
通过事务管理器ManagedTransactionFactory构造数据库连接器Transaction,
用来管理连接的生命周期:
创建->准备->提交/回滚->关闭
creation, preparation, commit/rollback and close
构造的数据库连接器默认关闭自动提交,并且不支持事务,事务由外部控制
用来管理连接的生命周期:
创建->准备->提交/回滚->关闭
creation, preparation, commit/rollback and close
构造的数据库连接器默认关闭自动提交,并且不支持事务,事务由外部控制
事务隔离级别:
1、读未提交
2、读已提交
3、可重复读
4、串行化
1、读未提交
2、读已提交
3、可重复读
4、串行化
使用构造好的数据库连接器Transaction和指定的执行器级别创建一个Executor
根据对应的执行器级别创建对应的执行器
BATCH -> BatchExecutor
REUSE -> ReuseExecutor
SIMPLE -> SimpleExecutor
根据对应的执行器级别创建对应的执行器
BATCH -> BatchExecutor
REUSE -> ReuseExecutor
SIMPLE -> SimpleExecutor
三种执行器均为BaseExecutor的子类
BaseExecutor的实现类:
1、BatchExecutor(sql级别)
2、ReuseExecutor(sql级别)
3、SimpleExecutor(sql级别)
4、ClosedExecutor(未连接执行器,返回异常UnsupportedOperationException)
BaseExecutor的实现类:
1、BatchExecutor(sql级别)
2、ReuseExecutor(sql级别)
3、SimpleExecutor(sql级别)
4、ClosedExecutor(未连接执行器,返回异常UnsupportedOperationException)
BaseExecutor实现Executor接口
实现Executor接口的类:
1、BatchExecutor(sql级别)
2、ReuseExecutor(sql级别)
3、SimpleExecutor(sql级别)
4、ClosedExecutor(未连接)
5、BaseExecutor(基类)
6、CachingExecutor(缓存+sql)
实现Executor接口的类:
1、BatchExecutor(sql级别)
2、ReuseExecutor(sql级别)
3、SimpleExecutor(sql级别)
4、ClosedExecutor(未连接)
5、BaseExecutor(基类)
6、CachingExecutor(缓存+sql)
执行器的内部其实就是对JDBC的封装
执行器的设计采用策略模式,基本的执行逻辑都在基类BaseExecutor中定义好
其中具体的一些执行逻辑就通过各个策略(执行器)具体执行,策略的选择就是通过配置中
defaultExecutorType的值来选择
其中具体的一些执行逻辑就通过各个策略(执行器)具体执行,策略的选择就是通过配置中
defaultExecutorType的值来选择
执行器创建完成后根据配置中cacheEnabled判断
是否开启二级缓存,如果开启执行器变为:CachingExecutor
是否开启二级缓存,如果开启执行器变为:CachingExecutor
指定好最终的执行器后,使用责任链模式增强执行器处理
即,用户可以实现Interceptor接口,自定义执行器,mybatis会
轮询责任链上的执行器进行后续的处理 - - - mybatis插件原理
即,用户可以实现Interceptor接口,自定义执行器,mybatis会
轮询责任链上的执行器进行后续的处理 - - - mybatis插件原理
通过执行器Executor、配置Configuration、是否自动提交
创建DefaultSqlSession实例 返回
创建DefaultSqlSession实例 返回
执行操作,以查询为例
一、使用SqlSession自带操作方法
sqlSession.selectOne("com.dwk.Mapper.findById",1)
sqlSession.selectOne("com.dwk.Mapper.findById",1)
调用SqlSession内部的selectList,查一个和查多个其实是一样的
最后对结果长度判断,如果长度为1则返回,如果大于1报错,小于1返回null
最后对结果长度判断,如果长度为1则返回,如果大于1报错,小于1返回null
调用selectList查询,limit范围为0-Integer.MAX_VALUE
默认不指定结果处理器
二、通过映射执行
Dao为自定义类,即dao(mapper)
Dao dao= sqlSession.getMapper(Dao.class);
dao.findById("id");
Dao为自定义类,即dao(mapper)
Dao dao= sqlSession.getMapper(Dao.class);
dao.findById("id");
netty
基础知识
源码剖析
spring
特性
aop、ioc、di (面向切面编程、控制反转、依赖注入)
模块及作用
spring-aop
spring-aspects
spring-beans
spring-context
spring-context-indexer
spring-context-support
spring-core
spring-core-test
spring-expression
spring-instrument
spring-jcl
spring-jdbc
spring-jms
spring-messaging
spring-orm
spring-oxm
spring-r2dbc
spring-test
spring-tx
spring-web
spring-webflux
spring-webmvc
spring-websocket
源码剖析
spring boot
特性
自动配置
启动依赖
依赖注入
控制反转
启动器制作
源码剖析
spring cloud
基础概念
微服务解决方案,一种思想而非一种技术
常用核心组件
nacos
架构和原理
注册中心和配置中心
架构
整体架构
用户层
Console
SDK
Agent
CLI
OpenApi
业务层
服务管理
配置管理
元数据管理
内核层
插件机制
事件机制
日志模块
回调机制
寻址模式
推送通道
容量管理
流量管理
缓存机制
启动模式
一致性协议
存储模块
插件
NameServer
CMDB
Metrics
Trace
子主题
接入管理
用户管理
权限管理
审计系统
通知系统
配置模型
应用端和服务端通过GRPC协议保持长连接,客户端会监听服务端配置文件的MD5是否和本地的MD5相同,如果不相同就同步服务端的配置
客户端会保存近10次的配置快照,如果服务端掉线,客户端可以通过获取本地的配置快照继续运行 - 容灾能力,保证服务端掉线不完全影响客户端的运行
中间件
消息中间件
kafka
简介
特性
源码剖析
rabbitMQ
简介
特性
源码剖析
rocketMQ
简介
特性
源码剖析
缓存中间件
redis
特性
基于内存,6.0版本之前是单线程之后引入了多线程
数据类型,及应用场景
String
字符串
Hash
哈希
List
数组
Set
去重集合
Zset
去重有序集合
源码剖析
mongodb
特性
elasticsearch
特性
倒排索引
作为搜索引擎
作为db
集成链路追踪
数据库
mysql
CURD
select * from table where column = xxx
delete * from table where column = xxx
update table set cloumn = xxx where cloumn = xxx
insert into table(column1,column2...) values (xxx1,xxx2)
关联查询
左连接
left join
右连接
right join
内连接
inner join
外连接
outer join
全连接
full join
组合查询
union
视图
函数
触发器
存储过程
执行计划
SQL执行流程
锁
行锁
表锁
死锁
产生原因
预防
解决
存储引擎
INNODB
MYISAM
MEMORY
MERGE
事务
含义
隔离级别
不同隔离级别分别会产生什么问题
mvcc多版本并发控制
索引
索引类型
索引失效
索引结构
临时表
主备
搭建
原理
oracle
postgresql
死锁
查看
杀死锁进程
JVM
基础概念
STW
停止业务线程 + 执行GC线程
内存结构
堆
存放对象和数组
线程共享
所有的对象实例和数组都在堆上分配空间
垃圾回收器管理堆内存,负责对象的分配和释放
栈
线程私有
存储了线程的方法调用栈、局部变量和部分结果
每个方法在执行时都会创建一个栈帧,栈帧包含方法的局部变量表、操作数栈、动态链接、方法返回地址等信息
方法区/元数据空间
整个JVM进程共享
存放类的元数据、静态变量、常量池等信息
在较新的JVM中,方法区通常被实现为元空间(Metaspace),用来存放类的元数据
类的元数据包括类的结构信息、字段、方法信息等
程序计数器
位于每个线程私有的区域,用于存储当前线程执行的字节码指令地址。
每个线程都有自己的程序计数器,线程之间的程序计数器互不影响。
本地方法栈
与栈类似,但是用于执行本地(Native)方法的线程私有内存区域。
为线程执行服务
直接内存
机器直接内存
内存模型
堆
栈
虚拟机栈
本地方法栈
方法区/元数据空间
程序计数器
运行时常量池
直接内存
垃圾定位算法
可达性分析算法
标记算法
三色标记
颜色指针标记
垃圾回收算法
标记清除
标记一块清除一块,【对内存连续性影响大】
拷贝
先标记要回收的,把不需要回收的拷贝到连续内存,再清理被标记的 【占用内存】
标记压缩
一边标记一边回收,回收完之后再整理内存使之连续 【效率低】
分代收集
根据对象存活周期的不同将堆分为几块,通常是新生代(Eden)和老年代(old)
新生代使用拷贝算法
老年代使用标记压缩算法
增量回收
将整个垃圾回收过程分为若干步骤,交替执行垃圾回收和应用程序逻辑
减少单次垃圾回收造成的停顿时间,提高系统响应性能
并行回收
在多个CPU或多个线程上并行执行垃圾回收操作
提高垃圾回收效率,缩短垃圾回收停顿时间
错误标记
垃圾回收器
分代模型
分代模型将堆内存分为新生代(Young Generation)、老年代(Old Generation)和永久代(PermGen,现在被元数据区MetaSpace替代)等多个区域,分别使用不同的垃圾收集算法来管理这些区域的对象。
通常配合使用
Serial(作用于新生代)
Serial old(作用于老年代)
Parallel Scavenge(作用于新生代)
Parallel Old(作用于老年代)
ParNew(作用于新生代)
CMS(作用于老年代)
非分代模型
相对于分代模型,非分代模型在内存管理上不显式区分对象的生命周期,而是尝试通过单一的垃圾收集算法来处理整个堆内存中的对象。这种模型适用于那些对象生命周期难以预测或者对象的存活时间分布比较均匀的场景
G1
物理不分代-逻辑分代
Zgc
jdk11以上引入
Epsilon
jdk11以上引入
Shenandoah
jdk12以上引入
常用命令
java - 每启动一个java命令就启动一个专门的jvm
非标准参数
分支主题
调优参数
约700左右参数
GC常用
-Xmn
年轻代
-Xms
最小堆
-Xmx
最大堆
-Xss
栈空间
-XX:+UseTLAB
使用TLAB,默认打开
-XX:+PrintTLAB
打印TLAB使用情况
-XX:TLABSize
设置TLAB大小
-XX:+DisableExplictGC
System.gc()不管用,FGC
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintHeapAtGC
-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationConcurrentTime
打印应用程序时间(低)
-XX:+PrintGCApplicationStoppedTime
打印暂停时长(低)
-XX:+PrintReferenceGC
记录回收了多少种不同引用类型的引用(重要性低)
-verbose:class
类加载详细过程
-XX:+PrintVMOptions
-XX:+PrintFlagsFinal -XX:+PrintFlagsinitial
***必须会用
Parallel常用
-XX:SurvivoRatio
-XX:PreTenureSizeThreshold
-XX:MaxTenuringThreshold
-XX:ParallelGCThreads
并行收集器的线程数,同样适用于CMS,一般设置为CPU核数
-XX:+UseAdaptiveSizePolicy
自动选择各区大小比例
CMS常用
-XX:+UseConcMarkSweepGC
-XX:ParallelCMSThreads
CMS线程数量
-XX:CMSInitiatingOccupancyFraction
使用多少比例的老年代后开始CMS收集,默认是68%,如果频繁发生SeriaOld卡顿应该调小,(频繁CMS回收)
-XX:+UseCMSCompacttFullCollction
在FGC时进行压缩
-XX:CMSFullGCsBeforeCompaction
多少次FGC后进行压缩
-XX:+CMSClassUnloadingEnable
-XX:CMSInitiatingPermOccupancyFraction
达到什么比例时进行Perm回收
GCTimeRatio
设置GC时间占用运行程序时间的百分比
-XX:MaxGCPauseMills
停顿时间,是一个建议时间GC会使用各种方式达到这个时间,如减小年轻代
G1常用
-XX:+UseG1GC
-XX:MaxGCPauseMillis
建议值,G1会尝试调整Yong区的块数来达到这个值
-XX:GCPauseIntervalMillis
GC的间隔时间
-XX:+G1HeapReginSize
分区大小,建议主键增大该值,随着size增加,垃圾存活的时间更长,GC间隔更长,但每次GC的时间也会更长
G1NewSizePercent
新生代最小比例,默认5%
G1MaxNewSizePercent
新生代最大比例,默认65%
GCTimeRatio
GC时间建议比例,G1会根据这个值调整堆空间
ConcGCThreads
线程数量
InitiatingHeapOccupancyPercent
启动G1的堆空间占用比例
-XX:+HeapDumpOnOutOfMemoryError
启动参数,当OOM时自动生成堆转储文件
信息查看常用
jps
查看所有java程序进程号
jinfo
查看某个Java进程详细信息
jstat
查看某个java进程的jvm内存占用情况
jstack
查看某个java进程的堆内线程运行情况
jmap
不能随便使用,会阻断jvm运行
查看某个java进程中对应类型对象的数量
生成一个dump文件(堆内存的转储文件)
工具
jdk自带 java visualVM
arthas
操作系统
linux
常用命令
设置开机自启
cd /etc/systemd/system
touch xxxx.service
vi xxxx.service
[Unit]
Description=xxxxService
Wants=network-online.target
After=network.target
[Service]
Type=simple
# default start cmd
ExecStart='启动命令'
# Suppress stderr to eliminate duplicated messages in syslog. NM calls openlog()
# with LOG_PERROR when run in foreground. But systemd redirects stderr to
# syslog by default, which results in logging each message twice.
StandardOutput=syslog
StandardError=null
[Install]
WantedBy=multi-user.target
Description=xxxxService
Wants=network-online.target
After=network.target
[Service]
Type=simple
# default start cmd
ExecStart='启动命令'
# Suppress stderr to eliminate duplicated messages in syslog. NM calls openlog()
# with LOG_PERROR when run in foreground. But systemd redirects stderr to
# syslog by default, which results in logging each message twice.
StandardOutput=syslog
StandardError=null
[Install]
WantedBy=multi-user.target
systemctl enable xxxx.service
systemctl list-unit-files | grep xxxx
查询命令
find . -name 'xxx.xx'
子主题
windows
一键启动多应用
echo start
echo WEIXIN START
start /d "C:\DWK\Soft\WeChat" WeChat.exe
echo IDEA START
start /d "C:\DWK\IDE\IDEA-2023\IntelliJ IDEA 2023.1\bin" idea64.exe
exit
echo WEIXIN START
start /d "C:\DWK\Soft\WeChat" WeChat.exe
echo IDEA START
start /d "C:\DWK\IDE\IDEA-2023\IntelliJ IDEA 2023.1\bin" idea64.exe
exit
容器
docker
特性
最小化操作系统环境满足服务最小运行环境
使用
常用命令及含义
docker images
查看镜像
docker ps
查看运行中容器
docker ps -a
查看所有容器
docker run -itd --restart=always --privileged --name [NAME] --hostname [NAME]--network host [image:tag]
启动镜像
docker load -i xxx.tar
挂载镜像
docker exec -it 容器id /bin/bash
进入容器
docker cp /path 容器id:/path
复制宿主机文件到容器里
docker logs -f --tail 容器id
查看容器日志
k8s
web服务器
tomcat
特性
单亲委派
使用
源码剖析
nginx
特性
负载均衡、代理
使用
内网穿透(非面试点)
代码管理
GIT
配置
git config user.name "ddd"
设置用户名
git config user.email "137xxx@qq.com"
设置邮箱
git config --global user.name "ddd"
设置全局用户名
git config --global user.email "137xxx@qq.com"
设置全局邮箱
git config --list
查看配置
仓库
git init
当前目录初始化一个仓库
git clone
检出仓库
git clone --branch [分支名] [地址]
检出分支
git remote -v
查看远程仓库
git remote add [name] [url]
添加远程仓库
git remote rm [name]
删除远程仓库
git pull
拉取远程仓库
git add
添加指定文件到暂存区
git rm
删除工作区和暂存区文件
git rm --cached
停止追踪指定文件,保留该文件在工作区
git mv
工作区与暂存区文件重命名
git commit -m "提交日志"
提交暂存区到仓库
git commit -v
提交时显示所有diff信息
git commit --amend -m [message]
替换上一次提交
git push
推送到远程仓库
信息查看与对比
git log
查看提交日志
git log -p [file]
查看指定文件的提交历史
git blame [file]
以列表方式查看指定文件的提交历史
git status
查看状态
git diff
查看变更的内容
查询详细指令
git --help
git help -a
git help -g
git help <command>
撤销
git checkoout [file]
恢复暂存区的指定文件到工作区
git checkout [commit] [file]
恢复某个commit的指定文件到工作区
git checkou
恢复上一个commit的所有文件到工作区
git reset --hard
重置暂存区与工作区,与上一次commit保持一致
git reset --hard [commit]
重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset [commit]
重置当前分支的指针commit,同时重置暂存区,工作区不变
git reset --keep [commit]
重置当前HEAD为指定commit,但保持暂存区和工作区不变
git revert [commit]
撤销指定的提交
分支
git branch
查看本地分支
git branch -v
查看远程分支
git branch [branch-name]
创建分支
git checkout [branch-name]
切换分支
git checkout -b [branch-name]
创建并切换分支
git branch -d [branch-name]
删除分支
git merge [branch-name]
合并分支
标签
git tag
查看标签
git tag -r
查看远程标签
git tag [tag-name]
创建标签
git tag -a [tag-name] -m 'message'
创建带注释的标签
git tag -d [tag-name]
删除标签
暂存
git stash
将当前项目修改存入暂存区
git unstash
撤销暂存区
SVN
图形化操作
算法
排序
冒泡
插入
快速
希尔
选择
堆
归并
计数
桶
基数
动态规划
特征
最优子结构
状态转移方程
边界
重复计算
思路
穷举分析
确定边界
确定最优子结构
减少重复计算,(状态转移方程)
贪心
深度优先搜索
广度优先搜索
DevOps
jdk
db
mysql
pgsql
oracle
cache
redis
mongo
容器
docker
安装启动脚本
#!/bin/bash
# 更新系统
yum update -y
# 安装必要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker
yum install -y docker-ce
# 启动Docker服务
systemctl start docker
# 设置Docker开机自启
systemctl enable docker
# 验证Docker是否安装成功
docker version
# 输出提示信息
echo "Docker已成功安装并启动!"
# 更新系统
yum update -y
# 安装必要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker
yum install -y docker-ce
# 启动Docker服务
systemctl start docker
# 设置Docker开机自启
systemctl enable docker
# 验证Docker是否安装成功
docker version
# 输出提示信息
echo "Docker已成功安装并启动!"
k8s
elk
elasticsearch
kibana
logstash
mq
rabbitmq
rocketmq
kafka
emq
nacos
CI/CD(快速构建部署)
jenkins
centos
面试资源
java全栈知识体系
0 条评论
下一页