Java目录

Posted 请你告诉我什么是Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java目录相关的知识,希望对你有一定的参考价值。

来晚了,整理一下进度,懒了。

Java目录 来看看我都写一些什么了。


1. 目录 --- 1

2. JVM --- 19

2.1. 线程  --- 20

2.2. JVM 内存区域 ---    21

2.2.1. 程序计数器(线程私有)---   22

2.2.2. 虚拟机栈(线程私有)---   22

2.2.3. 本地方法区(线程私有)---   23

2.2.4. 堆(Heap-线程共享)-运行时数据区 --- 23

2.2.5. 方法区/永久代(线程共享) ---  23

2.3. JVM 运行时内存 ---   .24

2.3.1. 新生代 ---    24

2.3.1.1. Eden 区 ---24

2.3.1.2. ServivorFrom---    24

2.3.1.3. ServivorTo ---    24

2.3.1.4. MinorGC 的过程(复制->清空->互换) --- 24

1:eden、servicorFrom 复制到 ServicorTo,年龄+1--- 25

2:清空 eden、servicorFrom---   25

3:ServicorTo 和 ServicorFrom 互换---   25

2.3.2. 老年代 ---    25

2.3.3. 永久代 ---    25

2.3.3.1. JAVA8 与元数据---   .25

2.4. 垃圾回收与算法 ---    26

2.4.1. 如何确定垃圾 ---   26

2.4.1.1. 引用计数法---    26

2.4.1.2. 可达性分析---    26

2.4.2. 标记清除算法(Mark-Sweep) ---  27

2.4.3. 复制算法(copying)---   27

2.4.4. 标记整理算法(Mark-Compact)---  28

2.4.5. 分代收集算法 ---   29

2.4.5.1. 新生代与复制算法 ---   29

2.4.5.2. 老年代与标记复制算法 ---   29

2.5. JAVA 四中引用类型 ---   30

2.5.1. 强引用 ---    30

2.5.2. 软引用 ---    30

2.5.3. 弱引用 ---    30

2.5.4. 虚引用 ---    30

2.6. GC 分代收集算法 VS 分区收集算法---  30

2.6.1. 分代收集算法 ---   30

2.6.1.1. 在新生代-复制算法---   30

2.6.1.2. 在老年代-标记整理算法---   30

2.6.2. 分区收集算法 ---   31

2.7. GC 垃圾收集器 ---    31

2.7.1. Serial 垃圾收集器(单线程、复制算法)--- 31

2.7.2. ParNew 垃圾收集器(Serial+多线程)--- 31

2.7.3. Parallel Scavenge 收集器(多线程复制算法、高效)    32

2.7.4. Serial Old 收集器(单线程标记整理算法 ) ---.32

2.7.5. Parallel Old 收集器(多线程标记整理算法)     .33

2.7.6. CMS 收集器(多线程标记清除算法)--- 33

2.7.6.1. 初始标记---    33

13/04/2018 Page 2 of 283

2.7.6.2. 并发标记---    34

2.7.6.3. 重新标记---    34

2.7.6.4. 并发清除---    34

2.7.7. G1 收集器---    34

2.8. JAVA IO/NIO---    34

2.8.1. 阻塞 IO 模型 ---   34

2.8.2. 非阻塞 IO 模型 ---   35

2.8.3. 多路复用 IO 模型 ---   35

2.8.4. 信号驱动 IO 模型 ---   36

2.8.5. 异步 IO 模型 ---   36

2.8.1. JAVA IO 包---    36

2.8.2. JAVA NIO---    37

2.8.2.1. NIO 的缓冲区 ---    38

2.8.2.2. NIO 的非阻塞 ---    38

2.8.3. Channel ---    40

2.8.4. Buffer---    40

2.8.5. Selector---    40

2.9. JVM 类加载机制 ---   .41

2.9.1.1. 加载  --- 41

2.9.1.2. 验证  --- 41

2.9.1.3. 准备  --- 41

2.9.1.4. 解析  --- 41

2.9.1.5. 符号引用---    42

2.9.1.6. 直接引用---    42

2.9.1.7. 初始化  --- 42

2.9.1.8. 类构造器<client>---   42

2.9.2. 类加载器 ---    42

2.9.2.1. 启动类加载器(Bootstrap ClassLoader) --- 43

2.9.2.2. 扩展类加载器(Extension ClassLoader)--- 43

2.9.2.3. 应用程序类加载器(Application ClassLoader): ---43

2.9.3. 双亲委派 ---    43

2.9.4. OSGI(动态模型系统) ---  44

2.9.4.1. 动态改变构造---    44

2.9.4.2. 模块化编程与热插拔 ---   44

3. JAVA 集合---    45

3.1. 接口继承关系和实现 ---   45

3.2. LIST --- 47

3.2.1. ArrayList(数组)---   47

3.2.2. Vector(数组实现、线程同步)---  47

3.2.3. LinkList(链表)---   47

3.3. SET  --- 48

3.3.1.1. HashSet(Hash 表)---   48

3.3.1.2. TreeSet(二叉树) ---   49

3.3.1.3. LinkHashSet(HashSet+LinkedHashMap)--- 49

3.4. MAP --- 50

3.4.1. HashMap(数组+链表+红黑树)--- .50

3.4.1.1. JAVA7 实现 ---    50

3.4.1.2. JAVA8 实现 ---    51

3.4.2. ConcurrentHashMap---   51

3.4.2.1. Segment 段---    51

3.4.2.2. 线程安全(Segment 继承 ReentrantLock 加锁)--- 51

3.4.2.3. 并行度(默认 16) ---   .52

3.4.2.4. Java8 实现 (引入了红黑树) ---  52

13/04/2018 Page 3 of 283

3.4.3. HashTable(线程安全) ---  53

3.4.4. TreeMap(可排序) ---   53

3.4.5. LinkHashMap(记录插入顺序)---  53

4. JAVA 多线程并发---   .54

4.1.1. JAVA 并发知识库 ---   54

4.1.2. JAVA 线程实现/创建方式 ---  54

4.1.2.1. 继承 Thread 类---    54

