自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 6 Redis缓存设计与性能优化

缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。造成缓存穿透的基本原因有两个:第一, 自身业务代码或者数据出现问题。第二, 一些恶意攻击、 爬虫等造成大量空命中。

2023-11-29 19:55:27 350

原创 9 AOP底层

代理模式的解释:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。此时,我们new一个UserService对象,然后执行test()方法,结果是显而易见的。到的都是UserService对象,但是执行test()方法时的效果却不一样了,这就是代理所带来的效果。上面是通过cglib来实现的代理对象的创建,是基于父子类的,被代理类(UserService)是父类,代理类是子类,代理对象就是代理类的实例对象,代理类是由cglib创建的,对于程序员来说不用关心。

2023-11-20 20:51:12 88

原创 8 Mybatis源码分析

1. 通过@MapperScan导入了MapperScannerRegistrar类2. MapperScannerRegistrar类实现了ImportBeanDefinitionRegistrar接口,所以Spring在启动时会调用MapperScannerRegistrar类中的registerBeanDefinitions方法3. 在registerBeanDefinitions方法中定义了一个ClassPathMapperScanner对象,用来扫描mapper。

2023-11-18 20:15:58 137

原创 7 推断构造方法

Spring中的一个bean,需要实例化得到一个对象,而实例化就需要用到构造方法。一般情况下,一个类只有一个构造方法:1. 要么是无参的构造方法2. 要么是有参的构造方法如果只有一个无参的构造方法,那么实例化就只能使用这个构造方法了。如果只有一个有参的构造方法,那么实例化时能使用这个构造方法吗?要分情况讨论:1. 使用AnnotationConfigApplicationContext,会使用这个构造方法进行实例化,那么Spring会。

2023-11-16 21:05:52 229

原创 6 Spring循环依赖

如果不考虑Spring,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情这样,A,B就依赖上了但是,在Spring中循环依赖就是一个问题了,为什么?因为,在Spring中,一个对象并不是简单new出来了,而是会经过一系列的Bean的生命周期,就是。当然,在Spring中,出现循环依赖的场景很多,有的场景Spring自动帮我们解决了,而有的场景则需要程序员来解决,下文详细来说。要明白Spring中的循环依赖,得先明白Spring中Bean的生命周期。

2023-11-13 20:24:52 110

原创 5 Spring依赖注入源码

通过set方法进行注入构造方法进行注入。

2023-11-09 21:56:02 125

原创 4 Bean生命周期

