自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 synchronized 之锁升级

在实际应用中,大多数时候锁总是同一个线程持有很少发生竞争,也就是说锁总是被第一个占用它的线程持有,这个线程就是锁的偏向线程,如果在接下来的运行过程中,该锁没有被其他线程访问,那么持有偏向锁的线程将不会触发同步,只需在第一次被拥有的时候记录下偏向线程的id。如果有其他线程因为多次自旋导致轻量级锁升级为重量级锁那么CAS会失败,此时会释放锁并唤醒阻塞的线程。偏向锁撤销:偏向锁只有当其他线程竞争锁时,持有偏向锁的线程才会被撤销,撤销需要等待全局安全点,同时检查持有偏向锁的线程是否还在执行。

2023-03-13 20:20:32 208

原创 对象内存布局

JVM 堆中所有对象分配的内存字节总数必须是 8 的倍数,如果对象头和实例数据占用的总大小不满足要求,则需要通过对齐数据来填满。在Hotspot虚拟机里,对象在内存中的内存布局可以划分为三个部分:对象头、实例数据以及对齐填充。实例数据里面主要是对象的字段数据信息。对象头主要包含三个部分。

2023-03-13 15:59:02 137

原创 ReentrantLock源码分析

处线程继续执行,因为park过程中是可以被interrupt的,但是我们并没有去打断,所以我们返回是一个false。又回到死循环尝试获取到锁的方法中,因为是非公平锁中,当线程unlock释放锁后,通过tryAcquire()方法cas的方式来竞争获取锁。for循环 shouldParkAfterFailedAcquire(p, node)方法后已经将waitStatus的值改编成-1了,所以最终会返回true,也就是执行 parkAndCheckInterrupt() 方法 将当前线程挂起。

2023-03-11 21:07:22 108

原创 Java内存模型(Java Memory Model)

主内存共享变量数据修改后被写回主存的时机是不确定的,多线程下很有可能出现 “脏读” 因为每个线程都有自己的工作内存,线程在自己的工作内存中保存了当前线程使用到的变量副本,线程对变量的操作都必须在自己的工作内存中进行,不同线程之间也无法直接访问对方的工作内存,线程间变量值传递需要通过主内存完成。但由于主存与 CPU 处理器的运算能力之间有数量级的差距,所以在传统计算机内存架构中会引入高速缓存来作为主存和处理器之间的缓冲,CPU 将常用的数据放在高速缓存中,运算结束后 CPU 再讲运算结果同步到主存中。

2023-03-01 22:57:45 267

原创 elasticsearch 性能优化

ES是比较依赖内存的,并且对内存的消耗也很大,内存对ES的重要性甚至是高于CPU的,所以即使是数据量不大的业务,为了保证服务的稳定性,在满足业务需求的前提下,我们仍需考虑留有不少于20%的冗余性能。ES是天生自带分布式属性的,并且ES的分布式系统是基于对等网络的,节点与节点之间的通信十分的频繁,延迟对于ES的用户体验是致命的,所以对于ES来说,低延迟的网络是非常有必要的。对于ES来说,磁盘可能是最重要的了,因为数据都是存储在磁盘上的,当然这里说的磁盘指的是磁盘的性能。冷数据存储在机械硬盘中,降低成本。

2023-02-23 22:59:43 338

原创 JVM内存结构-堆、方法区

堆区是线程共享的区域,任何线程都可以访问到堆区中的共享数据,由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的,为避免多个线程操作同一地址需要加锁进而影响分配效率,故使用TLAB。元空间的本质上和永久代类似都是的对JVM规范中方法区的实现,元空间和永久代最大的区别是元空间不在虚拟机设置的内存中而是使用的本地内存,内部结构也做了相应调整。随着JIT编译器的发展与逃逸分析的逐渐成熟,栈上分配、标量替换优化技术 使得所有的对象都分配在堆上也变得不那么绝对了。

2023-02-20 21:20:23 137

原创 feign源码分析

feign源码分析 注入对象为@FeignClient接口的代理对象。

2023-02-20 21:09:29 112

原创 JVM垃圾收集器

JVM垃圾收集器 垃圾收集算法 三色标记

2023-02-19 19:17:07 132

原创 spring 三级缓存与循环依赖

spring 三级缓存解决循环依赖问题 源码剖析