4.1.2.2. 实现 Runnable 接口。---   54

4.1.2.3. ExecutorService、Callable<Class>、Future 有返回值线程    55

4.1.2.4. 基于线程池的方式---    56

4.1.3. 4 种线程池 ---    56

4.1.3.1. newCachedThreadPool---   57

4.1.3.2. newFixedThreadPool---   57

4.1.3.3. newScheduledThreadPool---   58

4.1.3.4. newSingleThreadExecutor ---   58

4.1.4. 线程生命周期(状态)---   58

4.1.4.1. 新建状态(NEW) ---   .58

4.1.4.2. 就绪状态(RUNNABLE):---   59

4.1.4.3. 运行状态(RUNNING): ---   59

4.1.4.4. 阻塞状态(BLOCKED):---   59

等待阻塞(o.wait->等待对列):---   59

同步阻塞(lock->锁池) ---    59

其他阻塞(sleep/join) ---    59

4.1.4.5. 线程死亡(DEAD)---   59

正常结束 --- 59

异常结束 --- 59

调用 stop --- 59

4.1.5. 终止线程 4 种方式 ---   60

4.1.5.1. 正常运行结束---    60

4.1.5.2. 使用退出标志退出线程---   60

4.1.5.3. Interrupt 方法结束线程---   60

4.1.5.4. stop 方法终止线程(线程不安全)---  61

4.1.6. sleep 与 wait 区别---   61

4.1.7. start 与 run 区别---   62

4.1.8. JAVA 后台线程 ---   62

4.1.9. JAVA 锁 ---    63

4.1.9.1. 乐观锁  --- 63

4.1.9.2. 悲观锁  --- 63

4.1.9.3. 自旋锁  --- 63

自旋锁的优缺点 ---63

自旋锁时间阈值(1.6 引入了适应性自旋锁)---  63

自旋锁的开启 --- 64

4.1.9.4. Synchronized 同步锁---   64

Synchronized 作用范围---    64

Synchronized 核心组件---    64

Synchronized 实现---    64

4.1.9.5. ReentrantLock---    66

Lock 接口的主要方法---    66

非公平锁 --- 66

公平锁 --- 67

ReentrantLock 与 synchronized ---   67

ReentrantLock 实现---    67

Condition 类和 Object 类锁方法区别区别---  68

tryLock 和 lock 和 lockInterruptibly 的区别---  68

4.1.9.6. Semaphore 信号量---   .68

实现互斥锁(计数器为 1)---   .68

代码实现 --- 68

Semaphore 与 ReentrantLock ---   69

4.1.9.7. AtomicInteger---    69

13/04/2018 Page 4 of 283

4.1.9.8. 可重入锁(递归锁)---   69

4.1.9.9. 公平锁与非公平锁---    70

公平锁(Fair) ---.70

非公平锁(Nonfair)---    70

4.1.9.10. ReadWriteLock 读写锁---   70

读锁 ---  70

写锁 ---  70

4.1.9.11. 共享锁和独占锁 ---    70

独占锁 --- 70

共享锁 --- 70

4.1.9.12. 重量级锁(Mutex Lock) ---   71

4.1.9.13. 轻量级锁---    71

锁升级 --- 71

4.1.9.14. 偏向锁---    71

4.1.9.15. 分段锁---    71

4.1.9.16. 锁优化---    71

减少锁持有时间 ---72

减小锁粒度 --- 72

锁分离 --- 72

锁粗化 --- 72

锁消除 --- 72

4.1.10. 线程基本方法 ---   72

4.1.10.1. 线程等待(wait)---   73

4.1.10.2. 线程睡眠(sleep)---   73

4.1.10.3. 线程让步(yield)---   73

4.1.10.4. 线程中断(interrupt)---   73

4.1.10.5. Join 等待其他线程终止---   74

4.1.10.6. 为什么要用 join()方法? ---   74

4.1.10.7. 线程唤醒(notify)---   74

4.1.10.8. 其他方法:---    74

4.1.11. 线程上下文切换 ---   75

4.1.11.1. 进程 --- 75

4.1.11.2. 上下文---    75

4.1.11.3. 寄存器---    75

4.1.11.4. 程序计数器---    75

4.1.11.5. PCB-“切换桢”---   .75

4.1.11.6. 上下文切换的活动: ---   76

4.1.11.7. 引起线程上下文切换的原因 ---  76

4.1.12. 同步锁与死锁 ---   76

4.1.12.1. 同步锁---    76

4.1.12.2. 死锁 --- 76

4.1.13. 线程池原理 ---    76

4.1.13.1. 线程复用---    76

4.1.13.2. 线程池的组成---    76

4.1.13.3. 拒绝策略---    78

4.1.13.4. Java 线程池工作过程 ---   78

4.1.14. JAVA 阻塞队列原理---   79

4.1.14.1. 阻塞队列的主要方法 ---   80

插入操作: --- 80

获取数据操作: ---81

4.1.14.2. Java 中的阻塞队列 ---   81

4.1.14.3. ArrayBlockingQueue(公平、非公平) --- 82

4.1.14.4. LinkedBlockingQueue(两个独立锁提高并发)     .82

4.1.14.5. PriorityBlockingQueue(compareTo 排序实现优先)    82

4.1.14.6. DelayQueue(缓存失效、定时任务 )--- 82

4.1.14.7. SynchronousQueue(不存储数据、可用于传递数据)    83

4.1.14.8. LinkedTransferQueue---   83

13/04/2018 Page 5 of 283

4.1.14.9. LinkedBlockingDeque---   83

4.1.15. CyclicBarrier、CountDownLatch、Semaphore 的用法    84

4.1.15.1. CountDownLatch(线程计数器 ) ---  84

4.1.15.2. CyclicBarrier(回环栅栏-等待至 barrier 状态再全部同时执行)    84

4.1.15.3. Semaphore(信号量-控制同时访问的线程个数)     85

4.1.16. volatile 关键字的作用(变量可见性、禁止重排序)     87

变量可见性 --- 87

禁止重排序 --- 87

