本笔记来源于网上比较火的《Java 成神之路》及《Java 核心知识点整理》PDF。
JAVA 核心知识点整理 - 目录
- JVM
- 线程
- JVM 内存区域
- 程序计数器(线程私有)
- 虚拟机栈(线程私有)
- 本地方法区(线程私有)
- 堆(Heap-线程共享) - 运行时数据区
- 方法区/永久代(线程共享)
- JVM 运行时内存
- 新生代
- Eden 区
- ServicorFrom
- ServicorTo
- MinorGC 的过程 (复制 > 清空 > 互换)
- eden、ServicorFrom 复制到 ServicorTo,年龄+1
- 清空 Eden、ServicorFrom
- ServicorTo 和 ServicorFrom 互换
- 老年代
- 永久代
- 新生代
- 垃圾回收算法
- 如何确定垃圾
- 引用计数法
- 可达性分析
- 标记清除算法(Mark-Sweep)
- 复制算法(Copying)
- 标记整理算法(Mark-Compact)
- 分代收集算法
- 新生代与复制算法
- 老年代与标记复制算法
- 如何确定垃圾
- Java 的四种引用类型
- 强引用
- 软引用
- 弱引用
- 虚引用
- GC 分代收集算法 VS 分区收集算法
- 分代收集算法
- 新生代-复制算法
- 老年代-标记整理算法
- 分区收集算法
- 分代收集算法
- GC 垃圾收集器
- Serial 垃圾收集器(单线程、复制算法)
- ParNew 垃圾收集器(Serial+多线程)
- Parallel Scavenge 收集器(多线程复制算法、高效)
- Serial Old 收集器(单线程标记整理算法)
- Parallel Old 收集器(多线程标记整理算法)
- CMS 收集器(多线程标记整理算法)
- 初识标记
- 并发标记
- 重新标记
- 并发清除
- G1 收集器
- JAVA IO/NIO
- 阻塞 IO 模型
- 非阻塞 IO 模型
- 多路复用 IO 模型
- 信号驱动 IO 模型
- 异步 IO 模型
- JAVA IO 包
- JAVA NIO
- NIO 的缓冲区
- NIO 的非阻塞
- Channel
- Buffer
- Selector
- JVM 类加载机制
- 加载
- 验证
- 准备
- 解析
- 符号引用
- 直接引用
- 初始化
- 类构造器
- 类加载器
- 启动类加载器(Bootstrap ClassLoader)
- 扩展类加载器(Extension ClassLoader)
- 应用程序类加载器(Application ClassLoader)
- 双亲委派
- OSGI(动态模型系统)
- 动态改变构造
- 模块化编程与热插拔
- JAVA 集合
- 接口继承关系和实现
- List
- ArrayList(数组)
- Vector(数组、线程同步)
- LinkedList(链表)
- Set
- HashSet(Hash 表)
- TreeSet(二叉树)
- LinkHashSet(HashSet+LinkHashMap)
- Map
- HashMap(数组+链表+红黑树)
- JAVA7 实现
- JAVA8 实现
- ConcurrentHashMap
- Segment 段
- 线程安全(Segment 继承 ReentrantLock 加锁)
- 并行度(默认 16)
- Java8 实现(引入了红黑树)
- HashTable(线程安全)
- TreeMap(可排序)
- LinkHashMap(记录插入顺序)
- HashMap(数组+链表+红黑树)
- Java 多线程并发
- Java 并发知识库
- Java 线程实现/创建方法
- 继承 Thread 类
- 实现 Runnable 接口
- ExecutorService、Callable
、Future 有返回值线程 - 基于线程池的方式
- 四种线程池
- newCachedThreadPool
- newFixedThreadPool
- newScheduledThreadPool
- newSingleThreadExecutor
- 线程生命周期
- 新建状态(NEW)
- 就绪状态(RUNNABLE)
- 运行状态(RUNNING)
- 阻塞状态(BLOCKED)
- 等待阻塞(o.wait > 等待队列)
- 同步阻塞(lock > 锁池)
- 其他阻塞(sleep/join)
- 线程死亡(DEAD)
- 正常结束
- 异常结束
- 调用 stop
- 终止线程的 4 中方式
- 正常运行结束
- 使用退出标志退出线程
- Interrupt 方法结束线程
- stop 方法终止线程(线程不安全)
- sleep 与 wait 的区别
- start 与 run 的区别
- Java 后台线程
- Java 锁
- 乐观锁
- 悲观锁
- 自旋锁
- 自旋锁的优缺点
- 自旋锁的时间阈值(1.6 引入了适应性自旋锁)
- 自旋锁的开发
- Synchronized 同步锁
- Synchronized 作用范围
- Synchronized 核心组件
- Synchronized 实现
- ReentrantLock
- Lock 接口的主要方法
- 非公平锁
- 公平锁
- ReentrantLock 与 Synchronized
- ReentrantLock 的实现
- Condition 类与 Object 锁方法的区别
- tryLock 、Lock、lockInterruptibly 的区别
- Semaphore 信号量
- 实现互斥锁
- 代码实现
- Semaphore 与 ReentrantLock
- AutomicInteger
- 可重入锁(递归锁)
- 公平锁与非公平锁
- 公平锁(Fair)
- 非公平锁(Nofair)
- ReadWriteLock 读写锁
- 读锁
- 写锁
- 共享锁和独占锁
- 独占锁
- 共享锁
- 重量级锁(Mutex Lock)
- 轻量级锁
- 锁升级
- 偏向锁
- 分段锁
- 锁优化
- 减少锁持有时间
- 减小锁粒度
- 锁分离
- 锁粗化
- 锁消除
- 线程的基本方法
- 线程等待(wait)
- 线程睡眠(sleep)
- 线程让步(yield)
- 线程中断(interrupt)
- join 等待其他线程终止
- 为什么使用 join() 方法
- 线程唤醒 - notify
- 其他方法
- 线程上下文切换
- 进程
- 上下文
- 寄存器
- 程序计数器
- PCB-切换锁
- 上下文切换的活动
- 引起线程上下文切换的原因
- 同步锁与死锁
- 同步锁
- 死锁
- 线程池原理
- 线程复用
- 线程池的组成
- 拒绝策略
- java 线程池工作过程
- JAVA 阻塞队列原理
- 阻塞队列的主要方法
- 插入操作
- 获取数据操作
- Java 中的阻塞队列
- ArrayBlockingQueue(公平、非公平)
- LinkedBlockingQueue(两个独立锁提高并发)
- PriorityBlockingQueue(compareTo 排序实现优先)
- DelayQueue(缓存失效、定时任务)
- SynchronousQueue(不存储数据、可用于传递数据)
- LinkedTransferQueue
- LinkedBlockingQueue
- 阻塞队列的主要方法
- CyclicBarrier、CountDownLatch、Semaphore 的用法
- CountDownLatch(线程计数器)
- CyclicBarrier(回环栅栏-等待至 barrier 状态再全部同时执行)
- Semaphore(信号量-控制同时访问的线程个数)
- volatile 关键字的作用
- 变量可见性
- 禁止重排序
- 比 Synchronized 更轻量级的同步锁
- 适用场景
- 如何在两个线程之间共享数据
- 将数据抽象成一个类,并将数据的操作作为这个类的方法
- Runnable 对象作为一个类的内部类
- ThreadLocal 作用(线程本地存储)
- ThreadLocalMap(线程的一个属性)
- 使用场景
- synchronized 和 ReentrantLock 的区别
- 共同点
- 不同点
- ConcurrentHashMap 并发
- 减小锁粒度
- ConcurrentHashMap 分段锁
- ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成
- Java 中用到的线程调度
- 抢占式调度
- 协同式调度
- JVM 的线程调度实现(抢占式调度)
- 线程让出 CPU 的情况
- 进程调度算法
- 优先调度算法
- 高优先权优先调度算法
- 基于时间片的轮转调度算法
- 什么是 CAS(比较并交换-乐观锁机制-锁自旋)
- 概念及特性
- 原子包 java.util.concurrent.atomic(锁自旋)
- ABA 问题
- 什么是 AQS(抽象的队列同步器)
- Exclusive 独占资源- ReentrantLock
- Share 共享资源 -Semaphore、CountDownLatch
- 同步器的实现是 ABS 核心(state 资源状态计数)
- ReentrantReadWriteLock 实现独占和共享两种方法
- JAVA 基础
- JAVA 异常分类及处理
- 概念
- 异常分类
- Error
- Exception
- 异常的处理方式
- 不处理,抛出给调用者(throw、throws)
- try catch 捕获异常
- throw 和 throws 的区别
- 位置不同
- 功能不同
- Java 反射
- 动态语言
- 反射机制概念(运行状态中知道类所有的属性和方法)
- 反射的应用场合
- 编译时类型和运行时类型
- 编译时类型无法获取具体方法
- Java 反射 API
- 反射 API 用来生成 JVM 中的类、接口或者对象的信息
- 反射使用步骤(获取 Class 对象、调用对象方法)
- 获取 Class 对象的 3 种方法
- 调用某个对象的 getClass()方法
- 调用某个类的 class 属性来获取该类对应的 Class 对象
- 使用 Class 类中的 forName() 静态方法(最安全、性能最好)
- 创建对象的两种方法
- Class 对象的 newInstance()
- 调用 Constructor 对象的 newInstance()
- JAVA 注解
- 概念
- 四种标准元注解
- @Target 修饰的对象范围
- @Rentention 定义被保留的时间长短
- @Document 描述 javadoc
- @Inherited 阐述某个被标注的类型是被继承的
- 注解处理器
- JAVA 内部类
- 静态内部类
- 成员内部类
- 局部内部类(定义在方法中的类)
- 匿名内部类(要继承一个父类或者实现一个接口、直接使用 new 来生成一个对象的引用)
- JAVA 泛型
- 泛型方法(
) - 泛型类 (
) - 类型通配符 ?
- 类型擦除
- 泛型方法(
- JAVA 序列化(创建可复用的 Java 对象)
- 持久化对象及其状态到内存或者硬盘
- 序列化对象 以字节数组保存-静态成员不保存
- 序列化用户远程对象传输
- Serializable 实现序列化
- ObjectOutputStream 和 ObjectInputStream 对对象进行序列化和反序列化
- writeObject 和 readObject 自定义序列化策略
- 序列化 ID
- 序列化并不保存静态变量
- 序列化子父类说明
- Transient 关键字阻止该变量被序列化到文件中
- JAVA 复制
- 直接赋值复制
- 浅复制(复制引用但不复制引用的对象)
- 深复制(复制对象和其应用对象)
- 序列化(深 clone 实现)
- JAVA 异常分类及处理
- Spring 原理
- Spring 特性
- 轻量级
- 控制反转
- 面向切面
- 容器
- 框架集合
- Spring 核心组件
- Spring 常用模块
- Spring 主要包
- Spring 常用注解
- Spring 第三方结合
- Spring IOC 原理
- 概念
- Spring 容器高层视图
- IOC 容器实现
- BeanFactory-框架基础设施
- BeanDefinitionRegistry 注册表
- BeanFactory 顶层接口
- ListableBeanFactory
- HibernarchicalBeanFactory 父子级联
- ConfigurableBeanFactory
- AutowireCapableBeanFacotry 自动装配
- SingletonBeanRegistry 运行期间注册单例 Bean
- 依赖日志框架
- ApplicationContext 面向开发应用
- WebApplication 体系架构
- BeanFactory-框架基础设施
- Spring Bean 作用域
- singleton :单例模式(多线程下不安全)
- prototype :原型模式,每次使用时创建
- request : 一次 request 一个实例
- session
- global session
- Spring Bean 生命周期
- 实例化
- IOC 依赖注入
- setBeanName 实现
- BeanFactoryAware 实现
- ApplicationContextAware 实现
- postProcessBeforeInitialization 接口实现-初始化预处理
- init-method
- postProcessAfterInitialization
- Destroy 过期自动清理阶段
- destroy-method 自配置清理
- Spirng 依赖注入四种方式
- 构造器注入
- setter 方法注入
- 静态工厂注入
- 实例工厂
- 五种不同方式的自动装配
- Spring AOP 原理
- 概念
- AOP 核心概念
- AOP 两种代理方式
- JDK 动态接口代理
- CGLib 动态代理
- 实现原理
- Spring MVC 原理
- SpringMVC 流程
- Http 请求到 DispatcherServlet
- HandlerMapping 寻找处理器
- 调用处理器 Controller
- Controller 调用业务逻辑处理后,返回 ModelAndView
- DispatcherServlet 查询 ModelAndView
- ModelAndView 反馈浏览器 Http
- SpringMVC 常用注解
- SpringMVC 流程
- Spring Boot 原理
- 创建独立的 Spring 应用程序
- 嵌入的 Tomcat,无需部署 War 文件
- 简化 Maven 配置
- 自动配置 spirng
- 提供生产就绪型功能,如指标、健康检查和外部配置
- 绝对没有代码生成和对 xml 没有要求配置
- JPA 原理
- 事务
- 本地事务
- 分布式事务
- 两阶段提交
- 准备阶段
- 提交阶段
- Mybatis 缓存
- Mybatis 的一级缓存原理(sqlsession 级别)
- 二级缓存原理(mapper 基本)
- 具体使用需要配置
- Tomcat 架构
- Spring 特性
- 微服务
- 服务注册与发现
- 客户端注册(zookeeper)
- 第三方注册(独立的服务 registrar)
- 客户端发现
- 服务端发现
- consul
- Eureka
- SmartStack
- Etcd
- API 网关
- 请求转发
- 响应合并
- 协议转换
- 数据转换
- 安全认证
- 配置中心
- zookeeper 配置中心
- 配置中心数据分类
- 事件调度(kafka)
- 服务跟踪(starter-sleuth)
- 服务熔断(hystrix)
- hystrix 断路器机制
- API 管理
- 服务注册与发现
- Netty 和 RPC
- Netty 原理
- Netty 高性能
- 多路复用通讯方式
- 异步通讯 NIO
- 零拷贝(Direct Buffers 使用堆外直接内存)
- 内存池(基于内存池的缓冲区重用机制)
- 高校的 Reactor 线程模型
- Reactor 单线程模型
- Reactor 多线程模型
- 主从 Reactor 多线程模型
- 无锁设计、线程绑定
- 高性能的序列化框架
- 小包封大包,防止网络阻塞
- 软中断 hash 值和 cpu 绑定
- Netty RPC 实现
- 概念
- 关键技术
- 核心流程
- 消息编解码
- 总数据结构(接口名称+方法名+参数类型和参数值+超时时间+requestID)
- 序列化
- 通讯过程
- 核心问题(线程暂停、消息乱序)
- 通讯流程
- requestID 生成 AtomicLong
- 存放回调对象 callback 到全局 ConcurrentHashMap
- synchronized 获取回调对象 callback 的锁并自旋 wait
- 监听消息的线程收到消息,找到 calllback 上的锁并唤醒
- RMI 实现方式
- 实现步骤
- Protoclol Buffer
- 特点
- Thrift
- 网络
- 日志
- Zookeeper
- Kafka
- RabbitMQ
- Hbase
- MongoDB
- Cassandra
- 24 种设计模式
- 负载均衡
- 数据库
- 一致性算法
- JAVA 算法
- 二分查找
- 冒泡排序算法
- 插入排序算法
- 快速排序算法
- 希尔排序算法
- 归并排序算法
- 桶排序算法
- 基数排序算法
- 剪枝算法
- 回溯算法
- 最短路径算法
- 最大子数组算法
- 最长公共子序算法
- 最小生成树算法
- 数据结构
- 栈(stack)
- 队列(queue)
- 链表(link)
- 散列表(hash table)
- 排序二叉树
- 红黑树
- B-Tree
- 位图
- 加密算法
- AES
- RSA
- CRC
- MD5
- 分布式缓存
- 缓存雪崩
- 缓存穿透
- 缓存预热
- 缓存更新
- 缓存降级
- Hadoop
- Spark
- Storm
- Yarn
- 机器学习
- 云计算