2023-02-18 18:01:07 42

原创 innodb内存管理及写入流程

所以,InnoDB内存中的数据页,要持久化到磁盘中时,需要分成4个4KB的系统页,逐一持久化到磁盘。但是4个系统页从内存到磁盘并不是原子操作,所以很容易发生InnoDB的数据页刷盘一部分,就发生断电、宕机的情况,这种就会造成 数据页的损坏,且 redo log是无法利用磁盘中“损坏的数据页”,对缓存中数据进行恢复的,于是Doubel write buffer 就应运而生了。所以,缓存中的数据每做一次更改,就记录在日志文件中持久化到磁盘,这个日志文件称之为redo log;第9步:将缓冲区的数据写入磁盘。

2023-02-14 23:33:18 292

原创 JVM内存结构-栈

方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。局部变量表:也称本地变量表,局部变量表是建立在线程栈上的,是线程的私有数据因此不存在线程安全问题,局部变量表的容量大小是在编译期就确定的,在方法运行期间是不会改变局部变量表的大小的。:获取一个类的字节流 将这个字节流代表的静态存储结构中转化为元数据区的运行时数据结构在内存中生一个代表这个类的Class对象,作为元数据区这个类的访问接口。方法的返回地址:存放在该方法的pc寄存器中,有两种方式。

2023-02-14 23:29:41 58

原创 RocketMQ 架构设计及事务消息的原理

其中,事务消息相对普通消息最大的特点就是一阶段发送的消息对用户是不可见的。其中,利用了NIO中的FileChannel模型将磁盘上的物理文件直接映射到用户态的内存地址中(这种Mmap的方式减少了传统IO将磁盘文件数据在操作系统内核地址空间的缓冲区和用户应用程序地址空间的缓冲区之间来回进行拷贝的性能开销),将对文件的操作转化为直接对内存地址进行操作,从而极大地提高了文件的读写效率(正因为需要使用内存映射机制,故RocketMQ的文件存储都使用定长结构来存储,方便一次将整个文件映射至内存)。

2023-02-14 01:44:09 66

原创 RocketMQ生产者与消费者

一旦发现消费者所订阅的Queue数量发生变化,或消费者组中消费者的数量Consumer实例在接收到通知后会采用 Queue分配算法 自己获取到相应的Queue,即由Consumer实例 自主进行Rebalance。1)轮询算法(默认)该算法保证了每个Queue中可以均匀的获取到消息。该算法会将consumer的hash值作为Node节点存放到hash环上,然后将queue的hash值也放到hash环上,通过 顺时针方向,距离queue最近的那个consumer就是该queue要分配的consumer。

2023-02-13 21:43:26 1045

原创 mysql 索引

哈希索引不支持任何范围查询。8、优化数据访问:查询性能低下的主要原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据,我们可以通过减少访问数据量的方式进行优化 (只返回需要的列、是否有扫描大量的数据行、对多次查询相同数据做查询缓存)只有精确匹配索引所有列的查询才有效,在mysql中,只有memory的存储引擎显式支持哈希索引,哈希索引自身只需存储对应的hash值,所以索引的结构十分紧凑,哈希索引查找的速度非常快。回表:根据普通索引查询得到的叶子节点是主键,根据主键查询主键B+树索引得到完整行记录。

2023-02-12 21:45:54 80

原创 kafka consumer

例如:同一消费组中,有3个消费者C0、C1和C2,他们共订阅了 3 个主题:t0、t1 和 t2,这 3 个主题分别有 1、2、3 个分区(即:t0有1个分区(p0),t1有2个分区(p0、p1),t2有3个分区(p0、p1、p2)),整个消费者所订阅的所有分区可以标识为 t0p0、t1p0、t1p1、t2p0、t2p1、t2p2。粘性分区是 Kafka 从 0. 11.x 版本开始引入这种分配策略,首先会尽量均衡的将分区分配给消费者,在消费者组内的消费者出现问题的时候,会尽量保持原有分配的分区不变化。

2023-02-10 16:55:22 76

原创 kafka broker详解

Topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是Producer生产的数据。Producer生产的数据会被不断追加到该log文件末尾,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个partition分为多个segment。2)为保证多个副本之间的数据一致性,其余的Follower会先将各自的log文件高于HW的 部分截掉,然后从新的Leader同步数据。