sychronized 更轻量级的同步锁---   87

适用场景 --- 87

4.1.17. 如何在两个线程之间共享数据---  88

将数据抽象成一个类,并将数据的操作作为这个类的方法--- 88

Runnable 对象作为一个类的内部类 ---   89

4.1.18. ThreadLocal 作用(线程本地存储)--- 90

ThreadLocalMap(线程的一个属性) ---  90

使用场景 --- 91

4.1.19. synchronized 和 ReentrantLock 的区别 --- 91

4.1.19.1. 两者的共同点: ---    91

4.1.19.2. 两者的不同点: ---    92

4.1.20. ConcurrentHashMap 并发---  92

4.1.20.1. 减小锁粒度---    92

4.1.20.2. ConcurrentHashMap 分段锁---  92

ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成   93

4.1.21. Java 中用到的线程调度 ---  93

4.1.21.1. 抢占式调度:---    93

4.1.21.2. 协同式调度:---    93

4.1.21.3. JVM 的线程调度实现(抢占式调度) --- .94

4.1.21.4. 线程让出 cpu 的情况: ---   94

4.1.22. 进程调度算法 ---   94

4.1.22.1. 优先调度算法---    94

4.1.22.2. 高优先权优先调度算法 ---   95

4.1.22.3. 基于时间片的轮转调度算法 ---  96

4.1.23. 什么是 CAS(比较并交换-乐观锁机制-锁自旋)     96

4.1.23.1. 概念及特性---    96

4.1.23.2. 原子包 java.util.concurrent.atomic(锁自旋) ---.97

4.1.23.3. ABA 问题---    98

4.1.24. 什么是 AQS(抽象的队列同步器)--- 98

Exclusive 独占资源-ReentrantLock ---   99

Share 共享资源-Semaphore/CountDownLatch ---  99

同步器的实现是 ABS 核心(state 资源状态计数)--- 100

ReentrantReadWriteLock 实现独占和共享两种方式--- 100

5. JAVA 基础---    101

5.1.1. JAVA 异常分类及处理---  101

5.1.1.1. 概念 ---101

5.1.1.2. 异常分类---    101

Error --- 101

Exception(RuntimeException、CheckedException) ---.101

5.1.1.3. 异常的处理方式 ---   102

遇到问题不进行具体处理,而是继续抛给调用者 throw,throws)    102

try catch 捕获异常针对性处理方式---   102

5.1.1.4. Throw 和 throws 的区别: ---  102

13/04/2018 Page 6 of 283

位置不同 --- 102

功能不同: --- 102

5.1.2. JAVA 反射 ---   .103

5.1.2.1. 动态语言---    103

5.1.2.2. 反射机制概念 (运行状态中知道类所有的属性和方法)    103

5.1.2.3. 反射的应用场合 ---   103

编译时类型和运行时类型---    103

的编译时类型无法获取具体方法---   104

5.1.2.4. Java 反射 API---    104

反射 API 用来生成 JVM 中的类、接口或则对象的信息。 --- 104

5.1.2.5. 反射使用步骤(获取 Class 对象、调用对象方法)     104

5.1.2.6. 获取 Class 对象的 3 种方法 ---  104

调用某个对象的 getClass()方法---   104

调用某个类的 class 属性来获取该类对应的 Class 对象--- 104

使用 Class 类中的 forName()静态方法(最安全/性能最好)--- 104

5.1.2.7. 创建对象的两种方法 ---   105

Class 对象的 newInstance()---   105

调用 Constructor 对象的 newInstance()---  105

5.1.3. JAVA 注解 ---   .106

5.1.3.1. 概念  --- 106

5.1.3.2. 4 种标准元注解---    106

@Target 修饰的对象范围 ---   .106

@Retention 定义 被保留的时间长短---  .106

@Documented 描述-javadoc---   106

@Inherited 阐述了某个被标注的类型是被继承的 ---  106

5.1.3.3. 注解处理器---    107

5.1.4. JAVA 内部类 ---   109

5.1.4.1. 静态内部类---    109

5.1.4.2. 成员内部类---    110

5.1.4.3. 局部内部类(定义在方法中的类)---  110

5.1.4.4. 匿名内部类(要继承一个父类或者实现一个接口、直接使用 new 来生成一个对象的引用) 111

5.1.5. JAVA 泛型 ---   .112

5.1.5.1. 泛型方法(<E>)---   112

5.1.5.2. 泛型类<T> ---    112

5.1.5.3. 类型通配符? ---    113

5.1.5.4. 类型擦除 ---    113

5.1.6. JAVA 序列化(创建可复用的 Java 对象)--- 113

保存(持久化)对象及其状态到内存或者磁盘---  113

序列化对象以字节数组保持-静态成员不保存---  113

序列化用户远程对象传输---    113

Serializable 实现序列化 ---    113

ObjectOutputStream 和 ObjectInputStream 对对象进行序列化及反序列化   113

writeObject 和 readObject 自定义序列化策略---  113

序列化 ID --- 113

序列化并不保存静态变量---    114

序列化子父类说明---    114

Transient 关键字阻止该变量被序列化到文件中--- 114

5.1.7. JAVA 复制 ---   .114

5.1.7.1. 直接赋值复制---    114

5.1.7.2. 浅复制(复制引用但不复制引用的对象)--- 114

5.1.7.3. 深复制(复制对象和其应用对象)---  115

5.1.7.4. 序列化(深 clone 一中实现)---  115

6. SPRING 原理 ---    116

6.1.1. Spring 特点---   116

6.1.1.1. 轻量级---    116

13/04/2018 Page 7 of 283

6.1.1.2. 控制反转---    116

6.1.1.3. 面向切面---    116

6.1.1.4. 容器 ---116

6.1.1.5. 框架集合---    116

6.1.2. Spring 核心组件---   117

6.1.3. Spring 常用模块---   117

6.1.4. Spring 主要包---   118

6.1.5. Spring 常用注解---   118

6.1.6. Spring 第三方结合---   119

6.1.7. Spring IOC 原理---   120

6.1.7.1. 概念  --- 120

