add logseq-java
This commit is contained in:
5
logseq-java/pages/@Async为什么会导致循环依赖解决不了.md
Normal file
5
logseq-java/pages/@Async为什么会导致循环依赖解决不了.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- Async也是一个AOP
|
||||
- 三级缓存里面的lambda表达式只会去执行AspectJ的注解的AOP
|
||||
- 执行Async的时候出现循环依赖是不会提前判断是否执行@Async,从而不会提前AOP,但是后面执行AOP的时候又会生成另一个代理对象
|
||||
- 后续生成了另一个代理对象,会比较两个对象,不同就会报错
|
||||
- 想要解决可以再注入的对象上添加@Lazy注解,添加了这个注解之后B注入的就只是一个代理对象,调用的时候才会查找是否有这个Bean
|
||||
4
logseq-java/pages/@Autowired.md
Normal file
4
logseq-java/pages/@Autowired.md
Normal file
@@ -0,0 +1,4 @@
|
||||
- 表示某个属性是要自动注入
|
||||
- 加在属性上会自动对该属性赋值,先按照类型后按照名称匹配
|
||||
- 用在方法上时,会根据参数类型,参数名称找到对象并通过反射进行创建
|
||||
- 加载构造方法上会使用该构造方法
|
||||
5
logseq-java/pages/@ConditionOnClass注解底层原理.md
Normal file
5
logseq-java/pages/@ConditionOnClass注解底层原理.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- SpirngBoot.jar calss文件已经编译好了
|
||||
- 已经编译好了,不会编译报错
|
||||
- 运行报错
|
||||
- 通过ASM来读取字节码,操作字节码来读取注解,从而不用再JVM加载全部的类再扫描
|
||||
- 利用ASM读取到字符串信息后利用applicationContext.getClassLoader().loadClass("UnderTow.class")
|
||||
5
logseq-java/pages/@Configuration注解的作用是什么.md
Normal file
5
logseq-java/pages/@Configuration注解的作用是什么.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- 不添加这个注解的时候会事务失效
|
||||
- jdbc连接和事务管理器是两个连接对象
|
||||
- jdbcTemplate从ThreadLocal可以获取事务管理连接,事务管理会创建连接并保存到ThreadLocal<Map<DataSource,conn>>中,jdbc获得不到该事务管理器创建的连接会去创建一个新的连接,而这个连接会自动提交
|
||||
- 添加了Configuration注解之后会使得jdbc和事务管理的连接的数据源是同一个
|
||||
- 有多个数据源的时候添加了这个注解也可能会失效
|
||||
2
logseq-java/pages/@Resource和@Autowired的区别.md
Normal file
2
logseq-java/pages/@Resource和@Autowired的区别.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- @Resource按名称装配
|
||||
- @Autowire按属性装配
|
||||
7
logseq-java/pages/API.md
Normal file
7
logseq-java/pages/API.md
Normal file
@@ -0,0 +1,7 @@
|
||||
- Application Programming Interface
|
||||
- 应用编程接口
|
||||
- 在Java中提供了大量的类,接口,函数等一系列基础工具
|
||||
- 目的
|
||||
- 简化程序员开发
|
||||
- JDK1.8 API文档
|
||||
- [JDK1.8.CHM](../assets/JDK1.8_1649904511236_0.CHM)
|
||||
10
logseq-java/pages/ASCII.md
Normal file
10
logseq-java/pages/ASCII.md
Normal file
@@ -0,0 +1,10 @@
|
||||
- American Standard Code for Information Interchange
|
||||
- 共128个字符
|
||||
- [ASCII表](https://www.runoob.com/w3cnote/ascii.html)
|
||||
- 拓展
|
||||
- 欧洲 ISO/IEC 8859
|
||||
- 中国 GB2312 --> GBK
|
||||
- 统一码(Unicode) UTF-8 UTF-16 UTF-32
|
||||
- 全世界通用 UTF-8
|
||||
- [[转码]]
|
||||
- [[解码]]
|
||||
60
logseq-java/pages/ArrayList.md
Normal file
60
logseq-java/pages/ArrayList.md
Normal file
@@ -0,0 +1,60 @@
|
||||
- ```java
|
||||
Arraylist datas = new ArrayList<>();
|
||||
```
|
||||
- 是[[List]]的实现类
|
||||
- 常用[[API]]
|
||||
- 添加元素[[add]](),[[addAll]]()
|
||||
- 不能添加 [[基本数据类型]] ,底层将[[int]]类型包装为 [[Integer]] 类型
|
||||
- ```java
|
||||
ArrayList datas = new ArrayList();
|
||||
datas.add("name");
|
||||
datas.add(1)
|
||||
```
|
||||
- [[size]]()
|
||||
- [[get]]()
|
||||
- [[add]](int index,element e)
|
||||
- 将元素插入指定下标。后面的元素后移一位
|
||||
- [[set]]()
|
||||
- [[remove]]()
|
||||
- [[contains]]()
|
||||
- [[indexOf]]()
|
||||
- 返回元素出现在集合中第一个位置的下标
|
||||
- [[isEmpty]]()
|
||||
- 判断内部是否有元素
|
||||
- [[clear]]()
|
||||
- 集合遍历
|
||||
- ((625782a9-64e5-4f9a-8d40-45ed6f9ddaf9))
|
||||
- ((625782a9-c1c2-413d-b1cf-255ecbea27d4))
|
||||
- [[迭代器]] [[Interator]] 遍历
|
||||
id:: 625e1ecf-25a9-4b64-8eab-042fd889a062
|
||||
- ```java
|
||||
//返回迭代器
|
||||
Iterator its = datas.iterator();
|
||||
while(its.hasNext()){
|
||||
//获得的元素
|
||||
Object ele = its.next;
|
||||
System.out.println(ele);
|
||||
//边取边删除
|
||||
its.remove()
|
||||
}
|
||||
```
|
||||
- [[集合排序]] #排序
|
||||
- [[数组排序]] Arrays.sort
|
||||
- 集合工具包[[Collections]]
|
||||
- [[addAll]]
|
||||
- 向集合中添加元素
|
||||
- Collecetions.addall(datas,"ele1","ele2","ele3",...)
|
||||
- [[sort]]
|
||||
- Collestions.sort(datas)
|
||||
- 自定义 [[引用数据类型]] 要用到使用到[[Comparable]]接口
|
||||
- [[重写]][[compareTo]]
|
||||
- 然后调用sort方法
|
||||
- [[自然排序]]
|
||||
- [[自定义排序]]
|
||||
- 自己定义比较器,完成排序规则
|
||||
- 不需要实现Comparable接口
|
||||
- sort(List,Comparator<T>)
|
||||
- 重写compare
|
||||
- 底层结构
|
||||
- 底层是数组结构
|
||||
- 初始长度为0,加第一个元素长度变10,后面每次长度增加都是原来的1.5倍
|
||||
6
logseq-java/pages/Arrays.md
Normal file
6
logseq-java/pages/Arrays.md
Normal file
@@ -0,0 +1,6 @@
|
||||
- [[toString]]
|
||||
- Arrays.toString()
|
||||
- [[sort]]
|
||||
- [[binarySearch]]
|
||||
- [[copyOf]]
|
||||
- [[equals]]
|
||||
63
logseq-java/pages/B+树.md
Normal file
63
logseq-java/pages/B+树.md
Normal file
@@ -0,0 +1,63 @@
|
||||
- 每个页大小为16K,页的结构:
|
||||
- 页标识
|
||||
- 最小记录record_type=2
|
||||
- 最大记录record_type=3
|
||||
- 普通记录record_type=0,1是B+树非叶子节点记录
|
||||
- recore_type+next_record+c1列+c2列+c3列+其他信息(该id所在页)
|
||||
- 非叶子节点不存储数据,之存储主键,页之间使用双向链表连接,方便范围和反向排序查询
|
||||
- 聚簇索引
|
||||
- 主键作为索引的值
|
||||
- 索引和数据保存在同一个文件中
|
||||
- 页内记录按照主键大小排序排成一个单向链表
|
||||
- 页和页之间根据主键大小排序成一个双向链表
|
||||
- 非叶子节点存储记录主键和页号
|
||||
- 叶子节点存储完整的用户记录
|
||||
- 优点
|
||||
- 数据访问更快
|
||||
- 对于主键排序查找和范围查找非常快
|
||||
- 查询一定范围数据是,由于数据相连,可以从更少数据快中提取数据,节省IO操作
|
||||
- 缺点
|
||||
- 插入速度依赖插入顺序,按照主键顺序插入最快,否则会出现页分裂,影响性能
|
||||
- 更新主键代价非常高,将导致被更新的行移动
|
||||
- 限制
|
||||
- 只有InnoDB支持,MyISAM不支持
|
||||
- 每个表只能有一个
|
||||
- 没有定义主键时将选取非空唯一列代替,没有就隐式定义一个主键rowID
|
||||
- 为了充分利用,表中主键应该选择有序的ID,不建议使用UUID,MD5,Hash,字符串作为主键
|
||||
- 查找和匹配逻辑
|
||||
- 根据第一层对应的范围找到第二层的页地址
|
||||
- 根据第二层的数据找到对应的下一层页地址,直到找到record_type=0存放普通数据的叶子节点的页地址
|
||||
- 再叶子节点上定位到对应的数据
|
||||
- 非聚簇索引
|
||||
- 非主键索引外的其他索引
|
||||
- 页间的记录根据所选类的大小排序
|
||||
- 页和页也是通过双向链表连接的
|
||||
- 非叶子节点记录数据值和页号
|
||||
- 非叶子节点存储数据值和主键
|
||||
- 可以有多个
|
||||
- 查找匹配逻辑
|
||||
- 查找的过程与聚簇索引前面一样
|
||||
- 找到对应记录的主键数值
|
||||
- 根据主键值去聚簇索引中查找一遍
|
||||
- 和,二叉树,平衡二叉树,红黑树,B树的区别
|
||||
- 二叉树
|
||||
- 不能平衡,容易变成链表
|
||||
- 平衡二叉树
|
||||
- 可以通过自旋转保证左右两边高度平衡
|
||||
- 树的高度过高
|
||||
- 红黑树
|
||||
- 自旋速度比较快
|
||||
- 非严格平衡二叉树
|
||||
- B树
|
||||
- 非叶子节点页存储数据
|
||||
- 一个B+树存放多少索引记录
|
||||
- 三层千万级别
|
||||
- 数据占用1KB,指针和键值10字节
|
||||
- 16x1600x1600=40960000
|
||||
- B+树crud效率如何
|
||||
- 新增和删除比较麻烦,需要更新索引,查询和更新效率高
|
||||
- O(lognN) N为高度
|
||||
- 自适应哈希索引
|
||||
- InnoDB一个特殊功能,某些索引值使用非常频繁会再内存中基于B+树所有值之上创建一个哈希索引,从而具有哈希索引一些特点
|
||||
- 2-3树,2-3-4树
|
||||
- 多叉树允许每个节点可以有更多的数据项和子节点,通过增加分叉减少树的高度
|
||||
15
logseq-java/pages/BeanDefination.md
Normal file
15
logseq-java/pages/BeanDefination.md
Normal file
@@ -0,0 +1,15 @@
|
||||
- 用来表示Bean定义
|
||||
- Spring根据BeanDefination来创建Bean对象,有很多属性来描述Bean
|
||||
- beanClass
|
||||
- 表示一个Bean的类型,根据此属性实例化得到对象
|
||||
- scope
|
||||
- 表示一个Bean的作用域
|
||||
- isLazy
|
||||
- 表示是否需要懒加载,原型不起作用
|
||||
- dependsOn
|
||||
- 表示一个Bean再创建前需要依赖的其他Bean,一个Bean创建前这些需要创建好
|
||||
- primary
|
||||
- 表示一个Bean是主Bean,一个类型可以存在多个Bean,依赖注入是有主Bean会选择主Bean注入
|
||||
- initMethodName
|
||||
- 一个Bean的初始化方法,初始化阶段会调用这个方法,可以自定义逻辑对这个加工
|
||||
- @Component、@Bean、\<bean />都会解析为BeanDefinatino
|
||||
16
logseq-java/pages/BeanFactory.md
Normal file
16
logseq-java/pages/BeanFactory.md
Normal file
@@ -0,0 +1,16 @@
|
||||
- 一种Spring容器,可以用来创建Bean
|
||||
- BeanFactory用 [[BeanDefination]]来生成Bean
|
||||
- 核心子接口和实现类
|
||||
- ListableBeanFactory
|
||||
- ConfigurableBeanFactory
|
||||
- AutowireCapableBeanFactory
|
||||
- AbstractBeanFactory
|
||||
- DefaultListableBeanFactory
|
||||
- 最重要
|
||||
- 单例Bean
|
||||
- Bean别名
|
||||
- 父子BeanFactory
|
||||
- Bean类型转化
|
||||
- Bean后置处理
|
||||
- 支持FactoryBean
|
||||
- 支持自动装配
|
||||
10
logseq-java/pages/Bean生命周期.md
Normal file
10
logseq-java/pages/Bean生命周期.md
Normal file
@@ -0,0 +1,10 @@
|
||||
- 一个Bean创建和销毁过程中所经历的步骤,可以利用Bean的生命周期对Bean进行自定义加工
|
||||
- [[BeanDefination]]
|
||||
- 构造方法推断
|
||||
- 实例化,通过构造方法反射获取实例
|
||||
- 属性填充,自动注入,依赖注入
|
||||
- 初始化
|
||||
- 初始化前BeanPostProcess
|
||||
- 初始化initliazeBean
|
||||
- 初始化后AOP
|
||||
- 销毁
|
||||
19
logseq-java/pages/BigDecimal.md
Normal file
19
logseq-java/pages/BigDecimal.md
Normal file
@@ -0,0 +1,19 @@
|
||||
- 解决[[基本数据类型]]浮点数[[float]][[double]]在参与运算时存在丢失精度的问题
|
||||
- ```java
|
||||
//使用字符串作为参数,最精准
|
||||
BigDecimal a = new BigDecimal("0.1");
|
||||
```
|
||||
- 加减乘除
|
||||
- ```java
|
||||
a.add(b);
|
||||
a.subtract(b);
|
||||
a.multiply(b);
|
||||
a.divde(b);
|
||||
```
|
||||
- 收尾规则
|
||||
- ROUND_DOWN去尾模式
|
||||
- 直接去掉后面的数
|
||||
- ROUND_UP收尾模式
|
||||
- 判断最后舍弃的那个位置是否为0,非0则加1
|
||||
- ROUND_HALF_UP
|
||||
- [[四舍五入]]
|
||||
5
logseq-java/pages/CAS是一种什么样的同步机制.md
Normal file
5
logseq-java/pages/CAS是一种什么样的同步机制.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- CompareAndSwap
|
||||
- CAS实现是借助C/C++调用CPU指令实现的
|
||||
- 循环时间长,开销大
|
||||
- 只能保证一个共享变量的原子操作
|
||||
- ABA问题
|
||||
8
logseq-java/pages/CAS缺点.md
Normal file
8
logseq-java/pages/CAS缺点.md
Normal file
@@ -0,0 +1,8 @@
|
||||
- ABA问题
|
||||
- 添加版本号
|
||||
- AtomicInteger
|
||||
- 自旋时间过长
|
||||
- 单次不一定能够成功
|
||||
- 线程竞争不激烈才能成功
|
||||
- 范围不能灵活控制
|
||||
- 通过一个新的类整合共享变量
|
||||
17
logseq-java/pages/CMS垃圾回收过程.md
Normal file
17
logseq-java/pages/CMS垃圾回收过程.md
Normal file
@@ -0,0 +1,17 @@
|
||||
- Concurrent Mark Sweep
|
||||
- 用户线程可以和垃圾收集器线程共同运行
|
||||
- 初始标记
|
||||
- 找到所有GCRoot直接能够引用的对象,速度很快
|
||||
- 并发标记
|
||||
- 从GCRoot直接关联对象开始遍历整个对象图,时间较长但是不需要停顿用户线程
|
||||
- 可以和用户线程并行
|
||||
- 重新标记
|
||||
- 修正并发标记期间因用户程序继续运行导致标记变动的那一部分对象
|
||||
- 多标解决比较麻烦,因此多标导致的浮动垃圾在下一轮处理
|
||||
- 主要解决少标问题
|
||||
- 并发清理
|
||||
- 开启用户线程,GC线程对未标记区域做清理,有新增对象标记为黑色并不做任何处理
|
||||
- 并发重置
|
||||
- 重置本次GC中的标记数据
|
||||
-
|
||||
- 并发收集,低停顿
|
||||
2
logseq-java/pages/CMS比较严重的问题并发收集阶段再次触发Full GC.md
Normal file
2
logseq-java/pages/CMS比较严重的问题并发收集阶段再次触发Full GC.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- 并发失败,concurrent mode failure
|
||||
- 进入stop the world,用serial old垃圾收集器回收
|
||||
23
logseq-java/pages/Class.md
Normal file
23
logseq-java/pages/Class.md
Normal file
@@ -0,0 +1,23 @@
|
||||
- Java中所有[[类]]都是Class类型的[[对象]]
|
||||
- 类加载器负责加载所有的类,class字节码文载入到内存中,载入到内存的类[[JVM]]会创建一个Java.lang.Class对象
|
||||
- 通过该class对象可以访问该类的所有方法
|
||||
- 获取该类的class对象
|
||||
- 1. 访问类的class属性
|
||||
2. 调用对象的getClass()方法
|
||||
先new一个对象再使用
|
||||
3. 通过类的全限定名字符串加载
|
||||
- java.lang.reflect包
|
||||
- 通过[[反射]]调用该类的构造方法
|
||||
- 通过getConstructor()
|
||||
- 1. 获取该类的Class对象
|
||||
2. getConstructor()获取构造器
|
||||
3. 通过newInstance() 新建对象
|
||||
- getConstructors()
|
||||
- 获取所有构造器
|
||||
- 访问属性
|
||||
- getField()
|
||||
- set()
|
||||
- 访问方法
|
||||
- gerMethod()
|
||||
- invoke()
|
||||
-
|
||||
1
logseq-java/pages/Collection 和 Collections 有什么区别.md
Normal file
1
logseq-java/pages/Collection 和 Collections 有什么区别.md
Normal file
@@ -0,0 +1 @@
|
||||
-
|
||||
1
logseq-java/pages/Collection 和 Collections 的区别是啥.md
Normal file
1
logseq-java/pages/Collection 和 Collections 的区别是啥.md
Normal file
@@ -0,0 +1 @@
|
||||
- 参考[[Collection 和 Collections 有什么区别]]
|
||||
3
logseq-java/pages/Collection.md
Normal file
3
logseq-java/pages/Collection.md
Normal file
@@ -0,0 +1,3 @@
|
||||
- [[集合]]
|
||||
- 是一套父[[接口]]
|
||||
-
|
||||
1
logseq-java/pages/Collection集合和Map体系集合的区别.md
Normal file
1
logseq-java/pages/Collection集合和Map体系集合的区别.md
Normal file
@@ -0,0 +1 @@
|
||||
- 参考 [[Collection 和 Collections 的区别是啥]]
|
||||
@@ -0,0 +1,4 @@
|
||||
- jdk1.7使用了默认16个segment分段,每一个segment操作不会影响其他segment
|
||||
- 1.8使用node数组,每一个头节点都加了sync锁,同时通过自旋和cas操作来保证初始化
|
||||
- 插入时通过cas来尝试写入,失败就自旋
|
||||
- 查找时通过哈希计算位置,然后查找执行节点,如果头节点哈希值小于0就在扩容或是红黑树,使用find查找,链表就用遍历的方法
|
||||
5
logseq-java/pages/ConcurrentHashMap为什么放弃了分段锁.md
Normal file
5
logseq-java/pages/ConcurrentHashMap为什么放弃了分段锁.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- 操作不同段map时可以并发执行
|
||||
- 分成很多段时会浪费内存空间
|
||||
-
|
||||
- 1.8
|
||||
- synchronized和CAS,锁住一个node
|
||||
17
logseq-java/pages/DOS.md
Normal file
17
logseq-java/pages/DOS.md
Normal file
@@ -0,0 +1,17 @@
|
||||
- ### DOS命令
|
||||
- DOS窗口
|
||||
- win+R --> [[CMD]]
|
||||
- [[cd]]命令
|
||||
- 进入到某一个目录
|
||||
- [[dir]]命令
|
||||
- 列出所有文件及子目录
|
||||
- 跳转盘符 d:
|
||||
- 跳转到其它磁盘
|
||||
- [[cls]]清屏
|
||||
- 清空屏幕
|
||||
- [[ping]]测试
|
||||
- 测试网络是否连通
|
||||
- [[ipconfig]]
|
||||
- 获得本机的ip地址信息
|
||||
- [[exit]]
|
||||
- 退出DOS窗口
|
||||
5
logseq-java/pages/DOS命令.md
Normal file
5
logseq-java/pages/DOS命令.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- cd 目录
|
||||
- cd x:
|
||||
- dir
|
||||
- ipconfig
|
||||
- ping
|
||||
1
logseq-java/pages/Date.md
Normal file
1
logseq-java/pages/Date.md
Normal file
@@ -0,0 +1 @@
|
||||
- 用Date类计算日期特别麻烦,因此使用 [[Calendar]]计算
|
||||
29
logseq-java/pages/Eclipse.md
Normal file
29
logseq-java/pages/Eclipse.md
Normal file
@@ -0,0 +1,29 @@
|
||||
- Eclipse基本介绍
|
||||
- 打开
|
||||
- 界面
|
||||
- 初始设置
|
||||
- 改变默认字体大小
|
||||
- 修改默认编码模式
|
||||
- 使用Eclipse新建项目完成HelloWorld
|
||||
- 1. 新建项目
|
||||
2. 输入项目名称
|
||||
3. 项目结构
|
||||
4. 新建java程序
|
||||
5. Package位置输入包名
|
||||
6. 右侧代码编辑区域写代码
|
||||
7. 点击工具运行按钮
|
||||
8. 点击下方Console界面查看结果
|
||||
- 快捷键
|
||||
id:: 6241c521-c1c0-4c83-9834-058144ce2e88
|
||||
- Alt+上下键 调整代码顺序
|
||||
- Shift+左右键 选择光标左右代码
|
||||
- Ctrl+Shift+F 格式化代码
|
||||
- Ctrl+C 复制
|
||||
- Ctrl+V 粘贴
|
||||
- Ctrl+X 剪切
|
||||
- Ctrl+D 删除一行
|
||||
- Ctrl+Z 撤销
|
||||
- Ctrl+Y 回撤
|
||||
- Ctrl+S 保存
|
||||
- 项目导出
|
||||
- 项目导入
|
||||
25
logseq-java/pages/ElasticSearch.md
Normal file
25
logseq-java/pages/ElasticSearch.md
Normal file
@@ -0,0 +1,25 @@
|
||||
- 一个分布式的开源搜索和分析引擎,在[[Apache]][[Lucene]]的基础上开发而成
|
||||
- 优势
|
||||
- 速度快
|
||||
- 具有分布式的本质特征
|
||||
- 包含一系列的广泛功能
|
||||
- 简化了数据采集,可视化和报告过程
|
||||
- [[Cluster]]集群
|
||||
- Node节点
|
||||
- 一个节点是一个ES的实例
|
||||
- Shard分片
|
||||
- 基于分片可进行分布式的并行的操作,进而提高性能,吞吐量
|
||||
- 与 [[MySQL]]的比较
|
||||
- [[Docker]]安装
|
||||
- ```yml
|
||||
# PATH /usr/local/config/elasticsearch.yml
|
||||
|
||||
cluster.name: "docker-cluster"
|
||||
network.host: 0.0.0.0
|
||||
http.cors.enabled: true
|
||||
http.cors.allow-origin: "*"
|
||||
http.cors.allow-headers: Authorization
|
||||
```
|
||||
- ```bash
|
||||
docker run -d --name es -v /usr/local/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -p 9200:9200 -p 9300:9300 --privileged=true -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e "discovery.type=single-node" registry.cn-hangzhou.aliyuncs.com/elasticsearch/elasticsearch:7.2.1
|
||||
```
|
||||
45
logseq-java/pages/Eureka.md
Normal file
45
logseq-java/pages/Eureka.md
Normal file
@@ -0,0 +1,45 @@
|
||||
- # 注册中心
|
||||
- spring netfilx的核心组件之一
|
||||
- 用于注册服务和地址,实现服务信息注册和查找
|
||||
- 维护服务名称和服务实例对应关系
|
||||
- 每个微服务都会向注册中心获取服务列表,汇报运行状态,当有其他服务调用是,可以从服务列表中获取实例地址调用
|
||||
- 服务端配置
|
||||
- 启动类注解`@EnableEurekaServer`
|
||||
- ```yaml
|
||||
spring:
|
||||
application:
|
||||
name: eureka-server # eureka-server,Server名字自定义
|
||||
server:
|
||||
port: 8761 # eureka-server port, default is 8761
|
||||
|
||||
eureka:
|
||||
client:
|
||||
service-url:
|
||||
defaultZone: http://localhost:8761/eureka # eureka-server default zone 向Eureka Server注册时,注册中心地址
|
||||
register-with-eureka: false # eureka-server register-with-eureka, false 不向注册中心注册
|
||||
fetch-registry: false # eureka-server fetch-registry, false 是否获取注册信息
|
||||
```
|
||||
- 客户端配置
|
||||
- 启动类注解
|
||||
- `@EnableDiscoveryClient`用于可能使用其它注册中心时
|
||||
- `@EnableEurekaClient`用于仅使用Eureka注册中心
|
||||
- ```yaml
|
||||
spring:
|
||||
application:
|
||||
name: eureka-client # eureka-client 客户端向注册中心注册的服务ID
|
||||
server:
|
||||
port: 8080
|
||||
eureka:
|
||||
client:
|
||||
service-url:
|
||||
defaultZone: http://localhost:8761/eureka # 注册中心地址
|
||||
```
|
||||
- 服务续约
|
||||
- 默认30s发送一次心跳,超时90s
|
||||
- 自我保护机制
|
||||
- 因网络故障导致服务不可用时的一种保护机制
|
||||
- 网络异常,服务正常的
|
||||
- 开启后不剔除故障服务,等待修复网络正常
|
||||
- 高可用
|
||||
- 注册中心集群,防止某个服务宕机
|
||||
- 注册中心相互注册,客户端同时在两个注册中心注册
|
||||
1
logseq-java/pages/FIFO.md
Normal file
1
logseq-java/pages/FIFO.md
Normal file
@@ -0,0 +1 @@
|
||||
- First In First Out
|
||||
1
logseq-java/pages/File.md
Normal file
1
logseq-java/pages/File.md
Normal file
@@ -0,0 +1 @@
|
||||
- File类,用来代表程序外部文件或文件夹
|
||||
8
logseq-java/pages/G1垃圾收集过程.md
Normal file
8
logseq-java/pages/G1垃圾收集过程.md
Normal file
@@ -0,0 +1,8 @@
|
||||
- 初始标记
|
||||
- 暂停线程,记录GCROOT直接引用对象
|
||||
- 并发标记
|
||||
- 最终标记
|
||||
- 筛选回收
|
||||
- 对各个Region的回收价值和成本进行排序,根据最大停顿时间设置来进行回收
|
||||
- 最大停顿时间
|
||||
- 可以通过设置用户期望的GC停顿STW时间制定回收计划
|
||||
1
logseq-java/pages/G1收集器最大停顿时间时如何实现的.md
Normal file
1
logseq-java/pages/G1收集器最大停顿时间时如何实现的.md
Normal file
@@ -0,0 +1 @@
|
||||
- 把内存按照Region来回收,后台维护一个优先列表,根据允许的收集时间,优先选择回收价值最大的Region,从而确保有限时间内尽可能高的收集效率
|
||||
2
logseq-java/pages/GC Root可达性分析法.md
Normal file
2
logseq-java/pages/GC Root可达性分析法.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- 将GC Root对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象标记为非垃圾,其它为垃圾
|
||||
- 根节点:线程栈的本地变量,静态变量,本地方法栈的变量
|
||||
3
logseq-java/pages/GC.md
Normal file
3
logseq-java/pages/GC.md
Normal file
@@ -0,0 +1,3 @@
|
||||
- Garbage collection
|
||||
- 垃圾回收
|
||||
- 回收失去引用的对象
|
||||
11
logseq-java/pages/GC什么时候都能做吗,GC安全点和安全区域.md
Normal file
11
logseq-java/pages/GC什么时候都能做吗,GC安全点和安全区域.md
Normal file
@@ -0,0 +1,11 @@
|
||||
- 需要代码运行到安全点或安全区域才能做
|
||||
- 安全点
|
||||
- 代码中一些特定位置,这些位置的状态是确定的
|
||||
- 方法返回之前
|
||||
- 调用某个方法之后
|
||||
- 抛出异常的位置
|
||||
- 循环的末尾
|
||||
- 当需要垃圾回收中断线程时,不直接对线程操作,简单设置一个标志位,当线程到达安全位置时检查这个标志,发现中断标志为真时在安全点上主动挂起
|
||||
- 安全区域
|
||||
- 一个线程处于sleep或中断状态,就不能响应JVM中断请求,再运行到安全点上
|
||||
- 在一段代码片段中,引用关系不会发生改变,这个区域内任何地方开始GC都是安全的
|
||||
3
logseq-java/pages/Git.md
Normal file
3
logseq-java/pages/Git.md
Normal file
@@ -0,0 +1,3 @@
|
||||
- github
|
||||
- gitee
|
||||
-
|
||||
16
logseq-java/pages/HTML.md
Normal file
16
logseq-java/pages/HTML.md
Normal file
@@ -0,0 +1,16 @@
|
||||
- HyperText Markup Language
|
||||
- 结构
|
||||
- 声明`<!DOCTYPE html>`
|
||||
- 完整HTML页面`<html>`
|
||||
- 头部`<head>`
|
||||
- 页面内容<body>
|
||||
- 标题
|
||||
- 通过<h1> - <h6>定义
|
||||
- 段落
|
||||
- 通过<p>标签定义
|
||||
- 链接
|
||||
- 通过<a>标签定义
|
||||
- 图像
|
||||
- 通过<img>标签定义
|
||||
- 注释
|
||||
- 通过`<!-- text-->`来注释
|
||||
2
logseq-java/pages/HTTPS 通讯协议是如何实现的 它的加密方式是什么.md
Normal file
2
logseq-java/pages/HTTPS 通讯协议是如何实现的 它的加密方式是什么.md
Normal file
@@ -0,0 +1,2 @@
|
||||
-
|
||||
-
|
||||
1
logseq-java/pages/HTTP通讯协议分为几个部分 请求协议的组成.md
Normal file
1
logseq-java/pages/HTTP通讯协议分为几个部分 请求协议的组成.md
Normal file
@@ -0,0 +1 @@
|
||||
-
|
||||
46
logseq-java/pages/HashMap.md
Normal file
46
logseq-java/pages/HashMap.md
Normal file
@@ -0,0 +1,46 @@
|
||||
- [[Map]]集合中的一种实现
|
||||
- 底层结构
|
||||
- JDK1.7前:[[数组]]+ [[链表]]
|
||||
- JDK1.7后:[[数组]]+[[链表]]+ [[红黑二叉树]]
|
||||
- 用法
|
||||
- ```java
|
||||
HashMap<String,String> datas = new HashMap<>();
|
||||
```
|
||||
- [[put]]
|
||||
- [[putAll]]
|
||||
- [[get]]
|
||||
- [[getOrDefault]]
|
||||
- 允许放[[null]]键null值
|
||||
- [[replace]]
|
||||
- [[remove]]
|
||||
- [[clear]]
|
||||
- [[keySet]]
|
||||
- [[values]]
|
||||
- [[去重]]
|
||||
- 依靠Hashcode和equals
|
||||
- HashSet的底层是HashMap的key
|
||||
- Keys要重写equals和hashCode
|
||||
- 遍历
|
||||
- [[forEach]]
|
||||
- ```java
|
||||
datas.forEach(new BiConsumer<Girl, Boy>() {
|
||||
@Override
|
||||
public void accept(Girl key, Boy value) {
|
||||
System.out.println("key=" + key + ",value" + value);
|
||||
}
|
||||
});
|
||||
```
|
||||
- 获得键的集合
|
||||
- ```java
|
||||
Set<Girl> keys = datas.keySet();
|
||||
for (Girl e : keys) {
|
||||
System.out.println("key=" + e + ",value=" + datas.get(e));
|
||||
}
|
||||
```
|
||||
- [[entrySet]]
|
||||
- ```java
|
||||
Set<Map.Entry<Girl, Boy>> entries = datas.entrySet();
|
||||
for (Map.Entry<Girl, Boy> e : entries {
|
||||
System.out.println("key=" + e.getKey() + ",value=" + e.getValue());
|
||||
}
|
||||
```
|
||||
6
logseq-java/pages/HashMap内部如何工作.md
Normal file
6
logseq-java/pages/HashMap内部如何工作.md
Normal file
@@ -0,0 +1,6 @@
|
||||
- 哈希碰撞
|
||||
- 初始容量16
|
||||
- 数组64,节点8个转红黑树
|
||||
- put方法
|
||||
- 扩容机制
|
||||
- get方法
|
||||
23
logseq-java/pages/HashSet.md
Normal file
23
logseq-java/pages/HashSet.md
Normal file
@@ -0,0 +1,23 @@
|
||||
- [[Set]]接口的实现类
|
||||
- 底层是 [[HashMap]] 的key
|
||||
- 遍历
|
||||
- ((625782a9-c1c2-413d-b1cf-255ecbea27d4))
|
||||
- {{embed ((625e1ecf-25a9-4b64-8eab-042fd889a062))}}
|
||||
- forEach遍历
|
||||
id:: 625f6ab4-5bf2-40bf-a258-8d3d5765361f
|
||||
{{embed ((625e5ddf-aa2d-4567-8531-3ccc94628ef7)) }}
|
||||
- [[排序]]
|
||||
- 借助ArrayList的排序
|
||||
- ```java
|
||||
Arraylist<String> arrs = new ArrayList<String>(datas);
|
||||
Collections.sort(arrs);//升序排序
|
||||
Collections.reverse(arrs);//反转降序
|
||||
```
|
||||
- 去重原理
|
||||
- 计算hashcode值,看集合内是否存在
|
||||
- 如果存在,调用元素上的equals()与对应hash链表上每个元素比较,相同则不添加,不同就添加
|
||||
- Java对象特点
|
||||
- 相同的[[Hash]]值,可能对象不同 Aa和BB
|
||||
- 相同对象,Hash值相同
|
||||
- HashSet去重
|
||||
- 元素类重写 [[equals]]和[[hashCode]]
|
||||
2
logseq-java/pages/HashTable.md
Normal file
2
logseq-java/pages/HashTable.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- 和 [[HashMap]]的区别
|
||||
- 带 [[synchronized]]关键字
|
||||
45
logseq-java/pages/HelloWorld详解.md
Normal file
45
logseq-java/pages/HelloWorld详解.md
Normal file
@@ -0,0 +1,45 @@
|
||||
- ### 执行步骤
|
||||
- Hello代码
|
||||
```java
|
||||
public class HelloWorld{
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Hello World");
|
||||
}
|
||||
}
|
||||
```
|
||||
- 编译步骤
|
||||
- > [[编译]]:相当于英文书籍的中文翻译,一定会出来一个新的文件
|
||||
- > [[解释]]:国家领导人参与国际会议,戴的同声传译
|
||||
- Java是一种半编译,半解释性语言
|
||||
- [[字节码]]信息,配合JVM虚拟机,就可以做到[[跨平台]]
|
||||
- Java源代码文件基本结构
|
||||
- Java程序依靠类来组织自己的代码
|
||||
- [[类]][[class]]
|
||||
- **类的类名要跟源代码的文件名保持一致**
|
||||
- ```java
|
||||
public class 类的类名{
|
||||
/*
|
||||
Java程序中主函数/主入口
|
||||
一个程序要跑起来,一定要有一个主入口
|
||||
主函数的结构是固定的
|
||||
*/
|
||||
public static void main(String[] arg){
|
||||
|
||||
//其它代码
|
||||
|
||||
}
|
||||
}
|
||||
```
|
||||
- 比如
|
||||
- ```java
|
||||
public class SelfIntroduce{
|
||||
public static void main(String[] args){
|
||||
|
||||
System.out.println("My name is ***")
|
||||
|
||||
}
|
||||
}
|
||||
```
|
||||
- **SelfIntroduce** 类名,和文件名保持一致
|
||||
- **main** 函数方法
|
||||
- **System.out.println("")** 程序输出方法
|
||||
20
logseq-java/pages/IDEA.md
Normal file
20
logseq-java/pages/IDEA.md
Normal file
@@ -0,0 +1,20 @@
|
||||
- [官网地址](https://www.jetbrains.com/idea/)
|
||||
- 新建项目
|
||||
- Create-->Java--> Create project from template
|
||||
Project name
|
||||
Project location
|
||||
- Base package三层结构(com.woniuxy.java001)
|
||||
id:: 6243a9f6-b334-4daf-b1ec-b51335bba244
|
||||
- com 公司
|
||||
gov 政府
|
||||
edu 教育
|
||||
org 开源
|
||||
- 公司组织名称
|
||||
- 项目名称
|
||||
- 调整字体
|
||||
- File-->Setting-->Editor-->Font
|
||||
- 背景设置
|
||||
- 设置Eclipse快捷键
|
||||
- ((6241c521-c1c0-4c83-9834-058144ce2e88))
|
||||
- sout-->System.out.println()
|
||||
- psvm-->public static void main()
|
||||
9
logseq-java/pages/IDE集成开发环境.md
Normal file
9
logseq-java/pages/IDE集成开发环境.md
Normal file
@@ -0,0 +1,9 @@
|
||||
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
|
||||
- 常见IDE
|
||||
- **[[Eclipse]]**
|
||||
- Myeclipes
|
||||
- STS
|
||||
- VS
|
||||
- **[[IDEA]]**
|
||||
- 使用最多,太方便,集成大多插件
|
||||
- [[Java程序注释]]#程序/注释
|
||||
17
logseq-java/pages/IEDA.md
Normal file
17
logseq-java/pages/IEDA.md
Normal file
@@ -0,0 +1,17 @@
|
||||
- [官网地址](https://www.jetbrains.com/idea/)
|
||||
- 新建项目
|
||||
- Create-->Java--> Create project from template
|
||||
Project name
|
||||
Project location
|
||||
- Base package三层结构(com.woniuxy.java001)
|
||||
- com 公司
|
||||
gov 政府
|
||||
edu 教育
|
||||
org 开源
|
||||
- 公司组织名称
|
||||
- 项目名称
|
||||
- 调整字体
|
||||
- File-->Setting-->Editor-->Font
|
||||
- 背景设置
|
||||
- 设置Eclipse快捷键
|
||||
- ((6241c521-c1c0-4c83-9834-058144ce2e88))
|
||||
25
logseq-java/pages/IF判断.md
Normal file
25
logseq-java/pages/IF判断.md
Normal file
@@ -0,0 +1,25 @@
|
||||
- Java代码执行循序
|
||||
- 从上至下,从左至右
|
||||
- 特殊情况
|
||||
- IF流程控制
|
||||
- 循环结构
|
||||
- 方法的调用
|
||||
- IF流程控制
|
||||
- [[单分支]]
|
||||
- ```java
|
||||
if(布尔表达式){
|
||||
//语言代码
|
||||
}
|
||||
```
|
||||
- 双分支
|
||||
- ```java
|
||||
if(布尔表达式){
|
||||
//语言代码1
|
||||
} else{
|
||||
//语言代码2
|
||||
}
|
||||
```
|
||||
- 双分支的简化写法
|
||||
- [[三元运算符]]
|
||||
- [[嵌套判断]]
|
||||
- [[多分支]]
|
||||
23
logseq-java/pages/IO流.md
Normal file
23
logseq-java/pages/IO流.md
Normal file
@@ -0,0 +1,23 @@
|
||||
- [[Input]]
|
||||
- 将资源使用流的方式,读取到程序内部
|
||||
- [[Output]]
|
||||
- 将资源使用流的方式,从程序内部输出到外部
|
||||
- 分类
|
||||
- 流的走向
|
||||
- 输入流
|
||||
- 输出流
|
||||
- 处理单位
|
||||
- [[字节流]][[byte]]
|
||||
- [[字符流]][[char]]
|
||||
- 功能
|
||||
- 节点流
|
||||
- 直接面对数据源的流
|
||||
- 功能流
|
||||
- 针对节点流进行一次额功能封装的流
|
||||
- 使用场景
|
||||
- 上传图片,视频
|
||||
- 下载文件,视频
|
||||
- 操作步骤
|
||||
- 创建流
|
||||
- 操作流
|
||||
- 关闭流
|
||||
3
logseq-java/pages/IP.md
Normal file
3
logseq-java/pages/IP.md
Normal file
@@ -0,0 +1,3 @@
|
||||
- Internet Protocol
|
||||
- [网际协议](https://zh.wikipedia.org/wiki/%E7%BD%91%E9%99%85%E5%8D%8F%E8%AE%AE)
|
||||
-
|
||||
1
logseq-java/pages/InetAddress.md
Normal file
1
logseq-java/pages/InetAddress.md
Normal file
@@ -0,0 +1 @@
|
||||
- 代表[[IP]]地址
|
||||
6
logseq-java/pages/JDK1.8日期API.md
Normal file
6
logseq-java/pages/JDK1.8日期API.md
Normal file
@@ -0,0 +1,6 @@
|
||||
- [[LocalDate]]
|
||||
- [[LocalTime]]
|
||||
- [[LocalDateTime]]
|
||||
-
|
||||
- title:: jdk1/8日期api
|
||||
-
|
||||
35
logseq-java/pages/JDK环境搭建.md
Normal file
35
logseq-java/pages/JDK环境搭建.md
Normal file
@@ -0,0 +1,35 @@
|
||||
- 安装JDK
|
||||
- [下载地址](https://www.oracle.com/java/technologies/downloads/)[[JDK8]]
|
||||
- 检测java是否安装完成
|
||||
```
|
||||
java -version
|
||||
```
|
||||
- 编写HelloWorld #HelloWorld
|
||||
- ```java
|
||||
public class HelloWorld{
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Hello World");
|
||||
}
|
||||
}
|
||||
```
|
||||
- 编译运行
|
||||
```
|
||||
javac HelloWorld.java
|
||||
java HelloWorld
|
||||
```
|
||||
- 如果编译遇到问题
|
||||
- javac -encoding utf-8 HelloWorld.java
|
||||
- 配置环境变量
|
||||
- [[cd命令]]系统命令,任何目录都可运行
|
||||
- java提升为系统级命令后也可以在任何目录运行
|
||||
- 变量配置
|
||||
- [[JAVA_HOME]]:jiava安装目录
|
||||
- JAVA_HOME
|
||||
C:\\Program Files\\java\\jre...
|
||||
- [[Path]]:Java的命令执行目录
|
||||
- Path
|
||||
%JAVA_HOME%\\bin
|
||||
- [[ClassPath]]:配置class字节码文件所在位置
|
||||
- CLASSPATH
|
||||
.
|
||||
-
|
||||
10
logseq-java/pages/JDK自带调优工具.md
Normal file
10
logseq-java/pages/JDK自带调优工具.md
Normal file
@@ -0,0 +1,10 @@
|
||||
- jps
|
||||
- 显示虚拟机内部进程
|
||||
- jstat
|
||||
- 定位虚拟机性能问题
|
||||
- 检测进程问题,查看GC信息
|
||||
- jstack
|
||||
- 打印线程快照
|
||||
- 检测死锁
|
||||
- jmap
|
||||
- jconsole
|
||||
2
logseq-java/pages/JIT编译器.md
Normal file
2
logseq-java/pages/JIT编译器.md
Normal file
@@ -0,0 +1,2 @@
|
||||
- Just In Time
|
||||
- 以方法为单位加快代码解释的效率
|
||||
1
logseq-java/pages/JSON.md
Normal file
1
logseq-java/pages/JSON.md
Normal file
@@ -0,0 +1 @@
|
||||
- JavaScript Object Notation
|
||||
7
logseq-java/pages/JVM主要组成部分.md
Normal file
7
logseq-java/pages/JVM主要组成部分.md
Normal file
@@ -0,0 +1,7 @@
|
||||
- 类加载子系统
|
||||
- [[类加载机制]]
|
||||
- [[双亲委派机制]]
|
||||
- 运行时数据区
|
||||
- 执行引擎
|
||||
- 解释器
|
||||
- JIT编译器
|
||||
22
logseq-java/pages/JVM内存结构.md
Normal file
22
logseq-java/pages/JVM内存结构.md
Normal file
@@ -0,0 +1,22 @@
|
||||
- JVM虚拟机
|
||||
- 堆
|
||||
- (线程)栈,一份方法对应一个栈帧内存区域
|
||||
- 局部变量表
|
||||
- 本地变量
|
||||
- 操作数栈
|
||||
- 临时存储数据进行运算
|
||||
- 字节码引擎动态修改
|
||||
- 动态链接
|
||||
- 方法放在方法区,存放方法的出口地址
|
||||
- 方法出口
|
||||
- 方法结束后运行的地址
|
||||
- 本地方法栈
|
||||
- Thread.start(),用native修饰的方法
|
||||
- 本地方法需要的内存空间分配再本地方法栈中
|
||||
- 程序计数器
|
||||
- 存储当前执行字节码指令地址,native方法为undefined
|
||||
- 记录当前程序运行位置
|
||||
- (元空间)方法区
|
||||
- 解析类信息,常量和静态变量
|
||||
- 直接内存
|
||||
- 提高io效率
|
||||
15
logseq-java/pages/JVM内部各种垃圾收集算法.md
Normal file
15
logseq-java/pages/JVM内部各种垃圾收集算法.md
Normal file
@@ -0,0 +1,15 @@
|
||||
- 复制算法
|
||||
- 需要保留一半空间
|
||||
- 标记清除
|
||||
- 标记后清理掉垃圾对象
|
||||
- 存在内存碎片
|
||||
- 标记整理
|
||||
- 标记后将要存活的对象移动到内存的一端
|
||||
- serial
|
||||
- serial Old
|
||||
- parNew
|
||||
- Parallel
|
||||
- Parallel Old
|
||||
- G1
|
||||
- CMS
|
||||
- ZGC
|
||||
41
logseq-java/pages/JVM调优.md
Normal file
41
logseq-java/pages/JVM调优.md
Normal file
@@ -0,0 +1,41 @@
|
||||
- 为什么要性能调优
|
||||
- OOM
|
||||
- Full GC STW
|
||||
- 调优依据是什么
|
||||
- 运行日志
|
||||
- 异常堆栈
|
||||
- GC日志
|
||||
- 线程快照
|
||||
- 堆转储文件dump
|
||||
- 调优的方向
|
||||
- 系统硬件配置
|
||||
- 调优的步骤
|
||||
- 性能监控
|
||||
- GC频繁
|
||||
- CPU
|
||||
- OOM
|
||||
- 内存泄漏
|
||||
- 程序相应时间长
|
||||
- 性能分析
|
||||
- 打印GC日志
|
||||
- 通过工具查看
|
||||
- jps
|
||||
- jstat
|
||||
- OOM快照
|
||||
- asats
|
||||
- 性能调优
|
||||
- 加内存
|
||||
- 选垃圾回收期
|
||||
- 优化代码,控制内存使用
|
||||
- 加机器
|
||||
- 合理设置线程参数
|
||||
- 使用中间件
|
||||
- 如何对性能评估
|
||||
- 相应时间
|
||||
- 打开一个网站 几秒
|
||||
- 数据库查询一条记录(有索引)十几毫秒
|
||||
- 机械硬盘一次寻址定位 4ms
|
||||
- 从机械硬盘读取1M数据 2ms
|
||||
- 从ssd磁盘顺序读取1M数据 0.3ms
|
||||
- 从内存读取1M数据 十几微秒
|
||||
- Java程序本地方法调用 几微秒
|
||||
20
logseq-java/pages/JVM面试题.md
Normal file
20
logseq-java/pages/JVM面试题.md
Normal file
@@ -0,0 +1,20 @@
|
||||
- CPU飙高系统反应慢怎么排查?
|
||||
- 关于什么是JVM?看看普通人和高手的回答。
|
||||
- 有没有排查过线上oom的问题,如何排查的
|
||||
- 说一下你对双亲委派的理解
|
||||
- CPU飙高系统反应慢怎么排查?
|
||||
- 什么是双亲委派?
|
||||
- JVM 如何判断一个对象可以被回收
|
||||
- G垃圾收集的特点,为什么低延迟
|
||||
- JVM分代年龄为什么是?可以吗?
|
||||
- 一个空Object对象的占多大空间?
|
||||
- 什么是Java虚拟机,为什么要使用?
|
||||
- JVM 为什么使用元空间替换了永久代?
|
||||
- Java 常见的垃圾收集器有哪些?
|
||||
- 如何破坏双亲委派模型
|
||||
- JVM 中一次完整的GC流程是怎样的,对象如何晋升到老年代
|
||||
- 如果发生内存泄漏怎么排查
|
||||
- JVM中的三色标记法是什么?
|
||||
- 说一些CMS垃圾回器的工作原理
|
||||
- 什么是内存溢出,什么是内存泄漏?
|
||||
- 什么是双亲委派机制?
|
||||
20
logseq-java/pages/JWT.md
Normal file
20
logseq-java/pages/JWT.md
Normal file
@@ -0,0 +1,20 @@
|
||||
- [[Cookie]]+ [[Session]]
|
||||
- 保存用户登录状态
|
||||
- 缺陷
|
||||
- Cookie不安全,信息以明文存储
|
||||
- Session占用服务器资源,横向集群拓展麻烦
|
||||
- Cookie为浏览器的技术,存储空间有限,很多前端不再依赖浏览器
|
||||
- JSON Web Token
|
||||
- 
|
||||
- Header
|
||||
- 声明令牌由JWT技术产生,加密技术HS256
|
||||
- Payload
|
||||
- 后端需要传输的数据
|
||||
- Signature
|
||||
- 说明由谁颁发
|
||||
- 无法破解
|
||||
- 执行原理
|
||||
- 登录 --> Web服务器产生令牌 --> 存Redis,有效期30min
|
||||
- 前端存储在localStorage里还是Cookie或其他数据库与后端无关,前端发请求时需要带上Token
|
||||
- [[axios]]全局拦截器
|
||||
- [[SpringBoot]]配置拦截器
|
||||
41
logseq-java/pages/Java 基础面试题.md
Normal file
41
logseq-java/pages/Java 基础面试题.md
Normal file
@@ -0,0 +1,41 @@
|
||||
- fail-safe 机制与fail-fast 机制分别有什么作用
|
||||
- HashMap 是怎么解决哈希冲突的?
|
||||
- 面试官:你能说一下什么是受检异常和非受检异常吗?
|
||||
- 为什么阿里巴巴的Java开发手册不建议使用Java自带的线程池
|
||||
- fail-safe 机制与fail-fast机制分别有什么作用
|
||||
- HashMap是怎么解决哈希冲突的?
|
||||
- JDK动态代理为什么只能代理有接口的类?
|
||||
- 请说一下对象的创建过程(阿里)
|
||||
- new String("abc")到底创建了几个对象?
|
||||
- 请简单说一下你对受检异常和非受检异常的理解
|
||||
- HashMap 是如何解决 hash 冲突的?
|
||||
- String、StringBuffer、StringBuilder 区别
|
||||
- Integer使用不当导致生产的事故
|
||||
- 可以讲一下ArrayList的自动扩容机制吗?
|
||||
- 什么是深拷贝和浅拷贝?
|
||||
- HashMap中的hash方法为什么要右移异或?
|
||||
- HashMap 啥时候扩容,为什么扩容?
|
||||
- 强引用、软引用、弱引用、虚引用有什么区别?
|
||||
- Java有几种文件拷贝方式,哪一种效率最高?
|
||||
- 聊聊你知道的设计模式
|
||||
- finally块一定会执行吗?
|
||||
- 在Java 中实现单例模式有哪些方法
|
||||
- Java SPI是什么?有什么用?
|
||||
- Integer和int的区别?Java为什么要设计封装类?
|
||||
- Integer aInteger a a=a的运行结果?
|
||||
- HashMap 与HashTable 区别
|
||||
- Java反射的优缺点?
|
||||
- 为什么重写 equals()就一定要重写 hashCode()方法?
|
||||
- 介绍下策略模式和观察者模式?
|
||||
- 谈谈什么是零拷贝?
|
||||
- SortedSet和List异同点?
|
||||
- 为什么阿里Java手册禁止使用存储过程?
|
||||
- 为什么阿里巴巴强制要求使用包装类型定义属性?
|
||||
- 刚折腾完Log,又爆Spring RCE核弹级漏洞
|
||||
- 钟轻松理解单线程下的HashMap工作原理
|
||||
- 两个Integer对象比较大小,为什么于等于
|
||||
- 为什么 HashMap会产生死循环?
|
||||
- 哪些情况下的单例对象可能会破坏?
|
||||
- 责任链模式的实现原理
|
||||
- new String("hello")之后,到底创建了几个对象?
|
||||
- 什么是Java SPI,它有什么作用?
|
||||
8
logseq-java/pages/JavaBean规范.md
Normal file
8
logseq-java/pages/JavaBean规范.md
Normal file
@@ -0,0 +1,8 @@
|
||||
- 实体:
|
||||
- 实体的个体,也就是 [[对象]]
|
||||
- [[业务对象]]
|
||||
- [[实体对象]]也称为[[JavaBean]]
|
||||
- 规范
|
||||
- 类必须 [[public]]
|
||||
- 所有属性私有,提供对应 [[getter]] 和 [[setter]]
|
||||
- 提供 [[有参构造器]] 必须先提供 [[无参构造器]]
|
||||
70
logseq-java/pages/Java中21种锁.md
Normal file
70
logseq-java/pages/Java中21种锁.md
Normal file
@@ -0,0 +1,70 @@
|
||||
- 乐观锁
|
||||
- 读多写少,写入时进行CAS操作
|
||||
- 悲观锁
|
||||
- 写多读少,每一次读写都上锁
|
||||
- Synchronized ReentrantLock
|
||||
- 自旋锁
|
||||
- 自旋空操作,避免线程切换开销
|
||||
- 等待时间过程会浪费性能
|
||||
- 可重入锁
|
||||
- 可以多次获取同一个锁
|
||||
- ReentrantLock,Synchronized
|
||||
- 申请几把锁需要释放几把锁
|
||||
- 读写锁
|
||||
- 读锁
|
||||
- 允许多个线程同时访问一个资源
|
||||
- 写锁
|
||||
- 只允许一个线程获取锁
|
||||
- 公平锁
|
||||
- 多个线程按照申请锁的顺序获取锁
|
||||
- 非公平锁
|
||||
- 多个线程获取锁的顺序不是一致的
|
||||
- 线程状态修改需要时间
|
||||
- 导致线程饥饿
|
||||
- synchronized,lock通过构造方法修改
|
||||
- 共享锁
|
||||
- 和读锁,乐观锁类似
|
||||
- 独占锁
|
||||
- 和写锁,悲观锁类似
|
||||
- 重量级锁
|
||||
- 依赖操作系统的锁
|
||||
- synchronized通过监视器monitor实现,需要用户态和内核态切换
|
||||
- 轻量级锁
|
||||
- 没有竞争时,通过CAS操作实现
|
||||
- 有竞争变为重量级锁
|
||||
- 偏向锁
|
||||
- 偏向第一个获取的线程,如果没有竞争,就不需要进行CAS操作可以直接获取锁
|
||||
- 如果存在锁及大部分都是竞争的情况下是多余的
|
||||
- 分段锁
|
||||
- jdk1.7,ConcurrentHashMap有16个segment
|
||||
- 互斥锁
|
||||
- 和写锁、悲观锁、独占锁类似
|
||||
- 同步锁
|
||||
- 互斥锁、写锁、悲观锁
|
||||
- 并发执行的多个线程,同一时间只有一个线程可以访问
|
||||
- 死锁
|
||||
- 线程持有对方线程需要的自由,又都不释放自己的锁
|
||||
- 锁粗化
|
||||
- 扩大加锁的范围,减少加锁的频率减少损耗
|
||||
- 锁消除
|
||||
- 如果共享资源没有竞争就消除锁
|
||||
- 内存逃逸分析
|
||||
- synchronized
|
||||
- 实例方法,方法,代码块
|
||||
- lock
|
||||
- 接口,可重入锁,悲观锁,独占锁,互斥锁,同步锁
|
||||
- 需要手动释放
|
||||
- 发生异常没有主动释放锁很可能会死锁
|
||||
- 可以让等待锁的线程响应中断
|
||||
- 可以知道是否成功获取锁
|
||||
- 实现读写锁提高效率
|
||||
- ReentrantLock和Synchronized
|
||||
- 都解决共享变量安全访问的问题
|
||||
- 可重入锁
|
||||
- 可见性,原子性
|
||||
- 手动调用lock和unlock
|
||||
- 响应中断
|
||||
- API,JVM
|
||||
- 公平,非公平
|
||||
- ReentrantLock通过Condition绑定多个条件
|
||||
-
|
||||
9
logseq-java/pages/Java创建线程的方式有哪些.md
Normal file
9
logseq-java/pages/Java创建线程的方式有哪些.md
Normal file
@@ -0,0 +1,9 @@
|
||||
- 继承Thread类
|
||||
- 不支持多继承
|
||||
- 不能通过线程池操作
|
||||
- 实现Runnable接口
|
||||
- 不方便传参
|
||||
- 无法获取返回值
|
||||
- 实现Callable接口
|
||||
- 可通过Future获取返回值
|
||||
- 通过Executors创建线程池对象
|
||||
49
logseq-java/pages/Java发展历程.md
Normal file
49
logseq-java/pages/Java发展历程.md
Normal file
@@ -0,0 +1,49 @@
|
||||
- Java起源
|
||||
- Java是一种高级编程语言
|
||||
- 1991,起源SUN Green小组开发Star 7项目[整合了C++ Lisp SmallTalk](智能家居)
|
||||
- 1992,开发后没市场
|
||||
- 1993,团队面临解散,决定Java去走互联网
|
||||
- 早期叫Oak(橡树),据说Java之父手(詹姆斯·高斯林)上爪哇的咖啡
|
||||
- Java的发展史
|
||||
- 95/5/23,java正式诞生
|
||||
- 96/1/23,JDK1.0
|
||||
- 97/2/18,JDK1.1,此时算是最初级的版本
|
||||
- 98/12/8,JDK1.2,milestone version
|
||||
- 更名为Java2.0
|
||||
- 确定Java未来的走向
|
||||
- 1. **J2SE**(标准),开发桌面应用,Eclipse,IDEA
|
||||
2. **J2ME**(微型),手机嵌入式程序,Nokia
|
||||
3. **J2EE**(企业),开发企业级,互联网应用
|
||||
- 04/10,JDK1.5 another milestone
|
||||
- 1. Java更名Java5.0
|
||||
2. 提供了注解,枚举,多线程等一系列的新功能或优化功能
|
||||
- J2SE-->[[Java SE]]
|
||||
J2ME-->[[Java ME]]
|
||||
J2EE-->[[Java EE]]
|
||||
- 2010/4/20,SUN被Orcale收购
|
||||
- 目前最新Java18,JDK18
|
||||
- Java技术组成
|
||||
- 1. Java编程语言
|
||||
- 特点
|
||||
- 1. 简单性:
|
||||
- 抛弃[[C语言]]头文件,结构体,联合体,[[指针]]等一系列非常复杂的内容
|
||||
- 前辈多,现任广
|
||||
- 2. 结构中立:
|
||||
- Java语言在项目开发中,可以和其他任何语言共存
|
||||
- 3. [[面向对象]]
|
||||
- 4. 支持[[分布式]]
|
||||
- 5. 跨平台:
|
||||
- 一次编写,处处运行
|
||||
- 6. 高性能
|
||||
- 7. [[多线程]]
|
||||
- 8. [[健壮性]],安全性
|
||||
- 2.Java平台
|
||||
- [[JDK]]
|
||||
- Java Development Kit(Java开发工具包)
|
||||
- JRE+[[API]]工具
|
||||
- [[JRE]]
|
||||
- Java Runtime Environment(Java运行环境)
|
||||
- JVM+[[核心库]]类
|
||||
- [[JVM]]
|
||||
- Java Virtual Machine(Java虚拟机)
|
||||
- Java虚拟机出现目的:跨平台
|
||||
59
logseq-java/pages/Java并发编程基础面试题.md
Normal file
59
logseq-java/pages/Java并发编程基础面试题.md
Normal file
@@ -0,0 +1,59 @@
|
||||
- [[谈谈你对AQS的理解]]
|
||||
- [[lock和synchronized区别]]
|
||||
- [[线程池如何知道一个线程的任务已经执行完成]]
|
||||
- [[什么叫做阻塞队列的有界和无界]]
|
||||
- [[ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?]]
|
||||
- [[能谈一下CAS机制吗?]]
|
||||
- [[死锁的发生原因和怎么避免]]
|
||||
- [[讲一下wait和notify这个为什么要在synchronized代码块中?]]
|
||||
- 你是怎么理解线程安全问题的?
|
||||
- 什么是守护线程,它有什么特点
|
||||
- 谈谈你对AQS的理解
|
||||
- AbstractQueuedSynchronized 为什么采用双向链表
|
||||
- lock和synchronized 区别
|
||||
- 线程池如何知道一个线程的任务已经执行完成
|
||||
- 什么叫做阻塞队列的有界和无界
|
||||
- ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?
|
||||
- 能谈一下CAS机制吗?
|
||||
- 死锁的发生原因和怎么避免
|
||||
- volatile 关键字有什么用?它的实现原理是什么?
|
||||
- 讲一下wait和notify这个为什么要在synchronized代码块中?
|
||||
- ThreadLocal是什么?它的实现原理呢?
|
||||
- 基于数组的阻塞队列 ArrayBlockingQueue 原理
|
||||
- 怎么理解线程安全?
|
||||
- 请简述一下伪共享的概念以及如何避免
|
||||
- 什么是可重入,什么是可重入锁?它用来解决什么问题?
|
||||
- 请说一下ReentrantLock的实现原理?
|
||||
- 简述一下你对线程池的理解?
|
||||
- 如何中断一个正在运行的线程?
|
||||
- 为什么引入偏向锁、轻量级锁,介绍下升级流程
|
||||
- 什么是守护线程,它有什么特点
|
||||
- 请谈谈AQS是怎么回事儿?
|
||||
- ReentrantLock 是如何实现锁公平和非公平性的?
|
||||
- 说一下你对 CompletableFuture的理解
|
||||
- 线程状态,BLOCKED和WAITING有什么区别
|
||||
- Thread和Runnable的区别
|
||||
- Thread和Runnable的区别
|
||||
- AQS为什么要使用双向链表?
|
||||
- ConcurrentHashMap的size()方法是线程安全的吗?为什么
|
||||
- wait和sleep是否会触发锁的释放以及CPU资源的释放?
|
||||
- DCL单例模式设计为什么需要 volatile 修饰实例对象
|
||||
- 讲下线程池的线程回收
|
||||
- 如果一个线程两次调用start(),会出现什么问题?
|
||||
- Java 官方提供了哪几种线程池,分别有什么特点?
|
||||
- 请你说一下你对Happens-Before的理解。
|
||||
- 线程池是如何实现线程复用的?
|
||||
- 可以说下阻塞队列被异步消费怎么保持顺序吗?
|
||||
- 当任务数超过线程池的核心线程数时,如何让它不进入队列,而是直接启用最大线程数
|
||||
- SimpleDateFormat 是线程安全的吗?为什么?
|
||||
- 并行和并发有什么区别?
|
||||
- 如何解决死锁问题?
|
||||
- 为什么 ConcurrentHashMap中key不允许为null
|
||||
- ThreadLocal会出现内存泄漏吗?
|
||||
- 什么是CompletableFuture?
|
||||
- 什么条件下会产出死锁,如何避免死锁?
|
||||
- ConcurrentHashMap是如何保证线程安全的?
|
||||
- ThreadLocal真的会造成内存泄漏吗?
|
||||
- 为什么 ConcurrentHashMap 不允许插入null值?
|
||||
- synchronized和Lock的区别
|
||||
- 如何安全地中断一个正在运行的线程?
|
||||
38
logseq-java/pages/Java程序注释.md
Normal file
38
logseq-java/pages/Java程序注释.md
Normal file
@@ -0,0 +1,38 @@
|
||||
- 解释某段代码的含义,或废弃某段代码
|
||||
- 单行注释
|
||||
- ```java
|
||||
public class dnahangzhushi {
|
||||
public static void mian(String[] args) {
|
||||
//这是一段输出语句
|
||||
System.out.println("Hello World");
|
||||
}
|
||||
}
|
||||
```
|
||||
- 多行注释
|
||||
- ```java
|
||||
public class duohangzhushi {
|
||||
/*
|
||||
*这是一个程序的入口
|
||||
*程序会从这里执行
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Hello World")
|
||||
}
|
||||
}
|
||||
```
|
||||
- 文档注释
|
||||
- 使用于类名的上方,描述类的使用
|
||||
- 使用于方法的上方,描述方法的使用
|
||||
- ```java
|
||||
/**
|
||||
*@auther:YH
|
||||
*@date:2022/03/38
|
||||
*/
|
||||
publc class Hello {
|
||||
|
||||
}
|
||||
```
|
||||
- 可在代码上加上注释用于执行时跳过代码
|
||||
- 单行注释快捷键Ctrl+/ #IDEA
|
||||
- 多行注释快捷键Ctrl+Shift+/ #IDEA
|
||||
-
|
||||
12
logseq-java/pages/Java跨平台原理.md
Normal file
12
logseq-java/pages/Java跨平台原理.md
Normal file
@@ -0,0 +1,12 @@
|
||||
- > Java程序不是运行在系统上,而是运行在了虚拟机上,Java开发团队针对每一种不同的系统开发了不同的虚拟机
|
||||
- ## Java的跨平台 #JVM
|
||||
- 一次编写,处处运行
|
||||
- 一般在Windows上开发代码,而在Linux/Unix操作系统上运行
|
||||
- 如何做到
|
||||
- 通过JVM做到
|
||||
- JVM特点
|
||||
- 不同操作系统对应不同JVM
|
||||
- ## JVM内部执行
|
||||
- [[JIT编译器]]
|
||||
-
|
||||
-
|
||||
6
logseq-java/pages/Java面试.md
Normal file
6
logseq-java/pages/Java面试.md
Normal file
@@ -0,0 +1,6 @@
|
||||
- ((6243be14-7a99-4175-8975-50f29880f478))
|
||||
- ((62451ad0-4023-43ff-82ad-a114bfb9ac7f))
|
||||
- ((6246b51d-044b-40fb-aa3c-e057f95915b8))
|
||||
- ((6246b566-602f-4535-89ad-a88b652bca32))
|
||||
- ((624d06d6-3d96-4b9b-a60c-cb3e3b285ad0))
|
||||
- [[互联网企业面试题]]
|
||||
18
logseq-java/pages/Kibana.md
Normal file
18
logseq-java/pages/Kibana.md
Normal file
@@ -0,0 +1,18 @@
|
||||
- [[ElasticSearch]]的可视化管理工具
|
||||
- [[Docker]]安装
|
||||
- ```yml
|
||||
# PATH /usr/local/config/kibana.yml
|
||||
#
|
||||
# ** THIS IS AN AUTO-GENERATED FILE **
|
||||
#
|
||||
# Default Kibana configuration for docker target
|
||||
server.name: kibana
|
||||
xpack.monitoring.ui.container.elasticsearch.enabled: true
|
||||
server.port: 5601
|
||||
server.host: 0.0.0.0
|
||||
elasticsearch.hosts: ["http://es:9200"]
|
||||
i18n.locale: "zh-CN"
|
||||
```
|
||||
- ```bash
|
||||
docker run --name kibana --privileged=true -v /usr/local/config/kibana.yml:/usr/share/kibana/config/kibana.yml --link es:es -p 5601:5601 -d kibana:7.2.1
|
||||
```
|
||||
1
logseq-java/pages/LinkedHashMap.md
Normal file
1
logseq-java/pages/LinkedHashMap.md
Normal file
@@ -0,0 +1 @@
|
||||
- 底层原理和 [[HashMap]]一致,LinkedHashMap为双向的
|
||||
10
logseq-java/pages/LinkedList.md
Normal file
10
logseq-java/pages/LinkedList.md
Normal file
@@ -0,0 +1,10 @@
|
||||
- 底层为[[链表]]结构
|
||||
- 每一个元素由三部分[[Node]]构成
|
||||
- prev
|
||||
- Element
|
||||
- next
|
||||
- [[API]]方法与ArrayList一致
|
||||
- 与[[ArrayList]]的区别
|
||||
- 底层结构不一样
|
||||
- ArrayList比较适合用于查询,新增删除节点效率较低
|
||||
- LinkedList比较适用于新增,删除,查询效率较低
|
||||
9
logseq-java/pages/Linux.md
Normal file
9
logseq-java/pages/Linux.md
Normal file
@@ -0,0 +1,9 @@
|
||||
- 目录文件操作
|
||||
- ls
|
||||
- ls -l
|
||||
- ll
|
||||
- ls -
|
||||
- 操作防火墙
|
||||
- [[firewall]]
|
||||
- 解压操作
|
||||
- [[tar&gz&zip]]
|
||||
4
logseq-java/pages/List.md
Normal file
4
logseq-java/pages/List.md
Normal file
@@ -0,0 +1,4 @@
|
||||
- 特点
|
||||
- 元素存储时是有序的
|
||||
- 元素可以重复
|
||||
- 每个元素在使用时,都是有下标的
|
||||
4
logseq-java/pages/LocalDate.md
Normal file
4
logseq-java/pages/LocalDate.md
Normal file
@@ -0,0 +1,4 @@
|
||||
- 年月日
|
||||
- 该类默认支持国际化
|
||||
- 在不同的国际,不同的区域,呈现不同格式的日期
|
||||
- 默认:yyyy-MM-dd
|
||||
1
logseq-java/pages/LocalDateTime.md
Normal file
1
logseq-java/pages/LocalDateTime.md
Normal file
@@ -0,0 +1 @@
|
||||
- yyyy-MM-dd-HH-mm-ss
|
||||
3
logseq-java/pages/LocalTime.md
Normal file
3
logseq-java/pages/LocalTime.md
Normal file
@@ -0,0 +1,3 @@
|
||||
-
|
||||
- 时间格式化
|
||||
- HH代表24小时制
|
||||
1
logseq-java/pages/Lua脚本能在Redis集群里面执行吗.md
Normal file
1
logseq-java/pages/Lua脚本能在Redis集群里面执行吗.md
Normal file
@@ -0,0 +1 @@
|
||||
- 需要给所有key加一个hash tag {XXX},才能保证所有key落在同一slot
|
||||
24
logseq-java/pages/MVCC.md
Normal file
24
logseq-java/pages/MVCC.md
Normal file
@@ -0,0 +1,24 @@
|
||||
- 多版本并发控制
|
||||
- 为了解决脏读,不可重复读的情况
|
||||
- 基于Undo版本链接和ReadView来实现的,每个事务都有自己的版本号,
|
||||
- MVCC无法解决幻读,需要配合锁来实现
|
||||
- 当前读
|
||||
- select for update
|
||||
- select lock in share mode
|
||||
- insert update delete
|
||||
- 快照读
|
||||
- 维护了同一个行的多个版本,查询时会返回对应的事务的修改版本
|
||||
- 原理
|
||||
- 隐藏字段
|
||||
- 行记录,trx_id,roll_point
|
||||
- undo版本链,由当前最新记录+该记录之间的undo日志
|
||||
- readview
|
||||
- 决定返回哪个版本的数据,版本链返回规则/可见性算法
|
||||
- 当前活跃事务id
|
||||
- 最大事务id +1
|
||||
- 最小事务id
|
||||
- readview创建者事务id
|
||||
- RC和RR下
|
||||
- RC,每一次快照读都会生产readview
|
||||
- RR,只有第一次快照读生成readview后面复用
|
||||
- MVCC解决了读写阻塞,再RR下快照读方面避免了出现幻读的问题
|
||||
5
logseq-java/pages/Map.md
Normal file
5
logseq-java/pages/Map.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- 映射
|
||||
- 基于 [[Key-Value]] (键值对)的结构
|
||||
- 特点
|
||||
- Key不能重复
|
||||
- Value可以重复
|
||||
8
logseq-java/pages/Math.md
Normal file
8
logseq-java/pages/Math.md
Normal file
@@ -0,0 +1,8 @@
|
||||
- 数学类,提供了一些基本数字运算的方法
|
||||
- [[random]]
|
||||
- ((6257ca69-79e2-4267-b04c-8d607cad5a79))
|
||||
- [[abs]]
|
||||
- [[pow]]
|
||||
- [[max]]
|
||||
- [[min]]
|
||||
- [[round]]
|
||||
55
logseq-java/pages/MySQL.md
Normal file
55
logseq-java/pages/MySQL.md
Normal file
@@ -0,0 +1,55 @@
|
||||
- 目录结构
|
||||
- bin
|
||||
- data
|
||||
- include
|
||||
- lib
|
||||
- my.ini
|
||||
- DONE 看面试题
|
||||
:LOGBOOK:
|
||||
CLOCK: [2023-10-10 Tue 11:46:55]
|
||||
CLOCK: [2023-10-10 Tue 11:46:59]--[2023-10-10 Tue 21:24:01] => 09:37:02
|
||||
:END:
|
||||
- https://www.bilibili.com/video/BV1N24y1y7a1
|
||||
- [[如何实现的索引机制]]
|
||||
- [[表中没有索引,会创建B+树吗]]
|
||||
- [[B+树]]
|
||||
- [[为什么官方推荐自增主键]]
|
||||
- [[使用int作为自增主键,最大id为10,删除10和9,添加一条记录,不重启和重启后添加记录id为多少]]
|
||||
- [[索引优缺点]]
|
||||
- [[回表操作]]
|
||||
- [[索引类型]]
|
||||
- [[创建索引的情况]]
|
||||
- [[索引下推]]
|
||||
- [[索引失效]]
|
||||
- [[多个索引是否可以指定]]
|
||||
- ((65253f94-6e42-488a-9f9f-510ee1d340d7))
|
||||
- [[Order By是否走索引]]
|
||||
- [[MySQL查询缓存]]
|
||||
- [[MySQL组成]]
|
||||
- [[MySQL执行SQL步骤]]
|
||||
- [[存储引擎]]
|
||||
- [[MySQL事务]]
|
||||
- [[MySQL锁]]
|
||||
- [[XA协议]]
|
||||
- [[select for update会产生哪些操作]]
|
||||
- [[死锁的产生原因和处理方法]]
|
||||
- [[MySQL日志]]
|
||||
- MySQL开发
|
||||
- [[可以用MySQL存储文件吗]]
|
||||
- [[存储的时候有遇到过什么问题吗]]
|
||||
- [[财务计算有没有出现过错乱]]
|
||||
- [[预编译SQL]]
|
||||
- [[子查询和join哪个效率高]]
|
||||
- [[SQL调优]]
|
||||
- [[MySQL数据库cpu飙升]]
|
||||
- [[分库分表]]
|
||||
- [[视图]]
|
||||
- [[存储过程]]
|
||||
- [[外键]]
|
||||
- [[processlist]]
|
||||
- [[千万数据查询优化]]
|
||||
- [[count(列名)和count(*)区别]]
|
||||
- [[如果有超大分页怎么处理]]
|
||||
- [[mysql服务器毫无规律异常重启]]
|
||||
- [[mysql线上修改表结构有哪些风险]]
|
||||
- [[什么是mysql多实例部署]]
|
||||
19
logseq-java/pages/MySQL中锁机制.md
Normal file
19
logseq-java/pages/MySQL中锁机制.md
Normal file
@@ -0,0 +1,19 @@
|
||||
- 行锁
|
||||
- 与表锁不能同时存在
|
||||
- 表锁
|
||||
- 锁定一张表
|
||||
- 读写锁
|
||||
- 读锁和读锁不互斥,其它情况互斥
|
||||
- 意向共享锁,意向互斥锁
|
||||
- 是为了解决如果要添加表锁需要检查是否有行锁的情况,可以根据意向锁判断是否存在行锁
|
||||
- 意向锁和意向锁之间不会互斥
|
||||
- 意向共享锁和表级别的读锁之间不互斥,其它会互斥
|
||||
- 意向锁不会与任何行锁互斥
|
||||
- 间隙锁
|
||||
- 锁定的是两个索引之间的间隙,防止新的记录插入到该间隙中,主要是为了解决幻读的问题
|
||||
- 一个事务读取某个范围的记录,另一个事务再这个范围内插入了新的记录
|
||||
- 缺点
|
||||
- 有一定死锁风险,性能影响,添加复杂性,锁定范围可能过大
|
||||
- 临键锁
|
||||
- 特殊的间隙锁,只与非唯一索引有关
|
||||
- 非唯一索引列上都会存在一个临键锁,所著一段左开右闭的区间
|
||||
54
logseq-java/pages/MySQL事务.md
Normal file
54
logseq-java/pages/MySQL事务.md
Normal file
@@ -0,0 +1,54 @@
|
||||
- 数据库操作的最小单元
|
||||
- 作为一个整体一起向系统提交
|
||||
- 事务是一组不可拆分的操作集合
|
||||
- ACID
|
||||
- 原子性
|
||||
- 要么都执行,要么都不执行
|
||||
- 一致性
|
||||
- 事务执行前后是从一个一致性状态到另一个一致性状态
|
||||
- 隔离性
|
||||
- 事务之间互不干扰
|
||||
- 持久性
|
||||
- 事务一旦完成修改永久保存
|
||||
- 并发事务的问题
|
||||
- 脏读
|
||||
- 读取到了另一个事务未提交的数据
|
||||
- 丢失修改
|
||||
- 一个事务修改了这个数据,但是另一个事务也修改了这个数据,这个时候第一个事务的修改结果就丢失了
|
||||
- 不可重复读
|
||||
- 一个事务多次读取同一个数据,读取到的结果不一样
|
||||
- 幻读
|
||||
- 一个事务多次查询返回的结果总数不一样
|
||||
- 避免事务的并发问题
|
||||
- 配置事务隔离级别
|
||||
- 读未提交
|
||||
- 读已提交
|
||||
- **可重复读**
|
||||
- 串行化
|
||||
- 默认情况下使用默认的隔离级别,一致性要求高就使用较高的事务隔离级别
|
||||
- 靠缓存可以提升事务隔离级别的性能
|
||||
- 有缓存只能提供高效读,不能保证数据即时一致性,还需要额外开销管理缓存
|
||||
- 隔离实现方案
|
||||
- 读写锁
|
||||
- 锁定读,共享读锁之间不会排斥,写锁会排斥其他锁
|
||||
- 锁竞争时,要等待其中一个操作释放锁另一个才能获取锁
|
||||
- 行锁
|
||||
- 间隙锁
|
||||
- select lock in share mode
|
||||
- select lock for update
|
||||
- insert、update、delete
|
||||
- MVCC
|
||||
- 一致性非锁定读
|
||||
- 隐藏字段
|
||||
- DB_TRX_ID,标记最近一次对本行记录做修改的事务id
|
||||
- DB_ROLL_PTR,回滚指针,指向改行的undolog
|
||||
- DB_ROW_ID,没有主键和唯一列时会使用该id生成聚簇索引
|
||||
- Read View
|
||||
- 记录和隔离不同事物并发时此纪录哪些版本对当前事务可见
|
||||
- Undolog
|
||||
- 回滚数据,读取可见版本的数据
|
||||
- 一致性、原子性如何实现
|
||||
- 通过MVCC实现
|
||||
- 灾备通过redolog实现,redolog会记录下来所有修改,崩溃后可以通过redolog恢复修改
|
||||
- 持久性如何实现
|
||||
- redolog实现,事务提交的时候先将所有日志写入日志文件进行持久化,即WAL(write ahead log)机制
|
||||
5
logseq-java/pages/MySQL执行SQL步骤.md
Normal file
5
logseq-java/pages/MySQL执行SQL步骤.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- DOING 详细理解记忆
|
||||
:LOGBOOK:
|
||||
CLOCK: [2023-10-10 Tue 16:49:50]
|
||||
CLOCK: [2023-10-10 Tue 16:49:59]
|
||||
:END:
|
||||
15
logseq-java/pages/MySQL数据库cpu飙升.md
Normal file
15
logseq-java/pages/MySQL数据库cpu飙升.md
Normal file
@@ -0,0 +1,15 @@
|
||||
- 先定位
|
||||
- 使用top命令查看mysqld的利用率
|
||||
- 使用show full processlist,查看会话
|
||||
- 观察是哪些sql消耗了资源,其中终点观察state指标
|
||||
- 定位到具体sql
|
||||
-
|
||||
- 使用pidstate
|
||||
- 定位到线程
|
||||
- 在preformance_schema.thread中记录了thread_os_id找到线程执行的sql
|
||||
- 根据操作系统id可以到processlist表找到对应的会话
|
||||
-
|
||||
- 使用show profile观察sql各个阶段耗时
|
||||
- 服务器上是否运行了其他程序
|
||||
- 检查一下是否有慢查询
|
||||
- pref top
|
||||
50
logseq-java/pages/MySQL日志.md
Normal file
50
logseq-java/pages/MySQL日志.md
Normal file
@@ -0,0 +1,50 @@
|
||||
- 错误日志error log
|
||||
- 慢查询日志slow query log
|
||||
- 默认10s
|
||||
- 手动开启
|
||||
- 支持将日志写入文件
|
||||
- 一般查询日志generallog
|
||||
- 重写日志redolog
|
||||
- 基于磁盘的数据结构,用来宕机时恢复不完整的数据
|
||||
- 用于恢复更新了内存但是还没有刷入硬盘的数据
|
||||
- 回滚日志undolog
|
||||
- 回滚到某一版本,是一种逻辑数据
|
||||
- 记录修改之前的数据,delete对应一条insert数据
|
||||
- 提供mvcc下的读取
|
||||
- 二进制日志binlog
|
||||
- 记录增删改时的sql(当前时间,系统相关)记录的日志,修改了内容就会产生一条bin log
|
||||
- 进行主从复制,数据库的恢复
|
||||
- 是否实时写入磁盘
|
||||
- binlog
|
||||
- sync_binlog
|
||||
- 0,写入页缓存,操作系统决定刷盘,有丢失日志风险
|
||||
- 1,每次提交事务都写入磁盘
|
||||
- N,N个事务后写入磁盘
|
||||
- redolog
|
||||
- undolog
|
||||
- **innodb_flush_log_at_trx_commit**
|
||||
- 0:每秒写入磁盘
|
||||
- 1:每次提交调用fsync刷新IO缓存
|
||||
- 2:每次都把redolog写入page cache,由系统接管什么时候写入磁盘
|
||||
- 时机顺序
|
||||
- DOING 补充笔记
|
||||
:LOGBOOK:
|
||||
CLOCK: [2023-10-10 Tue 17:58:30]
|
||||
CLOCK: [2023-10-10 Tue 17:58:34]
|
||||
CLOCK: [2023-10-10 Tue 17:58:34]
|
||||
:END:
|
||||
- redolog和binlog的两阶段提交
|
||||
- binlog有几种录入格式
|
||||
- statement
|
||||
- 不记录数据变更,只记录sql语句和每一行数据变化
|
||||
- row
|
||||
- 不记录sql语句上下文信息,记录数据被修改,修改成什么样
|
||||
- mixed
|
||||
- 有函数用row,没函数用statement,无法识别系统变量
|
||||
- 集群同步为什么使用binglog
|
||||
- binglog是mysql提供的日志,所有存储引擎都可以使用
|
||||
- 支持增量同步
|
||||
- 可以供其他中间件读取,hdfs
|
||||
- 复制表数据
|
||||
- 不支持某个阶段回放
|
||||
- 复制过程中断很难确定复制的offset
|
||||
14
logseq-java/pages/MySQL查询缓存.md
Normal file
14
logseq-java/pages/MySQL查询缓存.md
Normal file
@@ -0,0 +1,14 @@
|
||||
- MySQL支持缓存查询吗
|
||||
- 5.7支持内部缓存,8.0之后就废弃了
|
||||
- 通过哈希值计算,命中缓冲区就会返回缓冲区结果
|
||||
- 为何废弃
|
||||
- 缓存限制
|
||||
- mysql没有灵活管理缓存失效和生效,尤其对于频繁更新的表
|
||||
- SQL必须完全一致才会命中
|
||||
- 为了节省内存,太大的result不会缓存
|
||||
- 在分库分表情况下不起作用
|
||||
- 执行SQL里有触发器,自定义函数时缓存不起作用
|
||||
- 表结构或数据改变时,基于该表的缓存立即失效
|
||||
- 替代方案
|
||||
- redis
|
||||
- ehcached
|
||||
8
logseq-java/pages/MySQL索引失效.md
Normal file
8
logseq-java/pages/MySQL索引失效.md
Normal file
@@ -0,0 +1,8 @@
|
||||
- 含有计算以及函数的情况
|
||||
- like以%和_开头匹配的情况
|
||||
- 不等于
|
||||
- is null和is not null
|
||||
- 如果有字段为null,尽量使用is null判断,如果null比较高,优化器也会使用索引进行范围查询
|
||||
- 存在类型转换
|
||||
- 复合索引不满足最左前缀
|
||||
- mysql认为全表扫描快
|
||||
20
logseq-java/pages/MySQL组成.md
Normal file
20
logseq-java/pages/MySQL组成.md
Normal file
@@ -0,0 +1,20 @@
|
||||
- 客户端
|
||||
- JDBC,SQLyog
|
||||
- 服务器
|
||||
- 连接层
|
||||
- 处理连接,TCP连接,分配线程
|
||||
- 服务层
|
||||
- SQL接口
|
||||
- Parser解析器
|
||||
- 语法分析
|
||||
- Optimizer查询优化器
|
||||
- Caches&Buffers查询缓存组件
|
||||
- 引擎层
|
||||
- InnoDB
|
||||
- MyISAM
|
||||
- 存储层
|
||||
- 所有数据、数据库、表的定义、表内容、索引都存在文件系统,以文件存在,并完成与存储引擎的交互
|
||||
- MySQL提示“不存在此列”是执行到哪个节点报出的?
|
||||
- Parser解析器分析sql语法时检查的列
|
||||
- 一个表创建了多个索引,在哪个阶段进行索引选择?
|
||||
- Optimizer优化器阶段,查询优化器
|
||||
9
logseq-java/pages/MySQL适合创建索引的情况.md
Normal file
9
logseq-java/pages/MySQL适合创建索引的情况.md
Normal file
@@ -0,0 +1,9 @@
|
||||
- 频繁where条件查询,
|
||||
- 需要排序和分组的字段,
|
||||
- 需要统计的字段
|
||||
-
|
||||
- 不适合创建
|
||||
- 频繁更新的
|
||||
- 排序,where,分组用不到的字段
|
||||
- 已经确定表中数据非常少
|
||||
- 需要参与函数计算
|
||||
19
logseq-java/pages/MySQL锁.md
Normal file
19
logseq-java/pages/MySQL锁.md
Normal file
@@ -0,0 +1,19 @@
|
||||
- 表锁和行锁的区别
|
||||
- 表锁
|
||||
- 串行化时,整个表加锁,锁住整个表
|
||||
- 行锁
|
||||
- 非串行化时InnoDB使用的是行锁,只锁一行数据
|
||||
- 通过mvcc完成的
|
||||
- 共享锁
|
||||
- 排他锁
|
||||
- 意向锁
|
||||
- 所有操作之前都要申请一个意向锁,属于表锁,意向锁之间不会冲突,会和表锁冲突
|
||||
- 意向共享锁
|
||||
- 意向排他锁
|
||||
- 间隙锁
|
||||
- 锁定多行数据
|
||||
- next-key锁
|
||||
- 避免一些幻读操作
|
||||
- 当前读和快照读
|
||||
- 锁定读的时候读到的最新版本的数据
|
||||
- 可重复读下mvcc生效的是快照读,读取数据快照
|
||||
6
logseq-java/pages/Mybatis 面试题.md
Normal file
6
logseq-java/pages/Mybatis 面试题.md
Normal file
@@ -0,0 +1,6 @@
|
||||
- 说一说Mybatis里面的缓存机制
|
||||
- 说一说Mybatis里面的缓存机制
|
||||
- Mybatis中#{和$0}的区别是什么?
|
||||
- Mybatis是如何进行分页的
|
||||
- MyBatis 配置中的#0和$0有什么区别?
|
||||
- MyBatis 何时使用一级缓存,何时使用二级缓存?
|
||||
12
logseq-java/pages/Mybatis.md
Normal file
12
logseq-java/pages/Mybatis.md
Normal file
@@ -0,0 +1,12 @@
|
||||
- ```java
|
||||
//读取Mybat配置文件
|
||||
InputStream mybatisConfigInputStream = Resources.getResourceAsStream("mybatis-config.xml");
|
||||
//创建sqlsession会话工厂
|
||||
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
|
||||
//一个数据库 对应一个会话工厂
|
||||
SqlSessionFactory factory = factoryBuilder.build(mybatisConfigInputStream);
|
||||
//获取会话 会话用来执行sql语句,提交,回滚事务
|
||||
SqlSession sqlSession = factory.openSession();
|
||||
//关闭session
|
||||
sqlSession.close();
|
||||
```
|
||||
43
logseq-java/pages/Mysql数据库面试题.md
Normal file
43
logseq-java/pages/Mysql数据库面试题.md
Normal file
@@ -0,0 +1,43 @@
|
||||
- innoDB 如何解决幻读
|
||||
- b树和b+树的理解
|
||||
- 你是否在面试中也被过MySQL优化相关的问题呢?
|
||||
- 关于“你对MVCC的理解,看看普通人和高手是如何回答这个问题的?
|
||||
- 关于索引的底层实现,为什么选择B+Tree而不是红黑树?
|
||||
- 请你说一下Mysql中的性能调优方法?
|
||||
- 为什么一线互联网公司严禁使用存储过程?
|
||||
- Mysql 中的RR隔离级别,到底有没有解决幻读问题?
|
||||
- 为什么索引要用B+树来实现呢,而不是B树?
|
||||
- Mysql是如何解决幻读问题的?
|
||||
- 什么是聚集索引和非聚集索引
|
||||
- 请你简单说一下Mysql的事务隔离级别
|
||||
- binlog 和 redolog有什么区别?
|
||||
- 说一下你日常工作中是怎么优化SQL的
|
||||
- Mysql 主从集群同步延迟问题怎么解决
|
||||
- MySQL 数据库 cpu 飙升的话,要怎么处理呢?
|
||||
- innoDB 如何解决幻读
|
||||
- Mysql的binlog 有几种格式?分别有什么区别
|
||||
- 索引有哪些缺点以及具体有哪些索引类型
|
||||
- b树和b+树的理解
|
||||
- 什么是聚集索引和非聚集索引
|
||||
- 请你简单说一下Mysql的事务隔离级别
|
||||
- Mysql为什么使用B+Tree作为索引结构
|
||||
- 数据库连接池有什么用?它有哪些关键参数?
|
||||
- 请说一下Mysql索引的优点和缺点?
|
||||
- Mysql事务的实现原理
|
||||
- 请你说一下数据库优化
|
||||
- 说一下你对行锁、临键锁、间隙锁的理解
|
||||
- 索引什么时候失效?
|
||||
- Mysql 如何解决幻读问题
|
||||
- 请简要说明Mysql中MyISAM和InnoDB引擎的区别
|
||||
- 存储MD值应该用VARCHAR还是CHAR
|
||||
- Mysql 索引在什么情况下会失效
|
||||
- MySql 存储引擎 InnoDB 与MyISAM 有什么区别
|
||||
- MVCC过程中会加锁吗?
|
||||
- MySQL update 是锁行还是锁表?
|
||||
- 为什么 SQL 语句不要过多的join?
|
||||
- 什么情况下不建索引?
|
||||
- 为什么MySQL索引结构采用B+树?
|
||||
- 谈谈你对MySQL事务隔离级别的理解
|
||||
- 为什么SQL语句命中索引比不命中索引要快?
|
||||
- B 树和B+树的区别什么?
|
||||
- 执行SQL响应比较慢,你有哪些排查思路?
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user