2023-02-09 22:42:04 580

原创 kafka 生产者发送流程

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。kafka的基础架构:Kafka生产者发送流程详解 :​​​拦截器序列化器分区器生产者端由两个线程协调完成,分别是main线程和Sender线程。main线程在将消息通过拦截器、序列化器和分区器处理后缓存到消息累加器(RecordAccumlator)中。

2023-02-09 20:46:00 339

原创 Flink容错机制

此时所有任务都已经处理完了前三个数据,所以可以把当前的状态保存成一个检查点,写入外部存储中。可以在需要的时候创建一个保存点,然后停止应用,做一些处理调整之后再从保存点重启。)时,下游任务会堆积大量的缓冲数据,检查点可能需要很久才可以保存完 毕。找到最近一次保存的检查点,从中读出每个算子任务状态的快照,分别填充到对应的状态 中。内部所有任务的状态,就恢复到了保存检查点的那一时刻,也就是刚好处理 完第三个数据的时候,如图。如果应用运行的过程中,发现需要的资源不足或已经有了大量剩余,也可以通过从保存点。

2022-09-16 11:14:21 575

原创 Flink状态编程

这里的 “其他据”,就是所谓的状态(state),最常见的就是之前到达的数据,或者由之前数据计算出的某个结果。无状态的算子任务只需要观察每个独立事件,根据当前输入的数据直接转换输出结果,例如, 可以将一个字符串类型的数据拆分开作为元组输出。Flink中的基本转换算子, 如 map、filter、flatMap, 计算时不依赖其他数据, 就都属于无状态的算子。Flink 有一套完整的状态管理机制,将底层一些核心功能全部封装起来, 包括状态的高效存储和访问、持久化保存和故障恢复,以及资源扩展时的调整。

2022-09-15 10:26:49 781

原创 Flink流合并

流的联合虽然简单,不过受限于数据类型不能改变,灵活性不足,实践中较少使用。在实际应用中, 可能需要将不同来源的数据连接合并在一起处理, 也有可能需要将。最简单的合流操作, 就是直接将多条流合在一起,叫作流“联合”(单独的每一组“配对”数据了, 而是传入了可遍历的数据集合。基本的简单转换和聚合, 还是基于窗口的计算,都是针对一条流上的数据进行。求必须流中的数据类型必须相同,合并之后的新流会包括所有流中的元素,的思路就是针对一条流的每条数据,开辟出其时间戳前后的一段时间间隔,方法,就可以输出任意类型的数据了。

2022-09-13 12:11:57 2447

原创 Flink处理函数

但是无论那种算子, 如果我们想要访问事件的时间戳, 或者当前的水位线信息, 都是做。, 另 外 一 大 类 常 用 的 处 理 函 数 , 就 是 基 于 窗 口 的。跟时间相关的操作, 目前我们只会用窗口来处理。这时面对的就是窗口聚合之后的数据流, 而窗口已经不存在了;待过程中,之前已经到达的数据应该缓存起来, 我们这里用一个自定义的“列表状。基于窗口的结束时间来设定延迟,需求中,要求我们对时间有更精细的控制,需要能够获取水位线,甚至要。的浏览量统计结果, 实际也是有先后的、只能一条一条处理。

2022-09-10 18:01:49 566

原创 Flink窗口

除了由时间驱动之外, 窗口其实也可以由数据驱动,也就是说按照固定的数量,来截取一段数据集,这种窗口叫作“计数窗口”(Count Window),如图。这很好理解,“会话”终止的标志就是“隔一段时间没有数据来”,如果不依赖时间而改成个数,就成了“隔几个数据没有数据来”,这完全是自相矛盾的说法。滑动的距离代表了下个窗口开始的时间间隔,而窗口大小是固定的,所 以也就是两个窗口结束时间的间隔;在这种情况下,我们 就可以定义一个窗口,收集最近一分钟内的所有用户点击数据,然后进行聚合统计,最终输出 一个结果就可以了。

2022-09-04 18:00:35 1102

原创 Flink水位线

实际应用中往往上 下游都有多个并行子任务,为了统一推进事件时间的进展,我们要求上游任务处理完水位线、 时钟改变之后,要把当前的水位线再次发出,广播给所有的下游子任务。但实际应用中,如果当前数据量非常大,可能会有很多数据的时间戳是相同的,这时每来一条数据就提取时间戳、插入水位线就做了大量的无用功。所以为了提高效率,一般 会每隔一段时间生成一个水位线,这个水位线的时间戳,就是当前最新数据的时间戳,这时的水位线,其实就是有序流中的一个周期性出现的时间标记 如下图。据时间戳, 就是我们处理计算的事件时间。

2022-09-03 16:31:18 350

原创 Flink运行时架构

所有的Flink程序都由三部分组成:Source、Transformation和Sink。Source读取数据源,Transformation利用各种算子进行加工处理,Sink负责输出。Flink-conf.yaml -> taskmanager.numberOfTaskSlots:3 (建议值:CPU的核心数)控制一个应用程序执行的主进程,是Flink集群中任务管理和调度的核心。...

2022-08-26 15:59:59 747

原创 Flink简介

事件驱动型应用是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。事件驱动型应用是在计算存储分离的传统应用基础上进化而来。在传统架构中,应用需要读写远程事务型数据库。相反,事件驱动型应用是基于状态化流处理来完成,数据和计算不会分离,应用只需访问本地(内存或磁盘)即可获取数据。系统容错性的实现依赖于定期向远程持久化存储写入 checkpoint。下图描述了传统应用和事件驱动型应用架构的区别。数据分析任务需要从原始数据中提取有价值的信息和指标。

2022-08-22 20:13:40 5608 1

原创 源码分析@Transactional原理及几种不生效情况

继续跟踪返回chain属性的方法。由上述源码可知当被调用方法updteById 没有添加@Transactional注解时 图二中的chain属性为空会调用 invokeMethod 方法并传入被代理对象(没有传入代理对象)。进入 rollbackOn() 方法,判断该异常是否能进行回滚,这个需要判断主方法抛出的 Exception() 异常,是否在 @Transactional 配置中。)对象 整个过程并用使用事务代理对象所以 同一个类中 无事务方法 调用有事务方法 抛出异常 不会回滚。........