6.1.7.2. Spring 容器高层视图 ---   120

6.1.7.3. IOC 容器实现---    120

BeanFactory-框架基础设施---   120

1.1 1.1.1 BeanDefinitionRegistry 注册表---  121

1.1 1.1.2 BeanFactory 顶层接口---  121

1.1 1.1.3 ListableBeanFactory ---   121

1.1 1.1.4 HierarchicalBeanFactory 父子级联--- 121

1.1 1.1.5 ConfigurableBeanFactory---  121

1.1 1.1.6 AutowireCapableBeanFactory 自动装配 --- 122

1.1 1.1.7 SingletonBeanRegistry 运行期间注册单例 Bean    122

1.1 1.1.8 依赖日志框框---   122

ApplicationContext 面向开发应用---   122

WebApplication 体系架构 ---   .123

6.1.7.4. Spring Bean 作用域---   123

singleton:单例模式(多线程下不安全) ---  123

prototype:原型模式每次使用时创建 ---   124

Request:一次 request 一个实例---   124

session --- 124

global Session ---124

6.1.7.5. Spring Bean 生命周期---   124

实例化 --- 124

IOC 依赖注入 --- 124

setBeanName 实现---    124

BeanFactoryAware 实现---    124

ApplicationContextAware 实现---   125

postProcessBeforeInitialization 接口实现-初始化预处理---125

init-method --- 125

postProcessAfterInitialization---   125

Destroy 过期自动清理阶段 ---   125

destroy-method 自配置清理 ---   125

6.1.7.6. Spring 依赖注入四种方式---   126

构造器注入 --- 126

setter 方法注入---    .127

静态工厂注入 --- 127

实例工厂 --- 127

6.1.7.7. 5 种不同方式的自动装配---   128

6.1.8. Spring APO 原理 ---   129

6.1.8.1. 概念  --- 129

6.1.8.2. AOP 核心概念 ---    129

6.1.8.1. AOP 两种代理方式 ---   130

JDK 动态接口代理 ---    130

CGLib 动态代理---    131

6.1.8.2. 实现原理 ---    131

6.1.9. Spring MVC 原理---   132

6.1.9.1. MVC 流程---    132

Http 请求到 DispatcherServlet ---   133

HandlerMapping 寻找处理器---   133

调用处理器 Controller---    133

13/04/2018 Page 8 of 283

Controller 调用业务逻辑处理后,返回 ModelAndView--- 133

DispatcherServlet 查询 ModelAndView ---  133

ModelAndView 反馈浏览器 HTTP ---   133

6.1.9.1. MVC 常用注解---    133

6.1.10. Spring Boot 原理---   134

1. 创建独立的 Spring 应用程序---   134

2. 嵌入的 Tomcat,无需部署 WAR 文件---  134

3. 简化 Maven 配置---    134

4. 自动配置 Spring ---    134

5. 提供生产就绪型功能,如指标,健康检查和外部配置--- 134

6. 绝对没有代码生成和对 XML 没有要求配置 [1]---  134

6.1.11. JPA 原理---    134

6.1.11.1. 事务 ---134

6.1.11.2. 本地事务---    134

6.1.11.1. 分布式事务---    135

6.1.11.1. 两阶段提交---    136

1 准备阶段 --- 136

2 提交阶段: --- 136

6.1.12. Mybatis 缓存---   137

6.1.12.1. Mybatis 的一级缓存原理(sqlsession 级别)--- 138

6.1.12.2. 二级缓存原理(mapper 基本)---  138

具体使用需要配置:---    139

6.1.13. Tomcat 架构---   139

7. 微服务 ---    140

7.1.1. 服务注册发现 ---   140

7.1.1.1. 客户端注册(zookeeper)---   140

7.1.1.2. 第三方注册(独立的服务 Registrar)---  140

7.1.1.3. 客户端发现---    141

7.1.1.4. 服务端发现---    142

7.1.1.5. Consul ---142

7.1.1.6. Eureka ---142

7.1.1.7. SmartStack---    142

7.1.1.8. Etcd  --- 142

7.1.2. API 网关---    142

7.1.2.1. 请求转发 ---    143

7.1.2.2. 响应合并 ---    143

7.1.2.3. 协议转换 ---    143

7.1.2.4. 数据转换 ---    143

7.1.2.5. 安全认证 ---    144

7.1.3. 配置中心 ---    144

7.1.3.1. zookeeper 配置中心---   144

7.1.3.2. 配置中心数据分类---   .144

7.1.4. 事件调度(kafka)---   144

7.1.5. 服务跟踪(starter-sleuth)---  144

7.1.6. 服务熔断(Hystrix) ---   145

7.1.6.1. Hystrix 断路器机制---   146

7.1.7. API 管理---    146

8. NETTY 与 RPC ---    147

8.1.1. Netty 原理---    147

8.1.2. Netty 高性能---   147

8.1.2.1. 多路复用通讯方式 ---   147

8.1.2.1. 异步通讯 NIO---    148

8.1.2.2. 零拷贝(DIRECT BUFFERS 使用堆外直接内存)---149

8.1.2.3. 内存池(基于内存池的缓冲区重用机制) --- 149

8.1.2.4. 高效的 Reactor 线程模型---   149

Reactor 单线程模型---    149

Reactor 多线程模型---    150

13/04/2018 Page 9 of 283

主从 Reactor 多线程模型---    150

8.1.2.5. 无锁设计、线程绑定---   151

8.1.2.6. 高性能的序列化框架---   151

小包封大包,防止网络阻塞---   152

软中断 Hash 值和 CPU 绑定---   152

8.1.3. Netty RPC 实现---   152

8.1.3.1. 概念  --- 152

8.1.3.2. 关键技术 ---    152

8.1.3.3. 核心流程 ---    152

8.1.3.1. 消息编解码---    153

息数据结构(接口名称+方法名+参数类型和参数值+超时时间+ requestID)    153

序列化 --- 154

8.1.3.1. 通讯过程 ---    154

核心问题(线程暂停、消息乱序) ---   154

通讯流程 --- 154

requestID 生成-AtomicLong ---   154

