
转载
文章平均质量分 90
九师兄
可免费问问题,可以一次订阅,终身免费问问题。工作多年遇到的问题,与一些总结,注意事项等,有些是源码级别的讲解,同时整个博客是成体系的,里面有很多连接互相连接,问题都是拆开的,能让大家遇到问题的时候方便的解决问题,或者提供思路。也可以单独找我解决问题。
展开
-
【kafka】kafka 存储 - 日志索引
OffsetIndex 继承 AbstractIndex,它使用了内存映射 MappedByteBuffer 读取索引文件。// 每条记录的大小@volatiletry {//如果文件是新建的,则分配空间。空间大小为,最接近maxIndexSize的entrySize的倍数// 获取file的大小。注意文件大小每次初始化为maxIndexSize,但是当文件关闭时,// 会截断掉多余的数据,所以文件的大小不是一样的// 实例MappedByteBufferelse。转载 2025-03-14 00:30:00 · 209 阅读 · 0 评论 -
【kafka】kafka 哪些情况下会丢失数据
那么问题来了,kafka到底会不会丢消息?答案是:会!( 1 )生产者发送数据;( 2 ) Kafka Broker 存储数据;( 3 )消费者消费数据;在生产环境中严格做到exactly once其实是难的,同时也会牺牲效率和吞吐量,最佳实践是业务侧做好补偿机制,万一出现消息丢失可以兜底。转载 2025-01-10 00:15:00 · 63 阅读 · 0 评论 -
【分布式】分布式事务都有哪些方案
分布式事务了解吗?你们是如何解决分布式事务问题的?只要聊到你做了分布式系统,必问分布式事务,你对分布式事务一无所知的话,确实会很坑,你起码得知道有哪些方案,一般怎么来做,每个方案的优缺点是什么。现在面试,分布式系统成了标配,而分布式系统带来的分布式事务也成了标配了。因为你做系统肯定要用事务吧,如果是分布式系统,肯定要用分布式事务吧。先不说你搞过没有,起码你得明白有哪几种方案,每种方案可能有啥坑?比如 TCC 方案的网络问题、XA 方案的一致性问题。转载 2025-01-04 15:01:21 · 38 阅读 · 0 评论 -
【Spring】Tomcat 为什么要破坏 Java 双亲委派机制?
代码编译的结果从本地机器码转变成字节码,是存储格式的一小步,却是编程语言发展的一大步。Java虚拟机把描述类的数据从Class文件加载进内存,并对数据进行校验,转换解析和初始化,最终形成可以呗虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这动作的代码模块成为“类加载器”。转载 2024-12-12 00:15:00 · 87 阅读 · 0 评论 -
【Spring】掌握 Spring 条件装配的秘密武器
register方法是将配置类注册到Spring的应用上下文中,它并不会立即创建配置类中声明的bean,这些bean的创建过程是在上下文的refresh阶段中进行的。在这个阶段,Spring容器会读取所有的配置类,并对配置类中使用了@Bean注解的方法进行解析,然后才会创建并初始化这些bean。@ConditionalOnProperty是Spring Boot中的一个注解,用于检查某个配置属性是否存在,或者是否有特定的值,只有满足条件的情况下,被该注解标记的类或方法才会被创建或执行。转载 2024-11-15 00:15:00 · 64 阅读 · 0 评论 -
【java】阿里:每天100w次登陆请求, 8G 内存该如何设置JVM参数?
一般来说,大企业或者架构师团队,都会为项目的业务系统定制一份较为通用的JVM参数模板,但是许多小企业和团队可能就疏于这一块的设计,如果老板某一天突然让你负责定制一个新系统的JVM参数,你上网去搜大量的JVM调优文章或博客,结果发现都是零零散散的、不成体系的JVM参数讲解,根本下不了手,这个时候你就需要一份较为通用的JVM参数模板了,不能保证性能最佳,但是至少能让JVM这一层是稳定可控的,相反,如果堆内存小,gc一次时间短,排队等待的线程等待时间变短,延迟减少,但一次请求的数量变小(并不绝对符合)。转载 2024-10-25 00:45:00 · 866 阅读 · 0 评论 -
【Spring】Spring 的 Controller 是单例还是多例
controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。我们首先访问 http://localhost:8080/testScope,得到的答案是1;然后我们再访问 http://localhost:8080/testScope2,得到的答案是 2。得到的不同的值,这是线程不安全的。接下来我们再来给controller增加作用多例 @Scope(“prototype”)转载 2024-09-22 00:15:00 · 115 阅读 · 0 评论 -
【java】java 大对象、二维数组比一维数组占用更大的内存
Java 进阶之字节码剖析中我曾经提到这么一段话int[128][2] ,int[256] 这两个数组看起来一样,但实际上前者比后者多了 246% 的额外开销针对这句话我收到了几位读者的私信,表示不明白为啥不过一个简单的二维数组会有这么大的开销,本来这个问题在我正在写的类加载机制中有详述,不过文章还没写完(估计本周发),所以我专门抽出这个问题探讨一下,五分钟就能看懂。转载 2024-09-20 00:15:00 · 105 阅读 · 0 评论 -
【Elasticsearch】Elasticsearch 底层系列之分片恢复解析
我们是基础架构部,腾讯云 CES/CTSDB 产品后台服务的支持团队,我们拥有专业的ES开发运维能力,为大家提供稳定、高性能的服务,欢迎有需求的童鞋接入,同时也欢迎各位交流 Elasticsearch、Lucene 相关的技术!在线上生产环境中,对于大规模的ES集群出现节点故障的场景比较多,例如,网络分区、机器故障、集群压力等等,都会导致节点故障。转载 2024-09-17 00:30:00 · 186 阅读 · 0 评论 -
【Elasitcsearch】Elasitcsearch 底层系列 Lucene 内核解析之 Stored Fields
Lucene 的 stored fields 主要用于行存文档需要保存的字段内容,每个文档的所有 stored fields 保存在一起,在查询请求需要返回字段原始值的时候使用。。例如。。用户定义的其它字段需要在 ES 的 mapping 中显示设置 field 的 store 属性为 true,该字段才会被 store。在查询的时候返回该字段的原始值。本文主要分析 stored fields 的三个流程及文件存储结构,基于 lucene 7.3.0 版本。原创 2024-09-16 00:15:00 · 881 阅读 · 0 评论 -
【antlr4】使用antlr4构造我的语法树
编译器的前端和后端。前端指的是编译器对程序代码的分析和理解。前端阶段只与语言的语法有关,而和目标机器无关。后端则是生成目标机器的目标代码有关。第一节说说编译器的前端技术。编译器将一般会将词法和语法解析器分开实现。转载 2024-08-21 18:25:12 · 282 阅读 · 0 评论 -
【Spring】Spring Boot可以同时处理多少请求?
前两天面试的时候,面试官问我:一个ip发请求过来,是一个ip对应一个线程吗?我突然愣住了,对于SpringBoot如何处理请求好像从来没仔细思考过,所以面试结束后就仔细研究了一番,现在就来探讨一下这个问题。我们都知道,SpringBoot默认的内嵌容器是Tomcat,也就是我们的程序实际上是运行在Tomcat里的。所以与其说SpringBoot可以处理多少请求,到不如说Tomcat可以处理多少请求。关于Tomcat的默认配置,都在文件中,对应的配置类则是。:最少的工作线程数,默认大小是10。转载 2024-08-10 01:45:00 · 113 阅读 · 0 评论 -
【Elasticsearch】Elasticsearch的路由(Routing)特性
实际上,如果不明确指明使用路由机制,实际上路由机制也是在发挥作用的,只是默认的路由值是文档的id而已。而个性化路由的需求主要是和业务相关的。默认的路由(如果是自动的生成的id)直观上会把所有的文档随机分配到一个分片上,而个性化的路由值就是和业务相关的了。这也会造成一些潜在的问题,比如user123本身的文档就非常多,有数十万个,而其他大多数的用户只有几个文档,这样的话就会导致user123所在的分片较大,出现数据偏移的情况,特别是多个这样的用户处于同一分片的时候,现象会更明显。转载 2024-08-10 01:15:00 · 243 阅读 · 0 评论 -
【ElasticSearch】ElasticSearch数据迁移方法介绍
方法说明该方法更好的使用在跨版本ES集群迁移中,它允许 ES集群一次升级一个节点,因此在升级期间不会中断服务。不支持在升级持续时间之后在同一集群中运行多个版本的 ES,因为无法将分片从升级的节点复制到运行旧版本的节点。所以在升级前需要对当前使用版本进行备份,以便在升级出现异常时进行回滚。同时在升级过程中优先选择data节点,在data节点升级完成后,在对集群中master节点进行升级。同一主要版本的次要版本之间。转载 2024-08-08 00:45:00 · 1343 阅读 · 0 评论 -
【Spring】Spring Boot 手动配置 @Enable 的秘密
通过上面的分析我们已经完成了对@EnableXXX套路的了解,接下来我们自己动手实现下。首先需要准备一个 Spirng Boot的项目,这里我已经准备好了。根据我们分析源码的步骤我们首先需要准备一个配置类。接下来在 configuration包下,创建一个 HelloConfiguration。/*** Hello模块的配置} }这里被@Bean标注的方法,方法名会作为 bean对象的名称。而且当该 bean被加载的时候我们还会在控制台输出一段话。转载 2024-08-08 00:30:00 · 190 阅读 · 0 评论 -
【java】Arrays.sort和Collections.sort实现原理解析
不论是Collections.sort方法或者是Arrays.sort方法,底层实现都是TimSort实现的,这是jdk1.7新增的,以前是归并排序。TimSort算法就是找到已经排好序数据的子序列,然后对剩余部分排序,然后合并起来。转载 2024-08-06 00:15:00 · 144 阅读 · 0 评论 -
【java】LSM树 VS B+树
建议大家看原文。感觉上一篇文章,写的不是很好,又缺少一些,转载一篇补充一下。LSM树是HBase里非常有创意的一种数据结构,它和传统的B+树不太一样,下面先说说B+树。转载 2024-08-05 00:30:00 · 62 阅读 · 0 评论 -
【java】java 慎用 BigDecimal
在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。尽量使用参数类型为String的构造函数。BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。转载 2024-08-05 00:30:00 · 72 阅读 · 0 评论 -
【MyIbatis】SpringBoot+Mybatis 如何实现流式查询
使用mybatis作为持久层的框架时,通过mybatis执行查询数据的请求执行成功后,mybatis返回的结果集不是一个集合或对象,而是一个迭代器,可以通过遍历迭代器来取出结果集,避免一次性取出大量的数据而占用太多的内存。转载 2024-08-02 00:45:00 · 1528 阅读 · 0 评论 -
【MyBatis】mybatis-plus 批量插入 性能优化
稍微总结下我粗略的对比(虽然粗略,但实验结果符合原理层面的理解),如果你想更准确地实验,可以使用JMH,并且测试更多组数(如 5000,10000等)的情况。批量保存方式数据量(条)耗时(ms)单条循环插入1000121011100059927mybatis-plus saveBatch(添加rewtire参数)10002589手动拼接sql10002275100055663jdbc executeBatch(添加rewtire参数)1000324。原创 2024-08-01 00:45:00 · 2378 阅读 · 4 评论 -
【linux】断网了,还能 ping 通 127.0.0.1 吗?
首先,这是个 IPV4 地址。IPV4 地址有 32 位,一个字节有 8 位,共 4 个字节。其中127 开头的都属于回环地址 ,也是 IPV4 的特殊地址,没什么道理,就是人为规定的。而127.0.0.1是众多 回环地址中的一个。之所以不是 127.0.0.2 ,而是 127.0.0.1,是因为源码里就是这么定义的,也没什么道理。IPv4 的地址是 32 位的,2的32次方,大概是40+亿。地球光人口就76亿了,40亿IP这点量,塞牙缝都不够 ,实际上IP也确实用完 了。转载 2024-07-30 00:15:00 · 121 阅读 · 0 评论 -
【java】为什么 0.1 + 0.2 = 0.300000004
因为 0.2 和 0.1 只是指数稍有不同,所以上图中只展示了 0.1 对应的单精度浮点数,从上图的结果我们可以看出,0.1 和 0.2 在浮点数中只能用近似值来代替,精度十分有限,因为单精度浮点数的小数位为 23,双精度的小数位为 52,同时都隐式地包含首位的 1,所以它们的精度在十进制中分别是。浮点数系统的设计是一个比较有趣的工程问题,因为操作系统一般都是 32 位或者 64 位的,浮点数充分利用了 32/64 位的比特,将每一位的作用都发挥到极致,使用最紧凑和简洁的方式实现了尽可能高的精度。转载 2024-07-22 00:30:00 · 94 阅读 · 0 评论 -
【java】java 类型擦除 type erasure
类型擦除),那么到底什么是类型擦除呢?类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。类型擦除的主要过程如下: 1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。转载 2024-07-19 00:15:00 · 124 阅读 · 0 评论 -
【Spring】Apache的BeanUtils与SpringBean的BeanUtils对比
在Java中,除了 基本数据类型之外,还存在 类的实例对象这个引用数据类型,而一般使用 “=”号做赋值操作的时候,对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际还是指向的同一个对象。而浅拷贝和深拷贝就是在这个基础上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。转载 2024-07-04 00:45:00 · 186 阅读 · 0 评论 -
【Spring】美团二面:spring事务不生效的15种场景
就当复习了一下。日常开发中,我们经常使用到spring事务。最近一位朋友去美团面试,被问了这么一道面试题: Spring 事务在哪几种情况下会不生效?今天田螺哥跟大家聊聊,spring事务不生效 的15种场景。转载 2024-07-03 00:45:00 · 80 阅读 · 0 评论 -
【Spring】Spring Bean 的生命周期
这里面有些图不清晰了,但是图画的很好,有个全局概念。在对于Spring的所有解读中,Bean的生命周期都可谓是重中之重,甚至还有人称Spring就是个管理Bean的容器。Bean的生命周期之所以这么重要,被反复提及,是因为Spring的核心能力,比如对象创建(IOC)、属性注入(DI)、初始化方法的调用、代理对象的生成(AOP)等功能的实现,都是在bean的生命周期中完成的。转载 2024-07-03 00:30:00 · 97 阅读 · 0 评论 -
【Spring】Spring 使用状态机实现订单支付
先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如自动门的状态就是两个 open 和 closed。状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。例如,根据自动门的运行规则,我们可以抽象出下面这么一个图。转载 2024-07-03 00:30:00 · 331 阅读 · 0 评论 -
【Netty】Netty经典问题
在Netty中,每个Channel都有一个与之关联的ChannelPipeline,用于处理该Channel上的事件和请求。ChannelPipeline是一种基于事件驱动的处理机制,它由多个处理器(Handler)组成,每个处理器负责处理一个或多个事件类型,将事件转换为下一个处理器所需的数据格式。转载 2024-07-02 00:45:00 · 296 阅读 · 0 评论 -
【java】接口文档设计的12个注意点!
后端开发,经常需要定义接口文档。如何写好接口文档,真的很重要。今天给大家带来接口文档设计的12个注意点~转载 2024-07-02 00:45:00 · 353 阅读 · 0 评论 -
【java】关于 RoaringBitmap 的线程安全问题
在整个流程中,如果有其他线程触发了收缩则可能触发数组下标越界异常。故在我的分布式 bitmap 服务中,采用了 ReentrantReadWriteLock 去保证多线程下 bitmap 的线程安全,在 ReentrantReadWriteLock 的官方文档中,其中举例即使用了 ReentrantReadWriteLock 去保证 TreeMap 的线程安全问题。转载 2024-07-02 00:30:00 · 142 阅读 · 0 评论 -
【java】java IdentityHashMap
最近使用 ANTLR4 时看到其 ParseTreeProperty 类用到了 IdentityHashMap,本文简要记录。根据 IdentityHashMap 的 Java Doc 可知:null?转载 2024-07-01 00:45:00 · 78 阅读 · 0 评论 -
【大数据】RoaringBitmap 的底层数据结构
我曾开发过基于 RoaringBitmap 的分布式去重服务,用于在线用户数去重统计及离线计算中的去重统计,本文基于 0.9.8 简要分析 RoaringBitmap 的底层数据结构。Java 中基本类型 int 为有符号实现,可表示的范围为,即整个范围段长达 42 亿之多,即使是仅使用正数部分也有 21 亿,对于大部分公司的用户维度的统计已经足够,所以我们选择基于 32 位 int 的 RoaringBitmap 进行分析。。转载 2024-07-01 00:45:00 · 95 阅读 · 0 评论 -
【java】java 中的 switch
转载:Java 7中,switch的参数可以是String类型了,这对我们来说是一个很方便的改进。但是,作为一个程序员我们不仅要知道他有多么好用,还要知道它是如何实现的,switch对整型的支持是怎么实现的呢?对字符型是怎么实现的呢?String类型呢?有一点Java开发经验的人这个时候都会猜测switch对String的支持是使用equals()方法和hashcode()方法。那么到底是不是这两个方法呢?接下来我们就看一下,switch到底是如何实现的。转载 2024-07-01 00:30:00 · 163 阅读 · 0 评论 -
【java】java StringJoiner 字符串拼接
StringJoiner是java.util包中的一个类,用于构造一个由分隔符分隔的字符序列(可选),并且可以从提供的前缀开始并以提供的后缀结尾。虽然这也可以在StringBuilder类的帮助下在每个字符串之后附加分隔符,但StringJoiner提供了简单的方法来实现,而无需编写大量代码。StringJoiner类共有2个构造函数,5个公有方法。其中最常用的方法就是add方法和toString方法,类似于StringBuilder中的append方法和toString方法。转载 2024-07-01 00:30:00 · 174 阅读 · 0 评论 -
【java】java BigDecimal 禁止使用 equals 方法比较
BigDecimal是一个非常好用的表示高精度数字的类,其中提供了很多丰富的方法。但是,他的equals方法使用的时候需要谨慎,因为他在比较的时候,不仅比较两个数字的值,还会比较他们的标度,只要这两个因素有一个是不相等的,那么结果也是false、如果读者想要对两个BigDecimal的数值进行比较的话,可以使用compareTo方法。转载 2024-07-01 00:15:00 · 100 阅读 · 0 评论 -
【java】java 禁止在API中使用枚举
大概就是以上的内容,看起来还是很简单的,提示的错误信息就是在AType这个枚举类中没有找到P_M这个枚举项。于是经过排查,我们发现,在线上开始有这个异常之前,该应用依赖的一个下游系统有发布,而发布过程中是一个API包发生了变化,主要变化内容是在一个RPC接口的Response返回值类中的一个枚举参数AType中增加了P_M这个枚举项。但是下游系统发布时,并未通知到我们负责的这个系统进行升级,所以就报错了。我们来分析下为什么会发生这样的情况。转载 2024-06-30 04:00:00 · 115 阅读 · 0 评论 -
【java】java 逃逸分析 案例
所以,如果以后再有人问你:是不是所有的对象和数组都会在堆内存分配空间?那么你可以告诉他:不一定,随着JIT编译器的发展,在编译期间,如果JIT经过逃逸分析,发现有些对象没有逃逸出方法,那么有可能堆内存分配会被优化成栈内存分配。但是这也并不是绝对的。就像我们前面看到的一样,在开启逃逸分析之后,也并不是所有User对象都没有在堆上分配。转载 2024-06-30 00:45:00 · 82 阅读 · 0 评论 -
【Java】java小技巧、如何初始化我们的hashMap容量
集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生。关于HashMap,很多人都对他有一些基本的了解,比如他和hashtable之间的区别、他和concurrentHashMap之间的区别等。这些都是比较常见的,关于HashMap的一些知识点和面试题,想来大家一定了熟于心了,并且在开发中也能有效的应用上。转载 2024-06-30 00:45:00 · 103 阅读 · 0 评论 -
【FastJson】FastJson AutoType
之前有网友对比过:当然,转载 2024-06-30 04:30:00 · 505 阅读 · 0 评论 -
【java】内存管理设计精要
在深入分析垃圾回收之前,我们需要先明确垃圾回收中垃圾的定义,明确定义能够帮助我们更精确地理解垃圾回收解决的问题以及它的职责。计算机科学中的垃圾包括对象、数据和计算机系统中的其他的内存区域,这些数据不会在未来的计算中使用,因为内存资源是有限的,所以我们需要将这些垃圾占用的内存交还回堆并在未来复用4。垃圾可以分成语义垃圾和语法垃圾两种语义垃圾(Semantic Garbage)是计算机程序中永远不会被程序访问到的对象或者数据;语法垃圾(Syntactic Garbage)转载 2024-06-30 02:30:00 · 86 阅读 · 0 评论