2022-08-16 08:16:40 414

原创 redis集群与应用问题

Redis Cluster中的每个Master节点都会负责一部分的槽,当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务,至于哪个Master节点负责哪个槽,这是可以由用户指定也可以经过CRC16哈希到一个指定的Slot上,集群客户端连接集群中任一Redis 实例 即可发送命令,当Redis 实例 收到自己不负责的Slot的请求时,会回复MOVED重定向错误(该错误信息会包含正确的节点槽、ip、端口等信息),通知客户端请求正确的节点。salve只能读取数据。...

2022-08-11 02:52:39 550

原创 redis事务与持久化

1、单独的隔离操作事务中的所有命令都会序列化、按顺序执行,事务执行过程中不会被其他客户端发来的命令打断。2、没有隔离级别的概念队列中的命令在没有被提交之前都不会被实际执行,事务提交前任何命令都不会被执行3、不保证原子性队列中如果有一个命令执行失败,其他命令仍会被执行 不会回滚。...............

2022-08-06 22:38:00 290

原创 redis 数据结构篇

当数据量比较大时会改为quickList因为普通链表需要的附加指针空间太大比较浪费空间比如列表存的是int数据类型结构上还需要额外的两个指针prev和next(ziplist不存储指向上一个节点和下一个节点的指针,存储的是上一个节点的长度和当前节点的长度,牺牲了部分读写性能来换取内存利用率,是一种时间换空间的思想。这样既满足了快速删除/插入的性能,又不会出现太大的空间冗余。1)哈希对象中的所有键值对总长度小于64字节(hash-max-ziplist-value配置)。...............

2022-07-31 15:23:15 169

原创 feign.codec.DecodeException异常解决方案

org.springframework.data.jpa.domain.support.AuditingEntityListener.class自动维护创建时间、更新时间、版本号等信息而该类需要依赖上面提到的java.lang.NoClassDefFoundErrororg/springframework/beans/factory/aspectj/ConfigurableObject类。服务提供方应该是没有问题,从错误提示看接口是联通的数据正常返回应该是在解析返回数据时出现解码异常。......

2022-07-28 15:03:17 5855 1

空空如也

空空如也

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

TA关注的人

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