存放回调对象 callback 到全局 ConcurrentHashMap --- 154

synchronized 获取回调对象 callback 的锁并自旋 wait--- 154

监听消息的线程收到消息,找到 callback 上的锁并唤醒 --- 155

8.1.4. RMI 实现方式---   155

8.1.4.1. 实现步骤 ---    155

8.1.5. Protoclol Buffer---   156

8.1.5.1. 特点  --- 157

8.1.6. Thrift ---    157

9. 网络 ---.159

9.1.1. 网络 7 层架构 ---   159

9.1.2. TCP/IP 原理---   160

9.1.2.1. 网络访问层(Network Access Layer)---  160

9.1.2.2. 网络层(Internet Layer) ---   160

9.1.2.3. 传输层(Tramsport Layer-TCP/UDP) ---  160

9.1.2.4. 应用层(Application Layer)---   160

9.1.3. TCP 三次握手/四次挥手 ---  161

9.1.3.1. 数据包说明---    161

9.1.3.2. 三次握手 ---    162

9.1.3.3. 四次挥手 ---    163

9.1.4. HTTP 原理---   .164

9.1.4.1. 传输流程 ---    164

2:封装 HTTP 请求数据包 ---   165

3:封装成 TCP 包并建立连接---   165

4:客户机发送请求命---    165

5:服务器响应 ---165

6:服务器关闭 TCP 连接---    165

9.1.4.2. HTTP 状态 ---    165

9.1.4.3. HTTPS ---    .166

建立连接获取证书---    167

证书验证 --- 167

数据加密和传输---    167

9.1.5. CDN 原理---    167

9.1.5.1. 分发服务系统---    167

9.1.5.2. 负载均衡系统:---    168

9.1.5.3. 管理系统:---    168

10. 日志 ---    169

10.1.1. Slf4j ---    169

10.1.2. Log4j ---    169

10.1.3. LogBack---    169

10.1.3.1. Logback 优点---    169

10.1.4. ELK---    170

13/04/2018 Page 10 of 283

11. ZOOKEEPER ---   .171

11.1.1. Zookeeper 概念 ---   171

11.1.1. Zookeeper 角色 ---   171

11.1.1.1. Leader---    171

11.1.1.2. Follower---    171

11.1.1.3. Observer---    171

11.1.1.1. ZAB 协议 ---    172

事务编号 Zxid(事务请求计数器+ epoch) ---  172

epoch --- 172

Zab 协议有两种模式-恢复模式(选主)、广播模式(同步)    172

ZAB 协议 4 阶段---    172

Leader election(选举阶段-选出准 Leader) ---  172

Discovery(发现阶段-接受提议、生成 epoch、接受 epoch)    173

Synchronization(同步阶段-同步 follower 副本)--- 173

Broadcast(广播阶段-leader 消息广播)---  173

ZAB 协议 JAVA 实现(FLE-发现阶段和同步合并为 Recovery Phase(恢复阶段))  173

11.1.1.2. 投票机制---    173

11.1.2. Zookeeper 工作原理(原子广播)--- 174

11.1.3. Znode 有四种形式的目录节点 ---  174

12. KAFKA---    175

12.1.1. Kafka 概念 ---   .175

12.1.2. Kafka 数据存储设计 ---   175

12.1.2.1. partition 的数据文件(offset,MessageSize,data)    175

12.1.2.2. 数据文件分段 segment(顺序读写、分段命令、二分查找)   176

12.1.2.3. 数据文件索引(分段索引、稀疏存储)--- 176

12.1.3. 生产者设计 ---   176

12.1.3.1. 负载均衡(partition 会均衡分布到不同 broker 上)    176

12.1.3.2. 批量发送---    177

12.1.3.3. 压缩(GZIP 或 Snappy)---  .177

12.1.1. 消费者设计 ---   177

12.1.1.1. Consumer Group ---   178

13. RABBITMQ ---    179

13.1.1. 概念 ---    179

13.1.2. RabbitMQ 架构 ---   179

13.1.2.1. Message ---    180

13.1.2.2. Publisher ---    180

13.1.2.3. Exchange(将消息路由给队列 ) ---  180

13.1.2.4. Binding(消息队列和交换器之间的关联)--- 180

13.1.2.5. Queue ---    180

13.1.2.6. Connection---    180

13.1.2.7. Channel ---    180

13.1.2.8. Consumer---    180

13.1.2.9. Virtual Host ---    180

13.1.2.10. Broker---    181

13.1.3. Exchange 类型 ---   181

13.1.3.1. Direct 键(routing key)分布: ---  181

13.1.3.2. Fanout(广播分发)---   181

13.1.3.3. topic 交换器(模式匹配) ---  182

13/04/2018 Page 11 of 283

14. HBASE---    183

14.1.1. 概念 ---    183

14.1.2. 列式存储 ---    183

14.1.3. Hbase 核心概念---   184

14.1.3.1. Column Family 列族---   184

14.1.3.2. Rowkey(Rowkey 查询,Rowkey 范围扫描,全表扫描)   .184

14.1.3.3. Region 分区---    184

14.1.3.4. TimeStamp 多版本---   184

14.1.4. Hbase 核心架构---   184

14.1.4.1. Client:---    185

14.1.4.2. Zookeeper:---    185

14.1.4.3. Hmaster---    185

14.1.4.4. HregionServer---   .185

14.1.4.5. Region 寻址方式(通过 zookeeper .META)--- 186

14.1.4.6. HDFS ---    186

14.1.5. Hbase 的写逻辑---   187

14.1.5.1. Hbase 的写入流程 ---   187

获取 RegionServer ---    187

请求写 Hlog  --- 187

请求写 MemStore ---    187

14.1.5.2. MemStore 刷盘---   187

全局内存控制 --- 188

MemStore 达到上限---    188

RegionServer 的 Hlog 数量达到上限---  .188

手工触发 --- 188

关闭 RegionServer 触发---    188

Region 使用 HLOG 恢复完数据后触发---  188

14.1.6. HBase vs Cassandra---  .188

15. MONGODB---    190

