Java技术架构
2024-09-03 11:13:57 0 举报
AI智能生成
Java技术架构是一种广泛应用于企业级应用开发的软件架构。它以Java编程语言为核心,结合了多种开源技术和工具,如SpringMvc、SpringCloud框架等。这种架构具有良好的灵活性、可扩展性和可维护性,可以支持各种复杂的业务需求。此外,Java技术架构还具备强大的安全机制,可以有效地保护应用程序和数据。
作者其他创作
大纲/内容
淘宝电商微朗务架构变迁史
京东电商微务架构变迁史
微服务架构变迁史
核心配置
部署方式及热部署
Web开发模板引擎Thymeleaf7及Freemarker
启动过程
自动装配
Spring Boot
服务注册与发现
服务心跳与下线
服务健康检查
集群架构
集群节点间服务数据同步
AP架构详解
集群脑烈问题及解决方案
CP架构详解
集群架构CAP原理
防止读写并发冲突CopyOnWrite设计思想
异步任务及内存队列有效提升系统并发
异步批量同步集群节点数据有效提升系统性能
高并发设计
阿里云超大规模微服务注册中心设计架构
高可用分布式配置中心
多环境切换及配置共享
运行时配置动态刷新及服务热加载
分布式配置中心
Nacos
Ribbon服务发现及客户端缓存
轮询策略
随机策略
最小并发策略
响应时间加权策略
重试策略
权重策略
负载均衡策略
自定义扩展Ribbon客户端负载均衡算法
Ribbon框架源码设计缺陷及优化
Ribbon
Feign方法参数拼接Http请求源码
Feign整合Ribbon源码
Feign
QPS限流
线程数限流
限流类型
限流模式
请求快速失败
请求预热
请求排队
限流效果
计数器部限流
滑动时间窗口限流
令牌桶限流
漏桶限流
限流算法
限流
接口平均相应时间超时熔断
接口异常比例过高熔断
接口异常数过多熔断
服务断路器
服务降级注解自动化配置
熔断降级
秒杀场景指定热点参数限流
热点限流规则
系统级负载Load限流
系统级平均响应时间限流
系统级线程数限流
系统级QPS限流
系统CPU使用率限流
系统负载限流
系统黑白名单授权规则限流
Sentinel
动态路由
统一限流容断
统—缓存
统一授权认证
统一性能监控
统一灰度发布
Gateway
全局事务注册
分支事务客户端注册
分支事务客户端全局锁冲突自旋
分支事务服务端全局锁
全局事务提交
全局事务回滚
分支事务第二阶段异步提交
分支事务第二阶段生成反向Sq执行回滚
Seata
安全之Oauth2协议
安全之传统Session的认证与授权
安全之Token机制的认证授权
JWT安全认证
API安全机制
Security
Spring Cloud Alibaba
Eureka服务注册与发现
Ribbon客户端负载裁均衡
Fegin声明式务调用
Hystrix实现服务限流,降级,熔断
Hystrix实现自定义接口降级,监控数据及监控数据聚合
Zuu统一网关详解,服务路由,过滤器使用
分布式配置中心Config
分布式链路跟踪Sleuth
Spring Cloud Netflix
镜像,仓库,容器
搭建
DockerFile
DockerCompose集成式应用组合
Docker服务编排
Docker
容器管理
集群环境搭建
Kubernetes
虚拟容器
微服务
淘宝电商后端架构变迁史
京东电商后端架构变迁史
业务中台
技术中台
数据中台
阿里小前台大中台架构
电商核心中台架构整体设计
详解电商平台会员模块介绍、配置详解
解密电商平台SSO单点跨域详解
详解电商平台会员业务与技术实现
解密电商平台会员数据库分库分表
会员服务
详解电商平台商品模块介绍、配置详解
详解电商平台商品模块业务与技术实现
解密电商平台商品详细页静态化与缓存
商品服务
详解电商平台订单模块介绍、配置详解
详解电商平台订单业务与技术实现
解密订单分布式事务、幂等性、重复消费问题
秒杀库存分布式锁实战
订单服务
支付宝支付功能实战
微信支付功能实战
商家对账功能总详解
支付服务
优惠券功能设计与实现
满减优患活动设计与实现
团购优患活动设计与实现
营销服务
电商管理后台模块详解
后台系统权限、盗源、账号、角色关系及技术实现
后台服务
基于Spring Cloud微服务架构拆分
Mysq实现
Redis实现
Zookeeper实现
分布式锁
Atomic框架
基于2PC/3PC实现
Rabbitmq
Rocketmq
基于消息队列实现
Tcc-transaction框架
Bytetcc框架
基于蚂蚁金服TCC方案实现
基于阿里巴巴Seata方案实现
分布式事务
Quartzt框架
Xx-job框架
TBSchedule框架
分布式调度中心
阿里巴巴Nacos框架
Spring Cloud Config
Apollot框架
雪花算法
分布式全局序列号
Spring Session实现
分布式Session
ShardingSphere实战
海量数据分库分表
分布式解决方案
亿级流量商品详情页Openresty多级缓存架构方案实战
缓存穿透、缓存失效、缓存雪崩及热点缓存重建优化及实战
Redis与JVM多级缓存架构
消息中间件流量削峰与异步处理
Nginx限流
计数器
滑动时间窗口
令牌桶、漏桶算法
Sentinel/Hystrix限流
限流策略实现
大促高峰服务降级实现
系统安全防刷策略实现
高并发场是JVM GC调优实战
高并发场景Mysq调优实战
高并发场景Tomcat调优实战
高并发场景Nginx调优实战
性能调优实战
监控系统Prometheus使用详解
监控报警系统Grafana图表配置及异常报警
Prometheus+Grafana监控电商系统各项性能指标
性能监控
高并发秒杀系统实现
电商平台技术解决方案
亿级流量电商平台
分布示调用链简介与发展史
调用链平台概要设计
Javassist、字节码插桩、JavaAGENT
采集点为:Dubbo、Jdbc Driver、Spring
采集点为:Tomcat、Http、Redis
埋点采集
Classloader深入加载机制
深入分析调用链中Threadlocal、Threadpool应用
分布式环境部署与问题排查
分布式调用链平台
实战
体系结构
客户端与服务端快速搭建
核心命令
企业应用最佳实践
Git
生命周期
插件体系
pom配置体系
私服搭建
Maven
持续集成
Jenkins
原理、启动、整体架构
常用命令
用户与权限
Shell脚本编程
Linux
工具
开拓技术视野,提高面试竞争力
360度规划您的职业生涯
360度讲解面试中常见问题、礼仪、细节、技巧
程序员修炼之道之简历技术优化、项目优化
百度
阿里巴巴
美团
京东
精讲常见BAT面试题目
消息中间件
Java并发
数据库
JVM
Spring
MyBatis
面试专题
算法复杂性分析
线性表、链表数据结构
队列、栈结数据结构
基础排序算法
快排与归并排序
二分搜索、哈希表
并查集算法
树,基本概念,二叉树遍历
图、深度优先遍历、广度优先遍历
最小生成树、最短路径
布隆过滤器与位图
算法与数据结构
项目架构与技术点
区块链原理
共识机制
工作量证明原理
挖矿算法
区块链整体结构设计与实现
对称加密
哈希(hash)加密
非对称加密
数字签名
密码学
钱包结构
钱包转账
钱包余额
比特币钱包的设计与实现
比特币交易UTXO
比特币余额
比特币交易的设计与实现
比特币
区块链P2P网络
网络节点发现
网络节点通讯
区块广播
交易广播
P2P去中心化网络设计与实现
区块链技术(Java版)
CentOS7操作系统介绍
Idea及插件介绍
版本控制软件使用
第一阶段-开发环境构建
Hadoop概述
Hadoop资源调度框架Yarn介绍
分布式文件系统HDFS
分布式框架MapReduce
第二阶段-HADOOP核心
数据采集器
数据仓库与OLAP
NoSql数据库
Zookeeper与分布式一致性算法
中间件
第三阶段-大数据通用生态器组件
Sparkt核心
SparkSQL
实时计算
协同滤波实现推荐系统
第四阶段-Spark及生态圈
Spark下的聚类与分类算法
Spark下的图计算
第五阶段-基于spark的数据挖掘算法
大数据技术
用一台电脑搭建一个机器人开发环境
Python编程入门和应用范例
ROS客户端库和应用范例
开发你的第一个机器人应用
如何协调一个机器人内部的行为
计算机视觉基础与应用
机器人建图和导航
开发一个智能安保机器人
神经网络基础与应用
基于ROS开发多机器人应用
群体智能
人工智能前沿探讨类脑计算
人工智能前沿深讨深度强化学习(DRL)
人工智能技术
拓展
初代版本
运行环境JRE+开发环境JDK
纯解释运行,使用外挂JIT,性能比较差,运行速度慢
JDK 1.0(1996-01-23)
JIT
jar包
JDBC
内部类(Inner Class)
Java Beans
RMI(Remote Method Invocation)
反射Reflection
JDK 1.1(1997-02-19)
J2SE(面向桌面应用开发)
J2EE(面向企业级开发)
J2ME(面向移动终端开发)
关键字strictfp
集合框架
JFC
Applet
JDK 1.2(1998-12-08)
数学运算
Timer API
Java Sound API
CORBA IIOP实现RMI的通信协议
Java 2D新特性
JAR文件索引
Java类库
Hotspot
JDK 1.3(2000-05-08)
Java框架:Struts、WebWork、Hibernate、Spring
XML处理
Java打印服务
日志API、参数API、JDBC 3.0 API、image I/O API
Java Web Start
链式异常处理
断言机制
支持IPV6
正则表达
NIO
JDK 1.4(2002-02-13)【成熟】
Sun将JDK1.5改为Java 5.0,J2EE、J2SE和J2ME改为Java SE、Java ME、Java EE
泛型
增强for循环
自动装箱与拆箱
类安全枚举 (Enum)
可变参数(Varargs)
静态导入(import static)
元数据注解(Annotation)
内省(Introspect)
内存模型(JMM)
并发包(java.util.concurrent)
JDK 5(2004-09-30)
命名方式变动
脚本语言支持
编译API和微型HTTP服务器API
锁与同步
垃圾收集
类加载
JDBC 4.0
Java Compiler
可插拔注解
Native PKI(公钥基础设)
Java GSS (通用安全服务)
Kerberos ( 一种安全认证的系统)
LDAP
Web Services (web服务即xml传输)
JTable的排序和过滤
嵌入式数据库 Derby
JDK 6(2006-12-11)
二进制整数
switch 语句支持 String 字符串
泛型对象类型推断 - 调用泛型类的构造方法时,可以省去泛型参数,编译器会自动判断
catch 多个异常捕获 - 多个异常通过使用 “|”操作符分隔
支持动态语言
改进泛型类型可变参数
语法上支持集合而不一定是数组
新增获取环境信息的工具方法
boolean类型反转:空指针安全,参与位运算
两个char之间的equals方法
安全的加减乘除
Java集合(Collections)增强 - map集合支持并发请求
引入Java NIO.2开发包
数值可以加下划线用作分隔符
null值得自动处理
简化了可变参数方法的调用
提供GI收集器
JDK 7(2011-07-28)
历史版本
LTS(Long-Term Support 长期支持):JDK8、JDK11、 JDK17、JDK21
Lambda表达式
接口默认方法(允许在接口中定义默认方法,从而为接口添加新的方法而不需要修改实现该接口的现有类)
函数式接口
StreamAPI(支持链式操作、过滤、映射和减少操作,使得集合处理更加简洁和高效)
新日期和时间 API(如LocalDate、LocalDateTime等)
Nashorn JavaScript 引擎(允许在 JVM 上执行 JavaScript 代码,提升了与 JavaScript 的互操作性)
Optional 类(避免空指针异常,提供了一种更优雅的处理可能为空的值的方法)
Metaspace(将永久代(PermGen)替换为元空间(Metaspace),改善了内存管理)
Compact Profiles (JEP 161)精简配置(允许创建包含 JDK一部分功能精简配置,从而在资源受限的设备上运行 Java 应用。 提升 Java 的功能和性能,简化编程过程,并提供更多现代化编程的支持)
TLS 1.1和TLS 1.2默认启用
KeyStore增强功能
SHA-224消息摘要
协议转换和约束委派的Kerberos 5
全新的JavaFX
Java工具的操作增强
并行阵列排序
Java XML技术增强功能
JDK 8(2014-03-18)
模块化系统(平台级modularity(原名:Jigsaw))
jShell 命令(Java 的 REPL 工具)
多版本兼容 jar 包
接口的私有方法
UnderScore(下划线)使用的限制
改进的Java doc
语法改进
底层结构:String 存储结构变更
集合工厂方法:快速创建只读集合
增强的 Stream API
全新的 HTTP 客户端 API
HTTP/2
处理进程(引入了 java.lang.ProcessHandle 类,提供了对操作系统进程的更细粒度控制)
JDK9(2017-09-22)
局部变量类型推断 var(通过var关键字实现局部变量类型推断,使语言变弱类型语言、JVM的G1垃圾回收由单线程改成多线程并行处理,降低G1停顿时间)
删除工具 javah(从JDK中移除了 javah 工具,使用 javac -h 代替)
垃圾收集器接口(引入一个干净的垃圾收集器(GC)接口,改善不同垃圾收集器的源码隔离性)
G1 引入并行 Full GC
将 JDK 的多个代码仓库合并到一个储存库中
应用类数据共享
线程局部管控
基于 Java 的 JIT 编译器
根证书(开源 Java SE Root CA 程序中的根证书)
基于时间的版本发布模式(“Feature releases” 版本将包含新特性,“Update releases” 版本仅修复 Bug)
JDK10(2018-03-20)
HttpClient增强:提供了同步调用和异步调用实现。JDK对http对调用支持已经足够强,以前apache提供的httpComponents基本可以去除了
ZGC(试验中)
完全支持Linux容器:JVM可以识别当前是否在容器中运行,能接受容器设置的内存限制和CPU限制
Flight Recorder:一个低开销的事件记录系统,用于监控和诊断 JVM 的性能问题
Epsilon 垃圾回收器(试验中):为某些特定的应用场景提供更好的性能
改进的 AArch64(ARM64)支持:对 ARM64 架构提供了更好的支持,使得 Java 应用程序可以在更多的设备上运行
移除 Nashorn 引擎和 CORBA 模块:减少 JDK 的体积和复杂性
TLS 1.3支持
弃用 Pack200 工具和 API
JDK11(2018-09-25)
switch表达式语法扩展
G1收集器优化
新增Shenandoah GC垃圾回收算法
JDK12(2019-03-19)
ZGC优化
释放内存还给操作系统
socket底层实现引入NIO
优化字符串拼接
优化Socket API
文本块(预览语言功能)
动态CDS归档(Dynamic CDS Archiving)
支持Unicode 12.1
JDK13(2019-09-17)
删除CMS、弃用 ParallelScavenge+SerialOld GC组合;将zgc 垃圾回收器移植到macOS 和 windows 平台
instanceof扩展
NullPointerException打印信息增强,定位错误
G1的NUMA内存分配优化
打包工具 (Incubator)
JDK14(2020-03-17)
RMI Actiation被标记为Deprecate,在JDK17中删除
EdDSA椭圆曲线签名算法
JEP 384 Records:引入Record类型,解决定义大量get/set方法问题,可一定程度替代lomobok
移除Nashorn JavaScipt引擎
JDK15(2020-09-15)
提供用于打包独立的Java应用程序的jpackage工具
将JDK移植到Windows/AArch64平台
提供了 C++ 14语言特性
内存管理的提升
JDK16(2021-03-16)
强封装JDK的内部API
删除远程方法调用 (RMI) 激活机制,同时保留 RMI 的其余部分
删除实验性 AOT 和 JIT 编译器
将 JDK 移植到 MacOS/AArch64 以响应 Apple 将其 Macintosh 计算机从 x64 转换到 AArch64 的计划
弃用并删除 Applet API(JDK9弃用但未删除)
Switch模式匹配(预览)
恢复始终严格的浮点语义
增强型伪随机数发生器
新的 macOS 渲染管道、macOS/AArch64 端口
密封类
弃用即将删除安全管理器
外部函数和内存 API(孵化器)
Vector API(第二次进行特性孵化)
特定于上下文的反序列化过滤器
JDK17(2021-09-14)
Javadoc中支持代码片段:可以使用@snippet来生成注释,且可以高亮某个代码片段
默认UTF-8字符编码
简单的Web服务器
互联网地址解析 SPI:为主机地址和域名地址解析定义一个 SPI,以便 java.net.InetAddress 可使用平台内置解析器以外的解析器
JDK18(2022-03-22)
Record记录模式(预览)
Linux/RISC-V 端口
外部函数和内存 API(预览版)
虚拟线程(预览)
Vector API(第四孵化器)
开关的模式匹配(第三次预览)
结构化并发(孵化器)
JDK19(2022-09-20)
Scoped Values范围值(孵化器)
Record记录模式(第二次预览)
开关的模式匹配(第四次预览)
外部函数和内存 API(第二预览版)
虚拟线程(第二预览版)
结构化并发(第二个孵化器)
Vector API(第五孵化器)
JDK20(2023-03-21)
字符串模板(预览)
有序集合
世代ZGC
记录模式
开关的模式匹配
外部函数和内存 API(第三次预览版)
未命名模式和变量(预览)
虚拟线程
未命名类和实例主要方法(预览)
Vector API(第六个孵化器)
范围值(预览)
弃用 Windows 32 位 x86 端口以进行删除
准备禁止动态加载代理
密钥封装机制API
结构化并发(预览版)
JDK21(2023-09-19)
G1 的区域固定
super(…) 之前的语句(预览)
外部函数和内存 API
未命名变量和模式
类文件 API(预览版)
启动多文件源代码程序
字符串模板(第二次预览)
Vector API(第七个孵化器)
流收集器(预览)
结构化并发(第二预览版)
隐式声明的类和实例主要方法(第二预览版)
范围值(第二次预览版)
JDK22(2024-03-20)
JDK版本特性
开闭、单一职责及里氏菩换原则
依赖倒置、接口隔离、合成复用原则
迪米特法则
设计原则
原理:在类内部实现对自身实例唯一性和对此实例全局访问,此类会将构造函数设为私有,防止外部直接实例化,并提供一个静态方法或属性作为全局访问点
优:资源控制、全局访问、线程安全缺:违反单一职责原则、扩展困难、滥用问题
频繁创建和销毁的对象(若对象创建和销毁成本较高,且在程序运行期间需要频繁访问)
控制资源访问(如数据库连接、日志对象、配置管理器等)
工具类(如缓存、对话框、注册表设置等,简化代码)
适用场景
饿汉式(静态内部类)
懒汉式(线程安全)
枚举单例(推荐)(天然支持序列化机制,防止反射攻击,同时保证线程安全)
实现
单例(Singleton)
原理:一个抽象工厂类定义了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化延迟到子类进行
抽象工厂:定义一个用于创建对象的接口,但让子类决定实例化哪一个类
具体工厂:实现抽象工厂的接口,负责创建具体产品
抽象产品:定义了所有产品类的公共接口
具体产品:实现了抽象产品接口,是具体工厂创建的对象
核心组件
优:封装性、解耦、扩展性缺:增加系统复杂度、违反开闭原则
当一个类不知道它所必须创建的对象的类时
当一个类希望由它的子类来指定它所创建的对象时
类将创建对象的职责委托给多个帮助子类中某一个,且希望将哪一个帮助子类是代理者这一信息局部化
工厂方法(Factory Method)
原理:提供了一种接口,用于创建一系列相关的或相互依赖的对象,而无需指定它们具体的类
抽象工厂:定义创建产品族的接口
具体工厂:实现抽象工厂接口,创建并返回具体产品
抽象产品:定义产品对象的接口
具体产品:实现抽象产品接口,是具体工厂创建的对象
优:封装性、解耦、解耦、保证一致性缺:增加系统复杂度、违反开闭原则
当一个系统需要独立于它的产品创建、组合和表示时
当一个系统要由多个产品系列中的一个来配置时
当需要创建的产品具有多个变体,且这些变体是相互依赖的
抽象工厂(Abstract Factory)
原理:将构建过程与表示分离,使得同样的构建过程可以创建不同的表示
抽象建造者:定义一个用于创建产品对象的接口
具体建造者:实现抽象建造者接口,负责构建并组装产品的各个部分
指挥者:调用建造者对象中的方法,构造一个完整的产品对象
产品:最终被创建的复杂对象
优:封装性、灵活性、扩展性缺:增加系统复杂度、违反开闭原则
当创建复杂对象的算法应该独立于组成该对象的部件以及它们的装配方式时
当构造过程必须允许被构造的对象有不同的表示时
当对象的创建需要经过很多步骤,而且这些步骤可以有不同的组合时
建造者(Builder)
原理:使用已有的实例作为原型,通过复制该原型对象来创建新的对象,而不是通过实例化类来创建对象
抽象原型:定义一个用于克隆的接口
具体原型:实现抽象原型接口,提供克隆自身的具体实现
优:性能高、逃避构造函数的约束、资源优化缺:逃避构造函数的约束、深拷贝与浅拷贝的问题
创建新对象成本较大(如初始化需要占用较长的时间,占用太多的CPU资源或网络资源)
需要动态地增减产品族中的产品时
当一个类的实例只能有几个不同状态组合中的一种时
原型(Prototype)
创建型
原理:将一个类的接口转换成客户希望的另一个接口,使原本因接口不兼容而不能一起工作的那些类可一起工作
目标:客户所期待的接口,适配器将被调整以符合这个接口
适配者:需要被适配的类,它拥有客户不期望的接口
适配器:适配器持有适配者的引用,将适配者的接口转换为目标接口
优:提高了类的复用性、增强了系统的灵活性缺:过多使用适配器会使系统变得复杂、适配器模式本身并不符合“开闭原则”
当你需要复用一些现存的类,但是接口又与你的系统不兼容时
当你想要创建一个可以复用的类,该类可以与那些接口可能不一定兼容的类协同工作时
对象适配器可以适配它的父类接口
适配器(Adapter)
原理:将抽象部分与其实现部分分离,使它们都可以独立地变化
抽象(Abstraction):定义使用实现部分的接口
细化抽象(Refined Abstraction):扩展抽象,提供一个接口以访问实现部分的高级功能
实现者(Implementor):定义实现部分的接口
具体实现者(Concrete Implementor):实现实现者接口,提供具体的实现
优:分离抽象和实现、减少子类数目、易于维护和扩展缺:增加理解难度、潜在的性能开销
当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时
当你不希望在抽象和它的实现部分之间有一个固定的绑定关系时
当抽象和实现应该可以独立地扩展时
桥接(Bridge)
原理:将对象组合成树状结构来表示“部分-整体”的层次结构
Component(组件):定义了包含所有对象的公共接口,无论是叶子对象还是复合对象
Leaf(叶子):实现Component接口,代表树结构中的叶节点
Composite(复合):实现Component接口,但包含其他Component对象集合,代表树结构中分支节点
优:高层模块无须关心下层模块的具体实现、易于增加新的组件、易于实现树形结构缺:设计复杂度增加、客户端可能需要处理空指针异常
想表示对象的部分-整体层次结构时
希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时
组合(Composite)
原理:允许在不修改原类代码的情况下动态地给对象添加新的功能
Component(组件):定义了一个对象接口,可以给这些对象动态地添加职责
ConcreteComponent(具体组件):定义了具体的组件对象
Decorator(装饰器):持有Component类型的引用,并定义了一个与Component接口一致的接口
ConcreteDecorator(具体装饰器):负责给Component对象添加职责
优:扩展性好、符合开闭原则、替代继承缺:产生很多小类、调试困难
当需要在运行时给一个对象添加额外的功能,或者动态地增加职责时
当不能采用生成子类的方法进行扩充时
需要增加由一些基本功能的排列组合而产生的非常强大的功能时
装饰器(Decorator)
原理:提供了一个统一的接口,用来访问子系统中的一群接口
Facade(外观):提供了一个简单的接口,用于访问子系统中的一群接口
Subsystems(子系统):子系统可以由任何数量的对象组成,每个子系统负责一部分的业务逻辑
优:降低耦合、简化使用、更好的分层缺:不符合开闭原则、可能增加系统复杂度
当一个系统有多个子系统,且这些子系统相对独立,但需要对外提供统一的接口时
当需要为一个复杂子系统提供一个简单接口时
当构建层次化结构的系统时,使用外观模式定义系统中每一层的入口点
外观(Facade)
原理:通过共享尽可能多的数据来支持大量细粒度的对象
Flyweight(享元):存储内部状态,这部分状态是不变的,可以共享
UnsharedConcreteFlyweight(未共享的具体享元):实现享元接口,可能包含外部状态
FlyweightFactory(享元工厂):管理享元对象的创建和获取,确保相同的享元只被创建一次
优:节省内存(共享相同对象)、提高性能(减少了对象的创建)缺:增加复杂性(为了共享对象,需将状态分内部和外部状态)、读取外部状态(导致运行时间稍微变长)
当系统中有大量相似对象时
当对象的大多数状态可以外部化时
当使用少量的共享对象可以替代大量对象时
当对象的创建和销毁成本较高时
享元(Flyweight)
原理:为其他对象提供一个代理以控制对这个对象的访问
Subject(主题):定义了代理和真实主题共同的接口
RealSubject(真实主题):定义了代理所代表的真实对象
Proxy(代理):包含对真实主题的引用,以便在代理自身处理请求时,它可以将请求转给真实主题
优:职责分离解耦、控制访问(如权限检查)、智能引用(如懒加载)、远程代理(如Feign、Dubbo)缺:性能开销、实现复杂
当需要控制对一个对象的访问时
当需要为远程对象创建一个本地代理时
当需要创建一个对象的成本很高,希望通过一个轻量级的代理来代替时
代理(Proxy)
结构型
原理:使多个对象有机会处理请求,避免请求发送者和接收者之间耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
Handler(处理器):定义了一个处理请求的接口,包含一个后继处理器的引用
ConcreteHandler(具体处理器):实现Handler接口,包含具体的处理逻辑。如果可处理该请求,则处理;否则将请求传给后继处理器
优:降低耦合度、灵活性、简化对象缺:可能无法保证请求一定被接收、系统性能慢、调试困难(请求的处理过程可能不易跟踪,特别是在链很长的情况下)
当有多个对象可以处理同一个请求,但是具体哪个对象处理该请求在运行时刻自动确定
当在处理一个请求的处理者集合应被动态指定
责任链(Chain of Responsibility)
原理:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作
Command(命令):声明执行操作的接口
ConcreteCommand(具体命令):定义一个接收者对象,然后在execute()方法中调用接收者对象的操作
Invoker(调用者):请求一个命令对象执行一个操作
Receiver(接收者):知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者
优:降低发送者和接收者的耦合度、新命令很容易添加到系统中去、支持撤销操作缺:可能导致某些系统有过多的具体命令类、增加了系统的抽象层次
当一个操作需要在不同的时间点被执行,或需要撤销和重做
当需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互
当需要抽象出等待执行的行为,如在GUI中,用户单击按钮,按钮调用命令对象的execute()方法,而具体的执行动作由具体命令对象来完成
命令(Command)
原理:允许你定义一个语言的文法,并且建立一个解释器来解释该语言中的句子
AbstractExpression(抽象表达式):声明一个抽象接口,规范所有节点的解释操作
TerminalExpression(终结表达式):实现抽象表达式的接口,通常返回一个词法符号
NonterminalExpression(非终结表达式):也实现抽象表达式的接口,但包含对其他表达式的引用
Context(上下文):包含解释器之外的一些全局信息,可能被解释器的多个部分使用
优:易于扩展语言、实现简单文法缺:效率问题(对于复杂文法,存在递归性质,效率较低)、难以维护(复杂文法)
编译器、查询语言解析器等领域
当一个应用的一部分功能需要动态地解析和执行某种语言时
当一个语言的文法比较简单,且应用需要频繁解析和执行这个语言时
解释器(Interpreter)
原理:提供了一种方法来访问聚合对象(如列表、集合等)的元素,而无需暴露其底层表示
Iterator(迭代器):定义访问和遍历元素的接口
ConcreteIterator(具体迭代器):维护遍历过程中下一个元素的位置,并负责遍历整个聚合对象
Aggregate(聚合):定义一个用于创建迭代器的方法,并提供一个用于存储元素的容器
ConcreteAggregate(具体聚合):实现聚合接口,并返回一个适当的具体迭代器对象
优:封装遍历逻辑、支持多种遍历方式、符合单一职责原则缺:增加系统复杂性、迭代器模式的适用性有限
当需要为聚合对象提供多种遍历方式时
当需要为聚合对象提供统一的访问接口,而不暴露其内部结构时
当聚合对象太大,不能一次性加载到内存中,需要按需加载时
迭代器(Iterator)
原理:定义了对象间的一种间接通信机制,使得对象之间通过一个共享的中介者对象进行通信,而不是直接相互引用
Mediator(中介者):定义一个接口用于各个同事对象之间的通信
ConcreteMediator(具体中介者):实现中介者接口,协调各个同事对象,通常它依赖于各个同事类的方法
Colleague(同事):定义一个接口用于同事对象之间的通信,同事对象只知道中介者,不知道其他的同事对象
ConcreteColleague(具体同事):实现同事接口,当需要和其他同事对象通信时,就通知中介者
优:降低耦合、集中控制、易于维护和扩展缺:中介者类过于庞大、中介者模式的引入增加了系统的复杂性
当一组对象之间存在复杂的依赖关系,以至于形成了网状结构,难以理解和维护时
当需要通过一个中心点来协调多个对象的交互时
中介者(Mediator)
原理:允许在不破坏封装性的前提下捕获和恢复一个对象的内部状态
Originator(发起人):包含一些重要的“内部状态”,需要在某些时候保存这份内部状态,在其他时候再恢复回来
Memento(备忘录):负责存储发起人的内部状态,在发起人需要时返回其内部状态
Caretaker(管理者):负责保存与管理备忘录对象,但不能对备忘录的内容进行操作或检查
优:封装性好、提供一种可恢复状态机制缺:消耗资源、备忘录的存储和管理可能会变得复杂
需要保存和恢复数据的内部状态,而又不想暴露其内部结构
需要提供一个可回滚的操作,例如实现撤销(undo)功能
备忘录(Memento)
原理:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新
Subject(主题):被观察者,它维护一个观察者列表,并在状态发生变化时通知所有观察者
Observer(观察者):订阅者,它定义了一个更新接口,以便在收到主题的通知时更新自己
ConcreteSubject(具体主题):实现Subject接口,当其状态发生变化时,向注册的观察者发出通知
ConcreteObserver(具体观察者):实现Observer接口,当收到主题的通知时,更新自己的状态
优:降低耦合度、支持广播通信、遵循依赖倒置原则缺:潜在的性能问题、复杂性增加
当一个对象状态的改变需要通知其他对象,而不知道具体有多少对象时
当一个对象必须通知其他对象,而它又不能假定其他对象是谁时
当一个对象需要维护一系列依赖对象,而不想使用子类化或直接引用的方式时
观察者(Observer)
原理:允许对象在其内部状态改变时改变其行为
Context(上下文):维护一个对AbstractState对象的引用,这个引用代表当前状态
AbstractState(抽象状态):定义一个接口,封装与Context的一个特定状态相关的行为
ConcreteState(具体状态):实现AbstractState接口,每个ConcreteState对应Context一个具体状态,并实现与该状态相关的行为
优:封装了转换、简化了Context、遵循开放封闭原则缺:状态模式的使用必然会增加系统类和对象的数量、状态模式的结构与实现都较为复杂
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
当一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态时
状态(State)
原理:定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户
Strategy(策略):定义一个接口,封装算法家族中的公共行为
Concrete Strategies(具体策略):实现策略接口,提供具体的算法实现
Context(上下文):维护一个对策略对象的引用,通常在构造时传入策略对象,并提供一个方法供客户端调用,该方法会委托给策略对象
优:低耦合、易于扩展、遵循开放封闭原则缺:客户端需要了解所有策略、策略类增多
当一个系统应该动态地在几种算法中选择一种时
当一个系统需要独立于它的算法的客户时
当除算法外的其他因素相同,但算法随时间变化时
策略(Strategy)
原理:定义了一个操作中的算法骨架,而将一些步骤延迟到子类中
AbstractClass(抽象类):定义一个模板方法,包含一个或多个基本操作(抽象方法或具体方法),并定义了算法骨架
ConcreteClass(具体类):继承自抽象类,实现抽象类中定义的基本操作
优:封装不变部分、扩展性好、控制子类缺:强制性(子类必须实现所有抽象方法)、修改困难(可能要修改父类,违反开闭原则)
当你想要定义算法的骨架,而将算法的步骤留给子类实现时
当你希望在不改变算法结构的情况下,可以动态地改变算法的某些部分时
模板方法(Template Method)
原理:允许你在不改变类结构的情况下,向一组已经存在的类中添加新的行为
Visitor(访问者):定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作
ConcreteVisitor(具体访问者):实现Visitor接口,每个访问操作实现对具体元素的相应操作
Element(元素):定义一个接受操作以获得一个访问者对象,每个元素都可以被访问者访问
ConcreteElement(具体元素):实现Element接口,通常包含一个accept方法,用于接收一个访问者
ObjectStructure(对象结构):可以是一个集合,如列表或树形结构,它包含多个可以被访问者访问的元素
优:分离操作、易于增加新操作、符合单一职责原则缺:增加对象结构的复杂性、破坏封装、大量类的增加
当一个对象结构包含很多类型的对象,希望对这些对象实施一些依赖于其具体类型的操作
当需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类
访问者(Visitor)
行为型
设计模式
ArrayList
Vector
LinkedList
List
PriorityList
Queue
HashSet
LinkedHashSet
TreeSet
SortedSet
Set
Iterable
Collection
LinkedHashMap
HashMap
HashTable
TreeMap
SortedMap
ConcurrentHashMap
ConcurrentMap
Map
反射、继承、重写、重载
应用场景:分布式系统间远程通信、缓存、持久化、深拷贝
Java内置(Serializable)
轻量级的数据交换格式。可使用诸如Jackson或Gson等库将Java对象转换为JSON字符串
JSON
可使用JAXB(Java Architecture for XML Binding)将Java对象转换为XML字符串
XML
Google开发的一种高效二进制序列化格式。比Java内置序列化机制更快、更小、更灵活。
ProtoBuf
分类
序列化/反序列化
添加元素:非扩容操作,O(1),否则O(n)
删除元素:尾部操作O(1),否则O(n)
随机访问:O(1)
搜索元素:O(n)
插入元素:尾部操作O(1),否则O(n)
数组(查易,插入和删除困难)
插入和删除操作效率高
内存空间利用率高
支持高效的头部和尾部操作
支持更多的操作
链表(查难,插入删除容易)
栈(先进后出)
它是一个完全二叉树,即除了最底层,其他每一层都是满的,而且最底层的节点都集中在左边
分最大堆和最小堆。最大堆中,父节点值大于等于其子节点值;在最小堆中,父节点值小于等于其子节点值
每个节点的值都必须大于等于(或小于等于)其子树中每个节点的值
二叉堆:特殊的树形数据结构,常被用于实现优先队列
如:Java的PriorityQueue(基于堆实现的优先队列)
堆
队列(先进先出)
普通树
普通二叉树:每个子节点的父节点不一定有两个子节点的二叉树
完全二叉树:最深处从左向右连续地紧密排列
满二叉树:父节点都有两个子节点
二叉树
当删除或者增加节点的情况下,如何通过左旋或者右旋的方式来保持左右平衡
每个节点都只能是红色或者黑色
根节点是黑色
每个叶节点(NIL 节点,空节点)是黑色的
如果一个节点是红色的,则它两个子节点都是黑色的。既一条路径上不能出现相邻的两个红色节点
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点
红黑树
平衡二叉树
二叉查找树
一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多于两个的子树
B 树
B 树的变体:前后指针,用于排序
B+ 树
树
SHA1
MD5
哈希表(查和操作都容易)
复杂的非线性结构,由顶点的有穷非空集合和顶点之间边的集合组成
通常表示为:G(V,E),其中,G 表示一个图,V 是图 G 中顶点的集合,E 是图 G 中边的集合。
图
数据结构
冒泡排序[O(n^2)]:将相邻的两个元素进行比较,如果顺序不对就交换它们的位置
选择排序[O(n^2)]:每次选择未排序序列中最小的元素,将其放到已排序序列的末尾
插入排序[O(n^2)]:将未排序序列中的每个元素插入到已排序序列的合适位置
希尔排序[O(n^2)]:将待排序数组分成若干个子序列,对子序列做插入排序,逐步减少子序列间隔,重复操作,间隔为1时,表示对整个数组做一次插入排序
归并排序[O(nlogn)]:分治策略,通过递归分解和合并有序子序列来排序整个序列
快速排序[O(nlogn)]:选择一个基准元素,将序列分成两部分,一部分比基准元素小,一部分比基准元素大,然后分别对这两部分进行快速排序
堆排序[O(nlogn)]:将待排序数组构成一个最大堆(或最小堆),再将堆顶元素(最大/最小元素)与数组最后元素交换,再对剩余元素堆调整,重复,直到 数组有序
计数排序[O(n+k)]:假设输入的数据都在一个确定范围内,通过统计每个元素在输入数组中出现次数,根据统计结果将每个元素放到正确位置
基数排序[O(nlog(r)m)]:将整数按位数割成不同数字,按每位数分别比较和排序。先从最低有效位进行排序,逐步向高位进行,直到对最高有效位排序完成
排序算法
线性查找[O(n)]:从数据集合的第一个元素开始逐个比较,直到找到目标元素或遍历完整个数据集合
二分查找[O(logn)]:将数据集合分成两半,若目标元素比中间元素小,就在前半部分继续查找,否则在后半部分继续查找,直到找到目标元素
哈希查找[O(1)]:基于哈希表
查找算法
最小生成树(Prim)
单源最短路径(Dijkstra)
贪心算法
背包问题
最长公共子序列
最长上升子序列
动态规划算法
回溯算法
快速排序
归并排序
分治算法
最短路径算法
最小生成树算法
拓扑排序
图算法
最大流问题
最小割问题
网络流算法
欧几里得算法
素数判断
大数计算
数学算法
算法
基础
认知体系结构
设计原理
初始化InitializingBean/@PostConstruct
Bean的后置处理器BeanPostProcessori源码分析
销毁DisposableBean/@PreDestroy
Bean生命周期
BeanFactoryPostProcessor源码分析
BeanDefinitionRegistryPostProcessor源码分析
Spring Context装载过程
FactoryBean与Beanfactory区别
IOC容器
概念
@EnableAspectJAutoProxy
@Before/@After/@AfterReturning/@AfterThrowing/@Around
@Pointcut
注解
应用
ProxyFactory源码
AOP代理源码
拦截器链与织入源码
源码
AOP思想
@Bean/@ComponentScan/@Configuration/@Conditional
@Component/@Service@/Controller/@Repository
@Lazy/@Scope/@Import/@Value/@Profile
@Autowired/@Resources/@Inject
要点
响应式编程模型
函数式风格ApplicationContext
Kotlin表达式的支持
SpringWebFluxt模块
spring5新特性
工厂方法、抽象工厂及单例模式
建造者与原型模式
创建型模式
适配器、装饰器及代理模式
外观、桥接、组合及享元模式
结构型模式
模板方法、策略及观察者模式
迭代器、责任链、命令及中介者模式
备忘录、状态、访问者及解释器模式
行为型模式
线程池的单例模式
电商优惠促销策略模式
AOP底层代理模式
RedisTemplate、JdbcTemplate模板模式
Zookeeper监听器观察者模式
微服务网关鉴权责任链模式
多级缓存架构装饰器模式
设计模式对比及应用场景
REQUIRED: 没有事务就开启,有事务就加入,不指定的话默认为该类型
SUPPORTS: 有事务就加入,没有就无事务运行
MANDATORY: 加入当前事务,如果不存在则抛出异常
REQUIRES_NEW: 没有就开启,有了挂起原来的,开启新的
NOT_SUPPORTED: 有了挂起,没有就无事务运行
NEVER: 以非事务方式执行,如果存在事务则抛出异常
NESTED: 如果当前事务存在,则在嵌套事务中执行,否则行为类似于REQUIRED
事务传播机制
DEFAULT:使用底层数据库的默认隔离级别。大多数数据库默认使用 READ_COMMITTED
READ_UNCOMMITTED:允许一个事务可以读取另一个未提交事务的数据(脏读、不可重复读和幻读)
READ_COMMITTED:只允许读取已提交的事务数据,可以防止脏读(不可重复读和幻读)
REPEATABLE_READ:确保在同一个事务中多次读取同样的数据时,这些数据是相同的,可以防止脏读和不可重复读(幻读)
SERIALIZABLE:提供最高的隔离级别,通过序列化事务执行,完全防止脏读、不可重复读和幻读(导致性能下降和锁定争用)
事务隔离级别
脏读 (Dirty Read):一个事务可以读取到另一个未提交事务的数据
不可重复读 (Non-Repeatable Read):一个事务在读取同一数据时,发现该数据被另一个已提交的事务修改了
幻读 (Phantom Read):一个事务在读取同一查询时,发现该查询的结果集中包含了由另一个已提交的事务插入的新行
并发问题
并发问题图解
事务导致并发问题图解
访问权限问题(Spring AOP仅支持public方法上的事务管理)
描述:某个方法被final修饰了,那么在它的代理类中,就无法重写该方法,而添加事务功能
方法使用static 或 final修饰
描述:同一类中的方法直接调用,会导致事务失效
新加一个Service方法
在该Service中注入自己
通过AopContent类(AopContent.currentProxy())
解决方案
事务方法之间内部调用
未被Spring管理
多线程调用
表不支持事务 或 未开启事务
事务传播行为设置不正确:若在事务传播行为设置上有误,如设置Propagation.REQUIRES_NEW,可能会导致事务设置不符合预期
自己捕获了异常 或 手动抛出了别的异常
RuntimeException以外异常没有触发回滚:默认情况下,RuntimeException才回滚事务。若抛出checked exception,事务不会回滚。可通过@Transactional(rollbackFor = Exception.class) 指定特定异常来触发回滚
自定义了不正确的回滚异常
嵌套事务回滚多了
数据库连接设置问题: 事务管理依赖于数据库连接配置。若数据库连接设置不正确(如自动提交为true),事务失效。确保数据库连接自动提交属性为false
平台特性或限制:一些数据库或平台可能对事务管理有特殊要求或限制。了解并遵循平台的特性是确保事务管理生效的关键
事务失效场景
@Transactional
@EnableTransactionManagement
相关注解
事务
简介:将业务逻辑和页面展示分离,使程序分层、分工合作,既相互独立,又协同合作
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为
View(视图):负责进行模型的展示,将逻辑视图解析成物理视图并渲染
Controller(控制器):接收用户请求,委托给模型进行处理,处理完毕后把返回的模型数据返回给视图,由视图负责展示。起调度作用
设计思想
前端控制器(DispatcherServlet):接收请求,响应结果,相当于转发器,中央处理器
处理器映射器(HandlerMapping):根据请求url查找Handler,HandlerMapping负责根据用户请求找到Handler即处理器
处理器适配器(HandlerAdapter):按照特定规则去执行Handler通过HandlerAdapter对处理器进行执行
处理器(Handler):继DispatcherServlet前端控制器的后端控制器
视图解析器(ViewResolver):进行视图解析,根据逻辑视图名解析成真正的视图
SpringMVC工作流程
工作流程
SpringMVC
全局参数详解
configuration、properties、settings、typeAliases、mapper
xml和annotationsi和Criteria差异
掌握
Mybatis
SSM框架
基础理论知识
线程
Volatile缓存一致性协议
指令重排、可见性、原子性、顺序一致性、happens-beofre详解as-if-serial
JMM内存模型
Synchronized原理
Synchronized锁的膨胀升级过程
AQS
乐观锁、悲观锁、重入锁、公平锁、非公平锁及锁的粒度
Condition条件队列同步队列
并发同步
CountDownLatch
Semaphore
CyclicBarrier
并发包工具
atomic类ThreadLocal ABA JMM
cas算法乐观锁
Unsafe魔法类
atomic
ArrayBlockingQueue数组有界队列
ConcurrentLinkedQueue链表有界队列
PriorityBlockingQueue优先级排序无界队列
DelayQueue延时无界队列
阻塞队列
HashMap与ConcurrentHashMap游源码
ArrayList、LinkedList与CopyOnWriteArrayList
Set与CopyOnWriteArraySet
并发集合
Future
ThreadPoolExecutor
ScheduledExecutorService
线程池
ForkJoin
并发
分类:启动类、扩展类、应用程序类加载器
自定义(手写练习)
双亲委派模型及如何打破
类加载机制
堆:堆内存分代机制及对象生命周期
栈:线程栈及栈帧内部结构
方法区(元空间)及常量池
程序计数器
本地方法栈
执行引擎
内存模型
复制算法
标记清除算法
标记整理算法
分代垃圾收集算法
虚拟机栈(栈帧中的本地变量)
方法区中类静态变量
方法区中常量
本地方法栈中JNI指针
根可达算法,其中GCRoot对象
垃圾回收算法
特点:单线程、串行、年轻代、复制算法
优:单CPU处理器下吞吐量非常出色缺:多CPU环境下,堆若偏大会让用户线程处于长时间等待
适用场景:Java编写的客户端程序或者硬件配置有限(CPU核数不多)
用法:-XX:+UseSerialGC:新生代、老年代都使用串行回收器
Seria
特点:单线程、串行、老年代、标记-整理算法
适用场景:与Serial搭配,或在CMS特殊情况下使用
SeriaOld
特点:多线程、并行、年轻代、复制算法
优:多CPU处理器下停顿时间较短缺:吞吐量和停顿时间不如G1,JDK9后不建议使用
适用场景:JDK8及之前版本,与CMS老年代垃圾回收器搭配
用法:-XX:+UseParNewGC:新生代使用ParNew回收器
ParNew
特点:多线程、并行、年轻代、复制算法、JDK8默认、自动调整堆内存大小
优:吞吐量高,支持手动设置参数控制吞吐量。为提高吞吐量,虚拟机会动态调整堆参数缺:不能保证单次的停顿时间,但是支持设置STW时间
适用场景:后台任务,不要与用户交互,且易产生大量对象。如:大数据处理,大文件导出
最大暂停时间:-XX:MaxGCPauseMillis=n
吞吐量:-XX:GCTimeRatio=n
自动调整内存大小:-XX:+UseAdaptiveSizePolicy
用法
Parallel Scavenge
特点:多线程、并行、老年代、JDK8默认、标记清除整理算法
优:并发收集,在多核CPU下效率较高缺:暂停时间会比较长
适用场景:与Parallel Scavenge配套使用
用法:-XX:+UseParallelGC / -XX:+UseParallelOldGC
Parallel Old
特点:多线程、并行、老年代、标记清除算法、允许用户线程和垃圾回收线程在某些步骤中同时执行
优:停顿时间较短,用户体验好缺:内存碎片、退化(某特定情况,退化为SerialOld)、浮动垃圾
适用场景:高并发
用法:XX:+UseConcMarkSweepGC,可分别设置年轻代和老年代
1、初始标记:用极短时间标记GC Roots直接关联对象(STW)
2、并发标记:标记所有对象,用户线程不暂停
3、重新标记:并发标记存在错标、漏标,需重新标记(STW)
4、并发清理
执行步骤
CMS(JDK1.4)
特点:Parallel Scavenge和CMS的优点(高吞吐量+暂停时间)、JDK9之后默认、年轻代+老年代、复制算法
内存结构:多个大小相等区域(Region);分Eden、Survivor、Old;不要求连续指定大小:-XX:G1HeapRegionSize=32m
特性:只回收年轻代,回收Eden区和Survivor区中不用的对象,会STW最大暂停时间:-XX:MaxGCPauseMillis=n(默认200)
1、新对象存放Eden区,年轻代不足(>60%)或无法分配对象时会触发GC
2、标记出Eden和Survivor区域中的存活对象
3、根据配置最大暂停时间选某些区域采用复制算法后清空这些区域(无内存碎片)
4、同上,区别在于Survivor区中存活对象会被搬运到另一个Survivor区。
5、存活对象的年龄到达阈值(默认15),放入老年代,其他迁移到新的Survivor
6、对象大小若超过Region的一半,直接放入大对象区(Humongous)
7、多次回收后,总堆占有率达到阈值时(-XX:InitiatingHeapOccupancyPercent默认45%) 触发混合回收Mixed GC,回收所有年轻代和部分老年代的对象及大对象区(复制算法)
步骤
Young GC(年轻代回收)
特性:与CMS类似,复制算法、效率最高、无内存碎片
1、初始标记(initial mark)
2、并发标记(concurrent mark)
3、最终标记(Finalize Marking):只管漏标,比CMS快
4、并发清理(cleanup):选择存活度最低的区域回收
Mixed GC(混合回收)
优:巨大堆空间回收,高吞吐量、较大堆延迟可控、无内存碎片、并发标记SATB算法效率高、多CPU并行、设置最大暂停时间缺:JDK8的早期版本不成熟、需要大内存
适用场景:高并发,JDK8最新版本、JDK9之后建议默认使用
用法:-XX:+UseG1GC(JDK9后默认,不需配置)最大暂停时间:-XX:MaxGCPauseMillis=毫秒值
G1(Garbage First)(JDK8)
特性:可扩展、低延迟、处理超大内存、高并发、基于Region、染色指针、读屏障、内存多重映射
优:精确内存管理和低停顿时间、大内存堆和高并发(最大GC停顿时间不超过10ms)、通过染色指针追踪内存中对象,避免内存泄漏和程序崩溃等问题缺:复杂度较高、影响启动时间和内存占用、只适用64位系统
描述:从根集合出发,标记活跃对象;此时内存中存在活跃对象和已死亡对象
①初始标记(STW):标记出所有根对象,包括线程栈上引用、静态变量和一些特殊对象
②并发标记(漏标):并发遍历堆中对象,标记其存活状态,并将存活对象从旧内存区域重定位到新内存区
③再标记(STW)(SATB算法):标记并更新在并发标记期间产生的新对象,若STW超过1ms,再次并发标记
1、垃圾标记
描述:把活跃对象转移(复制)到新内存,原内存空间可回收(复制和标记整理算法)
①并发转移准备:对象转移的前置工作,在该阶段会分析最有价值GC分页
②初始转移(STW):转移初始标记的存活对象同时做对象重定位
③并发转移:对转移并发标记的存活对象做转移
2、对象转移(或复制)
3、指针重定位阶段:因对象内存地址发生变化,所有指向对象老地址指针都要调整到对象新地址
小页:内存2M,存放<256KB的对象
中页:内存32M,存放[>=256KB && <4MB] 的对象
大页:内存为大于32MB,不固定,2MB的整数倍,存放>=4M 的对象
结构
设计原因:Linux Kernel 2.6引入的标准大页,适应现代硬件架构的发展,提升性能
使用低42位来表示使用中的堆空间,ZGC借高几位(存在互斥性)做GC相关,快速实现并发标记,转移和重定位等
只要位置是1,指针就带有颜色,颜色指针表示的是某一个比特位是1,代表着这个指针有颜色
其他收集器状态是写对象头,ZGC写在指针
原理
已完成并发转移(在垃圾回收器启动前)且更新完成指针对象(并发转移移动到新区域以后被标记成蓝色),在最终标记以后开始并发转移以前蓝色的对象是没有标记过的对象垃圾对象
Remapped(蓝色)
M0(绿色):本次垃圾回收过程中或上一次垃圾回收中被标记的对象,区分两次垃圾回收
M1(红色):本次垃圾回收过程中或上一次垃圾回收中被标记的对象,区分两次垃圾回收
转发表:存放指针的旧地址和新地址(映射表)
读屏障:对象重定位+删除转发表记录(原子操作)
知识点
指针着色技术
JDK11~14:内存8~4TB,GC停顿时间不超过10ms
JDK15:内存8~16TB,GC停顿时间不超过10ms
JDK16:内存8~4TB,GC停顿时间不超过1ms
JDK版本性能区别
ZGC(JDK11)
Shenandoah(JDK12)
垃圾回收器
JDK自带Jstat、Jinfo、Jmap、Jhat及Jstack
Jvisualvm、Jconsole
阿里巴巴的Arthas
调优工具
GCEasy
GCViewer
GC日志详细分析
日均百万交易系统JVM堆浅大小设置策略与调优
亿级流量电商系统堆内年轻代,与老年代垃圾回收参数设置与调优
高并发系统如何基于G1垃圾回收器优化性能
每秒10万并发的秒杀系统为什么会频繁发生GC
电商大促活动时,严重Fu川GC导致系统直接卡死的优化
线上生产系统OOM监控及定位与解决
实战相关
B+树
Hash
索引数据结构
explain工具深度使用
索引优化最佳实践
执行计划与索引
乐观锁
悲观锁
性能
读锁
写锁
操作
表锁
行锁
粒度
死锁以及优化
锁
读未提交(可能出现脏读、不可重复读和幻读):在此级别下,事务不使用任何锁,直接读取最新数据
读已提交(防止脏读,可能出现不可重复读和幻读):读取数据时,使用行级锁或 MVCC(多版本并发控制)技术,只读取已经提交数据快照
可重复读(防止脏读和不可重复读,可能出现幻读):MVCC ,InnoDB 引擎通过间隙锁(Next-Key Locking)来防止幻读
串行化:通过对读取的数据范围加锁(锁读、锁表),确保其他事务不能并发访问这些数据,从而模拟串行执行
原理:通过保存数据的多个版本来实现非阻塞的读操作
Undo Log:记录数据历史版本,事务读取数据时,若当前版本不可见,则通过 Undo Log 找到最近一个可见版本
Read View:每个事务在启动时创建一个 Read View,用于确定哪些事务的修改对当前事务是可见的
Hidden Columns:每行数据有两个隐藏列,分别记录创建和删除该行事务 ID。通过这些列和 Read View,事务可以确定哪些版本数据对其可见
依赖机制
多版本并发控制MVCC机制
慢查询Sq调优
Mysql
核心模块
标准Http模块
可选Http模块
第三方模块
nginx事件驱动模型及特性
Nginx快速掌握
基本配置
虚拟主机配置
upstream
location
静态目录配置
Nginx核心配置
轮循+权重
ip hash
url hash
least conn
least time
Nginx负载算法配置
Nginx
启动流程
Http请求解析与处理流程
context
wrapper
host
engine
container
Tomcat8与Tomcat7对比
项目架构
Tomcat server.xml配置
Tomcat集群与会话复制方案
Tomcat虑拟主机配置
生产环境配置
Tomcat支持四种线程模型
通过压测演示Nio与Bio模型的区别
Tomcat Bio实现源码
Tomcat Nio实现源码
Tomcat connector并发参数
Tomcat线程模型原理
Tomcat
调优
Rabbitmq入门与高可用集群署实战
Rabbitmq消息路由机制
Rabbitmq消息确认机制
Rabbitmq Web监控平台使用
Rabbitmq镜像队列
解密RocketMq集群部署与快速入门
深入分析RocketMq模块划分与集群原理
详解普通消息、顺序消息、事务消息、定时消息
深入RocketMq Broker、Consumer、Producer源码剖析
详解RocketMq监控与运维
企业实战RocketMq消息中间件API架构开发
RocketMq
Kafka发展介绍与对比
Kafka集群搭建与使用
Kafka副本机制与选举原理
Kafka架构设计原理
基于Kafka的大规模日志系统实现原理
亿级流量生产系统Kafka性能优化最佳实践
Kafka
ActiveMQ
ZeroMQ
Redis
MongoDB
FastDFS
ElasticSearch
MinIo
AWS
PgSql
ClickHouse
存储中间件
Zookeeper快速入门
Zookeeper多节点集群锫部署实战
服务注册与订阅
Zookeeper典型应用场景
Zookeeper中znode、watcher、ACL、客户端API
Zookeeper客户端服务端游源码
Zookeeper迁移、扩容、监控
Zookeeper
Dubbo企业级应用
Dubbo调用模块
Dubbo容错机制与高扩展性分析
Dubbo设计原理分析与源码
Dubbo负载均衡策略
Dubbo RPC协议底层原理与实现
Dubbo管控后台管理与部署
Dubbo
数据读写分离及分库分表场景
常见数据分片算法hash、list、range、tag
常见数据库中间件Mycat和ShardingSphere对比
Sharding-jdbc核心慨念
订单交易中orders和ordersltem分库分表
sq解析、sql路由、sq改写、sql执行、结果合并
ShardingSphere
网络与引用模型基础进阶
BIO、NIO及AIO线程模型
Netty线程模型及源码
高性能序列化协议protobuf及源码
粘包拆包现象及解决方案、编解码器源码
心跳机制源码
直接内存与Netty零拷贝
Netty之Http协议开发应用
Netty之WebSocket协议开发应用
Netty
框架
分布式
Java技术架构
收藏
收藏
0 条评论
回复 删除
下一页