4 利用MetadataReader进行excludeFilters和includeFilters,以及条件注解@Conditional的筛选(条件注解并不能理解:某个类上是否存在@Conditional注解,如果存在则调用注解中所指定。1 首先,通过ResourcePatternResolver获得指定包路径下的所有 .class 文件(Spring源码中将此文件包装成了Resource对象)的类的match方法进行匹配,匹配成功则通过筛选,匹配失败则pass掉。10 获取类上添加的所有注解类型集合。

2023-11-05 15:13:57 152

原创 3 Spring底层概念介绍

BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。还有很多...在Spring中,我们经常会通过以下几种方式来定义Bean:1. 2. @Bean这些,我们可以称之申明式定义Bean。我们还可以通过BeanDefinition设置一个Bean的其他属性。

2023-11-03 21:11:59 195

原创 12 原子性|可见性|有序性|JMM内存模型

一个或多个操作,要么全部执行,要么全部不执行。Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,但不采取任何原子性保障措施的自增操作不是原子性的,如:i++上述结果每次执行都不一致,说明发生了线程安全问题sychronized、lock锁、CAS(AtomicInteger)

2023-10-26 11:59:40 75

原创 11 Fork/Join

并行计算框架,用来支持分治任务模型的,Fork对应的是分治任务模型里的任务分解Join对应的是结果合并。

2023-10-24 11:54:49 85

原创 10 读写锁ReentrantReadWriteLock

为什么要使用读写锁?需要高并发读取和较低并发写入的应用程序,降低锁的粒度,提高系统性能使用场景读多写少的共享资源缓存管理:读 >> 写,控制多个线程同时读缓存,需要刷新or修改操作时才使用写锁数据库连接池:多个线程从池中获取连接(读操作),只有一个线程可以设置连接到池中(写操作)文件读写数据结构的并发访问。

2023-10-23 12:00:12 264

原创 9 线程池

为什么要使用线程池?1 重复利用已创建的线程,减少线程创建和销毁带来的开销2 提高响应速度:任务可以不用等待线程创建就能立即执行(T1 创建线程 T2执行任务 T3销毁线程),若T1+T3>T2,可以通过线程池提高响应速度3 提高线程可管理性:线程是稀缺资源,会降低系统稳定性,通过线程池可以对线程进行统一分配、调优和监控。

2023-10-20 18:07:57 118

原创 8 阻塞队列

如果队列满,往BlockingQueue中插入数据时,线程会阻塞直到队列非满;当阻塞队列空时,从BlockingQueue中取数据时,线程会阻塞直到队列非空。

2023-10-18 17:44:33 56

原创 7 ReentrantLock底层

java.util.concurrent包都是围绕共同的行为,如:等待队列、条件队列、独占获取、共享获取等;而这些基本上由AQS提供(Lock、Latch、Barrier等,都是基于AQS来实现内部类Sync继承AQS将同步器调用的方法映射到Sync对应的方法AQS具备的特性阻塞等待队列共享/独占公平/非公平可重入允许中断。

2023-10-18 11:59:26 51

原创 6 并发工具类

可重入的独占锁,允许同一线程多次获取同一锁而不会被阻塞;功能类似于synchronized,是一种互斥锁ReentrantLock具备如下特点:可中断 interrupt()可以设置超时时间公平 非公平支持多个条件变量与sychronized一样,支持可重入。

2023-10-16 21:59:12 52

原创 5 CAS详解

假定有两个操作 A 和 B,如果从执行 A 的线程来看,当另一个线程执行 B 时,要么将 B全部执行完,要么完全不执行 B,执行 B 的线程看 A 的操作也是一样的,那么 A和 B 对彼此来说是原子的synchronized 关键字是基于阻塞的锁机制,但有几个问题:阻塞的线程优先级很高锁的线程一直不释放锁死锁之类的情况锁机制是一种粒度比较大的机制为了解决这个问题,Java 提供了 Atomic 系列的原子操作类。

2023-10-13 18:59:13 40

原创 4 导致JVM内存泄漏的ThreadLocal

访问一个变量的每个线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本ThreadLocal使用场景?

2023-10-11 20:03:46 43

原创 3 深入理解并发编程(下)

多个线程同时访问同一个变量,会导致不可预料的结果上述代码执行的结果均是 10000+

2023-10-09 21:11:18 42

原创 2 深入理解并发编程(中)

阻塞block:仅sychronized,ReetrentLock只会导致线程等待。

2023-10-07 22:45:46 46

原创 1 深入理解并发编程(上)

为什么开发需要并发编程?1 加快响应用户的时间2 使代码模块化,异步化,简单化3 充分利用 CPU 的资源。

2023-10-05 21:46:09 41

原创 7 JVM调优实战

输入 jad加类的全名 可以反编译,这样可以方便我们查看线上代码是否是正确的版本。使用 ognl 命令可以查看线上系统变量的值,甚至可以修改变量的值。输入 thread加上线程ID 可以查看线程堆栈。输入 thread -b 可以查看线程死锁。输入thread可以查看线程详细情况。选择进程序号1,进入进程信息操作。

2023-10-02 19:42:12 57

原创 6 JVM调优工具

jps 查看java进程。

2023-09-30 20:04:30 54

原创 5 垃圾收集器G1&ZGC

年轻代中的Eden和Survivor对应的region也跟之前一样,默认8:1:1,假设年轻代现在有1000个region,eden区对应800个,s0对应100个,s1对应100个。G1将Java堆划分为多个大小相等的独立区域(Region),JVM最多可以有2048个Region(大小为堆大小除以2048)初始标记STW:暂停所有的其他线程,并记录下gc roots直接能引用的对象,速度很快。大对象的处理,Humongous区。最终标记STW:同CMS的重新标记。并发标记:同CMS的并发标记。

2023-09-28 20:41:14 57

原创 4 垃圾收集器

串行收集器(单线程),不仅指一个垃圾收集线程回收垃圾,在其回收垃圾时也需要新生代采用复制算法,老年代采用标记-整理算法Serial Old收集器是Serial收集器的老年代版本,另一种用途是作为CMS收集器的后备方案。

2023-09-26 21:53:15 50

原创 3 JVM对象创建与内存分配机制

KlassPointer指针:保存方法区(类元信息的引用)Java Class类对象:存在堆中;给Java开发人员获取类信息的对象。

2023-09-24 12:01:25 51

原创 2 JVM内存模型深度剖析与优化

方法区:类信息、常量池(运行时常量池、字符串常量池、八大类型对象池)、静态变量。动态链接:对象.run();//run在存的时候仅是一个。方法出口:后续程序知道会回到对象.run();ClassLoader类装载:装载class文件到JVM。Runtime data area运行时数据区:jvm。局部变量表:int a;本地方法栈:为虚拟机调用Native服务。操作数栈:执行a+b等。执行引擎:执行classes中的指令。)用来记录下一步需要执行的指令。)几乎所有对象的实例都在此分配。

2023-09-22 22:02:49 76

原创 1 从JDK源码级别剖析JVM类加载机制

java类加载属于懒加载,用到才加载执行结果:步骤:1 执行main方法,需要加载TestDynamicLoad类(执行静态代码块)2 new A()时,加载A类,先执行类中的静态代码块 -> 构造方法3 B没使用,不会加载。

2023-09-20 21:35:56 65

原创 性能优化-07-Inndb底层原理与MySQL日志机制深入分析

1 MySQL内部组件结构2 一条SQL在innodb中的执行过程

2023-09-18 21:55:31 54

原创 性能优化-06-MySQL锁机制与优化实践以及MVCC底层原理剖析

(索引的索引项上);该索引如果失效,则会升级为表锁(RR级别升级为表锁,RC级别不升级为表锁)对主键进行update、执行sql ...for update。:CAS机制,不会阻塞;适合:读>>写(写操作较多,CPU会一直空转)(需要找到指定行)、锁冲突概率低、并发度高;:多个事务对同一条记录同时执行update;innodb的行锁实际上是对。:MySQL中锁定一行记录;、锁冲突概率高、并发度低。

2023-09-16 22:25:20 84

原创 性能优化-05-MySQL事务原理与优化

A原子性:当前事务同时成功或同时失败C一致性:使用事务的最终目的,依赖其它三大特性和业务代码的正确逻辑实现I隔离性:事务并发执行时,内部能互不干扰;由MySQL的各种锁和MVCC机制实现D持久性:一旦事务提交,对数据库的影响是永久的,由redoLog日志实现。

2023-09-14 22:28:15 194

原创 性能优化-04-索引优化实践二

使用主键索引优化:(限制条件:必须连续,中间不断层但这样的优化条件太苛刻,现实工作中不可能中间不删减几条数据?如何解决这个问题?

2023-09-12 22:12:01 57

原创 性能优化-03-索引优化实践一

示例:给employees表添加10w数据。

2023-09-10 20:01:48 90 1

原创 性能优化-02-Explain详解与索引最佳实践

partitions:是否使用分区;绝大多数不使用filtered:利用公式:rows*filtered/100可以估算出与其它表的关联的行数show warning:1 SQL错误信息 2 MySQL优化语句后的执行语句。

2023-09-08 20:02:02 124 1

原创 1 深入理解MySQL底层数据结构与算法

MySQL索引底层数据结构

2023-09-06 16:53:05 100 1

原创 Redis缓存中间件

惰性过期:当访问Key时,才判断是否过期,过期则清除;volatile-ttl:设置了过期时间的key中,更早过期时间的key先移除。volatile-lru:设置了过期时间的key中,移除最近最少使用的key。volatile-random:设置了过期时间的key中,随即移除key。高性能:访问数据库是从硬盘上读取,利用Redis缓存,使得访问数据时在内存上读取。定时过期:针对设置过期时间的key,Redis会创建定时器并追踪。定期过期:每隔一段时间扫描key,判断key是否过期,过期则删除。

2023-08-24 21:29:49 73 1

原创 Java并发编程

多线程编程中,一般线程个数大于CPU核心个数,而一个CPU在任意时间只能被一个线程使用,为了让这些线程得到有效执行,CPU采用时间片轮转,当一个线程时间用完时应该处于就绪状态,将CPU的使用权交给其它线程,这个过程属于上下文切换(线程≈轻量级进程,同一类线程共享代码和数据空间,每个线程有自己独立的线程栈和程序计数器PC,线程切换开销小。new Thread()时,线程进入新建状态,调用start()方法,线程进入就绪状态并等待CPU分配时间片,分配到时间片后进入运行状态,真正调用run()方法实现多线程。

2023-08-24 17:50:29 57 1

原创 MySQL基础

1 数据库三大范式:第一范式:每列不可拆分第二范式:第一范式 + 非主键列完全依赖主键,不能只依赖一部分第三范式:第二范式 + 非主键列不依赖其它非主键通常需要保证三范式,除非为了性能2 存储引擎每张表存储在三个文件:frm-表定义MYD-数据文件 .mydMYI-索引文件 .myi所有表保存在一个或多个文件.ibd行级(并发高)

2023-08-23 17:34:38 62

原创 Java虚拟机(JVM)

类加载器:加载.class文件 -> 运行时数据区运行时数据区:堆:内存空间最大,new 出来的对象均存在此处;新生代(Eden ToSurvior FromSurvior 8:1:1) 老年代栈:线程栈;线程独享局部变量表操作数栈动态链接:引入的方法等,这些需要获得直接引用(线程中 调用某一方法,只存储方法名,真正运行时需要解析成方法的直接引用处)方法出口程序计数器:线程独享,标识当前程序运行位置方法区(元空间):类元信息、常量池、静态变量本地方法栈:其它编程语言交互接口。

2023-08-23 12:54:04 247

原创 三 Netty使用和常见组件

API使用简单,开发门槛低功能强大,支持多种主流协议定制能力强,通过channel Handler对通信框架进行灵活的拓展性能高,通过与其它主流NIO框架相比,Netty性能最优成熟、稳定社区活跃,版本迭代周期短,发现的BUG可以被及时的修复。

2023-08-03 18:07:28 57

原创 二 网络编程 BIO、NIO

编程中的Socket是什么?Socket是应用层与TCP/IP通信的中间软件层,是一组接口(门面模式)短连接:三次握手建立连接后,发送一次数据后关闭长连接:建立连接后,发送一系列数据后关闭网络编程关注的三件事:连接(C连接S,S等待和接收C的连接)、读网络数据、写网络数据。

2023-08-02 19:14:01 70

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除