15.1.1. 概念 ---    190

15.1.2. 特点 ---    190

16. CASSANDRA---   .192

16.1.1. 概念 ---    192

16.1.2. 数据模型 ---    192

Key Space(对应 SQL 数据库中的 database)---  192

Key(对应 SQL 数据库中的主键)---   192

column(对应 SQL 数据库中的列)---   192

super column(SQL 数据库不支持)---   192

Standard Column Family(相对应 SQL 数据库中的 table)--- 192

Super Column Family(SQL 数据库不支持) ---  192

16.1.3. Cassandra 一致 Hash 和虚拟节点 --- 192

一致性 Hash(多米诺 down 机)---   192

虚拟节点(down 机多节点托管)---   193

16.1.4. Gossip 协议---   193

Gossip 节点的通信方式及收敛性 ---   194

Gossip 两个节点(A、B)之间存在三种通信方式(push、pull、push&pull)   194

gossip 的协议和 seed list(防止集群分列) ---  194

16.1.5. 数据复制 ---    194

Partitioners(计算 primary key token 的 hash 函数)--- 194

两种可用的复制策略: ---    194

SimpleStrategy:仅用于单数据中心,---  194

将第一个 replica 放在由 partitioner 确定的节点中,其余的 replicas 放在上述节点顺时针方向的后续节

点中。 --- 194

13/04/2018 Page 12 of 283

NetworkTopologyStrategy:可用于较复杂的多数据中心。    .194

可以指定在每个数据中心分别存储多少份 replicas。--- 194

16.1.6. 数据写请求和协调者 ---   195

协调者(coordinator)---    195

16.1.7. 数据读请求和后台修复 ---  195

16.1.8. 数据存储(CommitLog、MemTable、SSTable)    196

SSTable 文件构成(BloomFilter、index、data、static)--- 196

16.1.9. 二级索引(对要索引的 value 摘要,生成 RowKey)    196

16.1.10. 数据读写 ---   197

数据写入和更新(数据追加) ---   197

数据的写和删除效率极高---    197

错误恢复简单 --- 197

读的复杂度高 --- 197

数据删除(column 的墓碑) ---   197

墓碑 --- 198

垃圾回收 compaction ---    198

数据读取(memtable+SStables)---   198

行缓存和键缓存请求流程图 ---    199

Row Cache(SSTables 中频繁被访问的数据)--- 199

Bloom Filter(查找数据可能对应的 SSTable)--- .200

Partition Key Cache(查找数据可能对应的 Partition key)     200

Partition Summary(内存中存储一些 partition index 的样本)    200

Partition Index(磁盘中) ---   200

Compression offset map(磁盘中)---  .200

17. 设计模式---    201

17.1.1. 设计原则 ---    201

17.1.2. 工厂方法模式 ---   201

17.1.3. 抽象工厂模式 ---   201

17.1.4. 单例模式 ---    201

17.1.5. 建造者模式 ---   201

17.1.6. 原型模式 ---    201

17.1.7. 适配器模式 ---   201

17.1.8. 装饰器模式 ---   201

17.1.9. 代理模式 ---    201

17.1.10. 外观模式 ---   201

17.1.11. 桥接模式 ---   201

17.1.12. 组合模式 ---   201

17.1.13. 享元模式 ---   201

17.1.14. 策略模式 ---   201

17.1.15. 模板方法模式 ---   201

17.1.16. 观察者模式 ---   201

17.1.17. 迭代子模式 ---   201

17.1.18. 责任链模式 ---   201

17.1.19. 命令模式 ---   201

17.1.20. 备忘录模式 ---   201

17.1.21. 状态模式 ---   202

17.1.22. 访问者模式 ---   202

17.1.23. 中介者模式 ---   202

17.1.24. 解释器模式 ---   202

18. 负载均衡---    203

18.1.1. 四层负载均衡 vs 七层负载均衡 ---  203

F5:硬件负载均衡器,功能很好,但是成本很高。--- 203

lvs:重量级的四层负载软件。 ---   203

nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活。     203

13/04/2018 Page 13 of 283

haproxy:模拟四层转发,较灵活。---   203

18.1.1.2. 七层负载均衡(内容交换) ---  203

haproxy:天生负载均衡技能,全面支持七层代理,会话保持,标记,路径转移;  204

nginx:只在 http 协议和 mail 协议上功能比较好,性能与 haproxy 差不多;   204

apache:功能较差---    204

mysql proxy:功能尚可。---   .204

18.1.2. 负载均衡算法/策略 ---   204

18.1.2.1. 轮循均衡(Round Robin) ---  204

18.1.2.2. 权重轮循均衡(Weighted Round Robin)--- 204

18.1.2.3. 随机均衡(Random) ---   204

18.1.2.4. 权重随机均衡(Weighted Random)--- 204

18.1.2.5. 响应速度均衡(Response Time 探测时间)--- 204

18.1.2.6. 最少连接数均衡(Least Connection)--- 205

18.1.2.7. 处理能力均衡(CPU、内存) ---  205

18.1.2.8. DNS 响应均衡(Flash DNS) ---  205

18.1.2.9. 哈希算法---    205

18.1.2.11. URL 散列---    205

18.1.3. LVS---    206

18.1.3.1. LVS 原理---    206

IPVS  --- 206

18.1.3.1. LVS NAT 模式 ---    207

18.1.3.3. LVS TUN 模式(IP 封装、跨网段)---  209

18.1.3.4. LVS FULLNAT 模式---   210

18.1.4. Keepalive---    211

18.1.5. Nginx 反向代理负载均衡 ---  211

18.1.5.1. upstream_module 和健康检测---  212

18.1.5.1. proxy_pass 请求转发---   212

18.1.6. HAProxy ---    213

19. 数据库 ---    214

19.1.1. 存储引擎 ---    214

19.1.1.1. 概念 ---214

19.1.1.2. InnoDB(B+树) ---   214

19.1.1.3. TokuDB(Fractal Tree-节点带数据) --- 215

19.1.1.4. MyIASM---    215

19.1.1.5. Memory---    215

19.1.2. 索引 ---    215

19.1.2.1. 常见索引原则有 ---   216

1.选择唯一性索引 ---    216

2.为经常需要排序、分组和联合操作的字段建立索引: --- 216

3.为常作为查询条件的字段建立索引。---  216

4.限制索引的数目:---    216

尽量使用数据量少的索引---    216

尽量使用前缀来索引---    216

7.删除不再使用或者很少使用的索引---  216

8 . 最左前缀匹配原则,非常重要的原则。---  216

10 . 尽量选择区分度高的列作为索引 ---  216

11 .索引列不能参与计算,保持列“干净”:带函数的查询不参与索引。    216

12 .尽量的扩展索引,不要新建索引。---  216

19.1.3. 数据库三范式 ---   216

19.1.3.1. 第一范式(1st NF -列都是不可再分)--- .216

19.1.3.2. 第二范式(2nd NF-每个表只描述一件事情)--- 216

19.1.3.3. 第三范式(3rd NF- 不存在对非主键列的传递依赖)    217

19.1.4. 数据库是事务 ---   217

13/04/2018 Page 14 of 283

原子性(Atomicity)---    217

一致性(Consistency)---    217

隔离性(Isolation)---    218

永久性(Durability) ---    218

19.1.5. 存储过程(特定功能的 SQL 语句集)--- 218

存储过程优化思路: ---    218

19.1.6. 触发器(一段能自动执行的程序)---  218

19.1.7. 数据库并发策略 ---   218

19.1.7.1. 乐观锁---    218

19.1.7.2. 悲观锁---    219

19.1.7.3. 时间戳---    219

19.1.8. 数据库锁 ---    219

19.1.8.1. 行级锁---    219

19.1.8.2. 表级锁---    219

19.1.8.1. 页级锁---    219

19.1.9. 基于 Redis 分布式锁 ---   219

19.1.10. 分区分表 ---   220

垂直切分(按照功能模块) ---    220

水平切分(按照规则划分存储) ---   220

19.1.11. 两阶段提交协议 ---   220

19.1.11.1. 准备阶段---    221

19.1.11.2. 提交阶段---    221

19.1.11.3. 缺点 ---221

同步阻塞问题 --- 221

单点故障 --- 221

数据不一致(脑裂问题)---    221

二阶段无法解决的问题(数据状态不确定) ---  221

19.1.12. 三阶段提交协议 ---   222

19.1.12.1. CanCommit 阶段 ---   222

19.1.12.2. PreCommit 阶段 ---   222

19.1.12.3. doCommit 阶段---   .222

19.1.13. 柔性事务 ---   222

19.1.13.1. 柔性事务---    222

两阶段型 --- 222

补偿型 --- 222

异步确保型 --- 223

最大努力通知型(多次尝试)---   223

19.1.14. CAP---    224

一致性(C):  --- 224

可用性(A):  --- 224

分区容忍性(P):---    224

20. 一致性算法---    225

20.1.1. Paxos ---    225

Paxos 三种角色:Proposer,Acceptor,Learners --- 225

Proposer:  --- 225

Acceptor: --- 225

Learner: --- 225

Paxos 算法分为两个阶段。具体如下:---  .225

阶段一(准 leader 确定 ):---   225

阶段二(leader 确认):---    225

20.1.2. Zab ---    225

1.崩溃恢复:主要就是 Leader 选举过程---  226

2.数据同步:Leader 服务器与其他服务器进行数据同步--- 226

3.消息广播:Leader 服务器将数据发送给其他服务器--- 226

20.1.3. Raft---    226

20.1.3.1. 角色 ---226

Leader(领导者-日志管理) ---   226

Follower(追随者-日志同步)---   226

Candidate(候选者-负责选票)---   226

13/04/2018 Page 15 of 283

20.1.3.2. Term(任期)---    226

20.1.3.3. 选举(Election)---   227

选举定时器 --- 227

20.1.3.4. 安全性(Safety)---   227

20.1.3.5. raft 协议和 zab 协议区别 ---   227

20.1.4. NWR---    228

N:在分布式存储系统中,有多少份备份数据---  228

W:代表一次成功的更新操作要求至少有 w 份数据写入成功     228

R: 代表一次成功的读数据操作要求至少有 R 份数据成功读取    228

20.1.5. Gossip---    228

20.1.6. 一致性 Hash---   229

20.1.6.1. 一致性 Hash 特性---   229

20.1.6.2. 一致性 Hash 原理---   229

1.建构环形 hash 空间:---    229

2.把需要缓存的内容(对象)映射到 hash 空间---  229

3.把服务器(节点)映射到 hash 空间 ---   229

4.把对象映射到服务节点---    229

考察 cache 的变动---    230

虚拟节点 --- 230

21. JAVA 算法 ---    232

21.1.1. 二分查找 ---    232

21.1.2. 冒泡排序算法 ---   232

21.1.3. 插入排序算法 ---   233

21.1.4. 快速排序算法 ---   234

21.1.1. 希尔排序算法 ---   236

21.1.2. 归并排序算法 ---   237

21.1.3. 桶排序算法 ---   240

21.1.4. 基数排序算法 ---   241

21.1.5. 剪枝算法 ---    243

21.1.6. 回溯算法 ---    243

21.1.7. 最短路径算法 ---   243

21.1.8. 最大子数组算法 ---   243

21.1.9. 最长公共子序算法 ---   243

21.1.10. 最小生成树算法 ---   243

22. 数据结构---    245

22.1.1. 栈(stack)---   245

22.1.2. 队列(queue) ---   245

22.1.3. 链表(Link)---   245

22.1.4. 散列表(Hash Table)---  246

22.1.5. 排序二叉树 ---   246

22.1.5.1. 插入操作---    246

22.1.5.2. 删除操作---    247

22.1.5.3. 查询操作---    248

22.1.6. 红黑树 ---    248

22.1.6.1. 红黑树的特性---    248

22.1.6.1. 左旋 ---248

22.1.6.1. 右旋 ---249

22.1.6.1. 添加 ---250

22.1.6.2. 删除 ---251

22.1.7. B-TREE---    252

22.1.8. 位图 ---    254

23. 加密算法---    255

23.1.1. AES ---    255

23.1.2. RSA---    255

23.1.3. CRC---    256

23.1.4. MD5---    256

13/04/2018 Page 16 of 283

24. 分布式缓存---    257

24.1.1. 缓存雪崩 ---    257

24.1.2. 缓存穿透 ---    257

24.1.3. 缓存预热 ---    257

24.1.4. 缓存更新 ---    257

24.1.5. 缓存降级 ---    257

25. HADOOP ---    259

25.1.1. 概念 ---    259

25.1.2. HDFS ---    259

25.1.2.1. Client---    259

25.1.2.2. NameNode---    259

25.1.2.3. Secondary NameNode ---   259

25.1.2.4. DataNode---    259

25.1.3. MapReduce---   260

25.1.3.1. Client---    260

25.1.3.2. JobTracker ---    260

25.1.3.3. TaskTracker---    261

25.1.3.4. Task ---    .261

25.1.3.5. Reduce Task 执行过程 ---   261

25.1.4. Hadoop MapReduce 作业的生命周期--- 262

1.作业提交与初始化---    262

2.任务调度与监控。---    262

3.任务运行环境准备---    262

4.任务执行  --- 262

5.作业完成。  --- 262

26. SPARK---    263

26.1.1. 概念 ---    263

26.1.2. 核心架构 ---    263

Spark Core  --- 263

Spark SQL  --- 263

Spark Streaming---    263

Mllib  --- 263

GraphX --- 263

26.1.3. 核心组件 ---    264

Cluster Manager-制整个集群,监控 worker ---  264

Worker 节点-负责控制计算节点---   264

Driver: 运行 Application 的 main()函数---  264

Executor:执行器,是为某个 Application 运行在 worker node 上的一个进程   264

26.1.4. SPARK 编程模型---   264

26.1.5. SPARK 计算模型---   265

26.1.6. SPARK 运行流程---   266

1. 构建 Spark Application 的运行环境,启动 SparkContext    267

2. SparkContext 向资源管理器(可以是 Standalone,Mesos,Yarn)申请运行 Executor 资源,并启

StandaloneExecutorbackend,---   267

3. Executor 向 SparkContext 申请 Task ---  267

4. SparkContext 将应用程序分发给 Executor--- 267

5. SparkContext 构建成 DAG 图,将 DAG 图分解成 Stage、将 Taskset 发送给 Task Scheduler,最

后由 Task Scheduler 将 Task 发送给 Executor 运行--- 267

6. Task 在 Executor 上运行,运行完释放所有资源--- 267

26.1.7. SPARK RDD 流程 ---   267

26.1.8. SPARK RDD---   267

1)RDD 的创建方式---    267

2)RDD 的两种操作算子(转换(Transformation)与行动(Action))   268

27. STORM ---    269

13/04/2018 Page 17 of 283

27.1.1. 概念 ---    269

27.1.1. 集群架构 ---    269

27.1.1.1. Nimbus(master-代码分发给 Supervisor) --- 269

27.1.1.2. Supervisor(slave-管理 Worker 进程的启动和终止)    269

27.1.1.3. Worker(具体处理组件逻辑的进程)--- 269

27.1.1.4. Task ---    .270

27.1.1.5. ZooKeeper ---    270

27.1.2. 编程模型(spout->tuple->bolt)--- 270

27.1.2.1. Topology---    270

27.1.2.2. Spout---    270

27.1.2.3. Bolt ---.270

27.1.2.4. Tuple---    270

27.1.2.5. Stream ---    271

27.1.3. Topology 运行---   271

(1). Worker(进程) (2). Executor(线程) (3). Task--- 271

27.1.3.1. Worker(1 个 worker 进程执行的是 1 个 topology 的子集)    .271

27.1.3.2. Executor(executor 是 1 个被 worker 进程启动的单独线程)   271

27.1.3.3. Task(最终运行 spout 或 bolt 中代码的单元)--- 272

27.1.4. Storm Streaming Grouping---  272

27.1.4.1. huffle Grouping---   .273

27.1.4.2. Fields Grouping---   273

27.1.4.3. All grouping :广播---   273

27.1.4.4. Global grouping---   274

27.1.4.5. None grouping :不分组---   274

27.1.4.6. Direct grouping :直接分组 指定分组 --- 274

28. YARN ---    275

28.1.1. 概念 ---    275

28.1.2. ResourceManager ---   275

28.1.3. NodeManager---   275

28.1.4. ApplicationMaster ---   276

28.1.5. YARN 运行流程 ---   277

29. 机器学习---    278

29.1.1. 决策树 ---    278

29.1.2. 随机森林算法 ---   278

29.1.3. 逻辑回归 ---    278

29.1.4. SVM---    278

29.1.5. 朴素贝叶斯 ---   278

29.1.6. K 最近邻算法---   278

29.1.7. K 均值算法---   .278

29.1.8. Adaboost 算法 ---   278

29.1.9. 神经网络 ---    278

29.1.10. 马尔可夫 ---   278

30. 云计算 ---    279

30.1.1. SaaS ---    279

30.1.2. PaaS ---    279

30.1.3. IaaS---    279

30.1.4. Docker---    279

30.1.4.1. 概念 ---279

30.1.4.2. Namespaces---    280

30.1.4.3. 进程(CLONE_NEWPID 实现的进程隔离)--- 281

30.1.4.4. Libnetwork 与网络隔离---   281

30.1.4.5. 资源隔离与 CGroups ---   282

30.1.4.6. 镜像与 UnionFS---   282

30.1.4.7. 存储驱动---    282

13/04/2018 Page 18 of 283

30.1.5. Openstack ---   .283


以上是关于Java目录的主要内容,如果未能解决你的问题,请参考以下文章

请问如何用java在指定目录中 以及子目录 找出同名文件?

java创建目录或文件夹的方法?

java中与根目录平行的目录下的文件如何加载?

java如何查找指定目录下的最新文件

java 怎么获取web根目录?

java web项目中的web根目录怎么设置