- 博客(142)
- 资源 (6)
- 问答 (1)
- 收藏
- 关注
原创 一文讲透redis实现分布式锁里面的坑
相信大家在使用分布式锁的时候都会选择redis或者zookeeper来实现。今天我们来讲一讲使用Redis实现分布式锁里面的坑。大家要避免。
2024-05-27 11:41:53
360
原创 java排查故障思路
线上的故障无非就是四种,cpu,磁盘,内存,网络。出现的大多数问题都不仅仅在一个层面上面,基本出现问题了就是df,free,top 三连,然后上jstack,jmap.遇见具体问题分析即可。
2024-04-30 16:11:30
918
原创 k8s基础入门
k8s是谷歌开源得容器管理系统,主要功能包括基于容器得应用部署,维护和滚动升级负载均衡和服务发现跨机器和跨地区得集群调度自动伸缩无状态服务和有状态服务广泛得Volume支持插件保持扩展性k8s是一个平台,简化应用程序得工作流,用户可以使用Lable以自己得方式组织管理资源,还可以使用Annotation来自动逸资源得描述信息,用户可以编写自己的控制器和调度器,也可以通过插件机制扩展系统的功能k8s不是paas 平台及服务。
2024-04-12 11:53:28
983
原创 java对象的创建过程
在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始, 方法还没有执行,所有的字段都还为零。初始化零值完成之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。适用于没有内存碎片的情况,原理:用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可。五.执行init方法。
2023-10-31 23:14:09
1065
原创 重温mybatis之一篇带你入门Mybatis
我是一个五年得java开发工程师,在印象里,从第一年我就会使用mybatis了,从最开始得xml配置,到spring整合,再到springboot。无非就是写个mapper抽象类,写个mapper.xml方法。就这么一直用着。期间也想看看这么优秀得框架是怎么生成的。奈何工作缠身。最近比较闲,打算整理一下。那么我们现在开始。
2023-10-11 17:28:01
155
原创 Idea为什么不推荐使用@AutoWired注解
并且绝大多数情况下业务代码和框架就是强绑定的,完全松耦合只是一件理想上的事,牺牲了敏捷度去过度追求松耦合反而得不偿失。基本功能都是依赖注入,只不过@Autowired是Spring定义的,@Resource是JSR-250定义的,大致功能相同 细节不同。适用对象 @Autowired可以对构造器,放啊参数,字段使用 @Resource只能对方法 字段使用。大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解。字段注入,一定要使用的话,(即必须使用此依赖),
2023-09-18 10:58:15
108
原创 一文搞懂Spring是如何解决Bean循环依赖的?
调用的是AbstractAutowireCapableBeanFactory的createBeanInstance//确认需要创建bean实例的类可以实例化Class
2023-08-16 22:47:35
549
原创 docker清理
悬虚镜像 那些没有标签的镜像被称为悬虚镜像 在列表中展示位: 通常出现这种情况,是因为构建了一个新镜像,然后为该镜像打了一个已存在的标签,当此情况出现,Docker会构建新的镜像,然后发现已经有镜像包含相同的标签,接着Docker会移除旧镜像上面的标签,将该标签标在新的镜像之上。执行下面命令将删除所有未连接到正在运行的container上的volume。假如你没有重要数据,你可以执行下面删除命令来删除不使用的volume。如果你已经做好备份,可以使用下面命令删除所有volume。
2023-08-11 14:19:29
381
原创 JVM内存结构
程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。若当前线程正在执行的是一个本地方法,那么此时程序计数器为Undefined。Java 虚拟机栈是描述 Java 方法运行过程的内存模型。Java 虚拟机栈会为每一个即将运行的 Java 方法创建一块叫做“栈帧”的区域,用于存放该方法运行过程中的一些信息,如:局部变量表操作数栈动态链接方法出口信息......
2023-08-02 17:04:43
206
原创 垃圾回收机制和常用的算法
垃圾回收主要针对堆和方法区(非堆),程序计数器,虚拟机栈,本地方法栈这三个区域属于线程私有,随着线程的销毁,自然就会雄安会了,因此不需要堆着三个区域进行垃圾回收。
2023-08-02 11:15:31
687
原创 JAVA线上问题排查降龙十八掌
现场问题一般有以下几种问题 CPU,磁盘,内存,GC问题,网络同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。
2023-07-27 22:39:59
261
原创 线程池实战以及过程中的坑
Hippo-4[4]:一款强大的动态线程池框架,解决了传统线程池使用存在的一些痛点比如线程池参数没办法动态修改、不支持运行时变量的传递、无法执行优雅关闭。除了支持动态修改线程池参数、线程池任务传递上下文,还支持通知报警、运行监控等开箱即用的功能。:轻量级动态线程池,内置监控告警功能,集成三方中间件线程池管理,基于主流配置中心(已支持 Nacos、Apollo,Zookeeper、Consul、Etcd,可通过 SPI 自定义实现)。
2023-07-26 10:58:19
183
原创 线程池的实现原理
至此,我们已经阅读了线程池框架的核心类ThreadPoolExecutor类的大部分源码,由衷地赞叹这个类很多地方设计的巧妙之处:将线程池的运行状态和工作线程数量打包在一起,并使用了大量的位运算使用CAS操作更新线程控制状态ctl,确保对ctl的更新是原子操作内部类Worker类继承了AQS,实现了一个自定义的同步器,实现了不可重入锁使用while循环自旋地从任务缓存队列中获取任务并执行,实现了线程复用机制。
2023-07-20 17:16:18
628
原创 Nginx知识点总结
是对服务器有特殊要求的请求,比如请求方法书put delete 或者Content-Type 值为application/json 浏览器会在正式通信之前,发送一次HTTP预检测OPTIONS请求,先询问服务器 当前网页所在的域名是否在服务器的许可名单中,以及可以使用那些http请求方法和同信息,只有得到肯定的答复,浏览器才会发出正式的XHR请求。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。
2023-07-18 10:08:26
430
原创 Rocketmq面试(四)RocketMQ 的推模式和拉模式有什么区别?
通过本文的讲解,可以看到 PUSH 模式和 PULL 模式本质上都是客户端主动拉取,RocketMQ并没有真正实现 Broker 推送消息的 PUSH 模式。RocketMQ 中 PULL 模式和 PUSH 模式的区别如下:PULL 模式是从 Broker 拉取消息后放入缓存,然后消费端不停地从缓存取出消息来执行客户端定义的处理逻辑,而 PUSH 模式是在死循环中不停的从 Broker 拉取消息,拉取到后调用回调函数进行处理,回调函数中调用客户端定义的处理逻辑;
2023-06-12 21:49:05
1592
原创 Rocketmq面试(六)Rocketmq6种找不到Broker的情况
Rocketmq Client在发送消息的时候,会根据topic首先从本地缓存获取Broker,获取Broker,如果获取不到,就会到Name Server集群中获取。
2023-06-10 14:39:18
1703
原创 Rocket面试(五)Rocketmq发生流量控制的情况有哪些?
本文介绍了 RocketMQ 发生流量控制的 8 个场景,其中 Broker 4 个场景,Consumer 4 个场景。Broker 的流量控制,本质是对 Producer 的流量控制,最好的解决方法就是给 Broker 扩容,增加 Broker 写入能力。而对于 Consumer 端的流量控制,需要解决 Consumer 端消费慢的问题,比如有第三方接口响应慢或者有慢 SQL。Broker4种场景:page cache 繁忙:获取commitlog写入锁超过1s。
2023-06-10 14:24:01
2051
原创 Rocketmq 一文带你搞懂rocketmq基础
通过上面的分析,我们可以总结一个通过 key 在 Index 文件中查找消息的流程,如下:1.计算 key 的 hashcode;2.根据 hashcode 在 Hash 槽中查找位置 s;3.计算 Hash 槽在 Index 文件中位置 40+(s-1)*4;4.读取这个槽的值,也就是Index条目序号 n;5.计算该 index 条目在 Index 文件中的位置,公式:40 + 500万 * 4 + (n-1) * 20;
2023-06-10 11:43:25
559
原创 Rocketmq面试(二)Rocketmq如何保证消息不丢失
如果想要保证消息不丢失就要知道,消息可能出现丢失得地方。1.producer发送消息2.Broker存储消息3.Consumer消费消息4.Broker主从切换下面一共有9个维度可以保证消息不丢失。
2023-06-01 20:38:51
1377
2
原创 Rocketmq面试(一) Rocketmq同一个消费组订阅不同的Tag,会有什么问题?
关键在于最后这个tag的hashcode值,这个 tag 的作用是过滤消息,假如一个 Consumer 订阅了 Topic1 中的 Tag1,那这个 Consumer 拉取消息时,首先从 Name Server 获取订阅关系,得到当前 Consumer 订阅的所有 tag 的 hashcode 集合 codeSet。1.订阅的Topic相同,或者订阅的Topic相同 tag也相同,或者Topic相同,tag的顺序也相同。最后一个问题,怎么看是不是存在订阅关系不一致的 现象?不想看官网的,直接看结论。
2023-05-30 21:37:33
2373
4
原创 Rocketmq学习之路(一)从生产上的问题引出MQ
但是上面说的一些操作,其实藏匿着很多危机,比如告诉物流拿货,第三方物流系统接口挂掉了,那岂不是你下不了订单?用户岂不是财货两空?海量数据是通过分布式存储的方式来进行存储的,每台机器上的rocketmq进程一般称之为broker,每个broker会收到不同的消息,然后会把消息存储在本地的磁盘文件中。这样的话,假设你有1亿条消息,然后有10台机器部署了RocketMQ的Broker,理论上不就可以让每台机器存储1000万条消息了吗?5.支持一些基本功能么(延时消息,事务消息,消息堆积,消息回溯,死信队列)?
2023-05-28 12:30:06
361
原创 SpringBoot源码分析之Tomcat是如何在SpringBoot中启动的?
SpringBoot 的启动是通过 new SpringApplication()实例来启动的,启动过程主要做如下几件事情:> 1. 配置属性 > 2. 获取监听器,发布应用开始启动事件 > 3. 初始化输入参数 > 4. 配置环境,输出 banner > 5. 创建上下文 > 6. 预处理上下文 > 7. 刷新上下文 > 8. 再刷新上下文 > 9. 发布应用已经启动事件 > 10. 发布应用启动完成事件而启动 Tomcat 就是在第 7 步中“刷新上下文”;
2023-05-20 11:35:36
1782
原创 java的对象模型
每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个,保存在方法区,用来在JVM层表示该Java类。当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个对象,这个对象中包含了两部分信息,方法头以及元数据。对象头中有一些运行时数据,其中就包括和多线程相关的锁的信息。元数据其实维护的是指针,指向的是对象所属的类的。
2023-05-08 14:10:18
589
原创 Synchronized的实现原理
同步方法通过关键字隐式的对方法进行加锁。当线程要执行的方法被标注上时,需要先获得锁才能执行该方法。同步代码块通过和执行来进行加锁。当线程执行到的时候要先获得所锁,才能执行后面的方法。当线程执行到的时候则要释放锁。每个对象自身维护这一个被加锁次数的计数器,当计数器数字为0时表示可以被任意线程获得锁。当计数器不为0时,只有获得锁的线程才能再次获得锁。即可重入锁。
2023-05-08 13:49:23
452
原创 JVM原理与实战(一)
1.类加载系统 负责从文件系统或者网络中加载Class信息2.方法区(1)加载的类信息存放于一块称为方法去的内存空间(2)除了类的信息外,方法区中可能还存放着运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)是所有线程共享的3.java堆java堆是在虚拟机启动的时候建立的,她是java程序中最主要的内存工作区域,几乎所有的java对象和数据都顿放在java堆中,堆空间是所有线程共享的。4.直接内存。
2023-05-05 17:38:01
751
原创 Shell(五)Bash行操作&&目录堆栈
1.光标移动Ctrl + aCtrl + bCtrl + eCtrl + fAlt + fAlt + b2.清除屏幕Ctrl+l 清除屏幕3.编辑操作Ctrl + dCtrl + wCtrl + tAlt + tAlt + lAlt + u注:Ctrl+d得是偶,如果当前行没有任何字符,会导致退出当前Shell。剪切和粘贴快捷键如下。Ctrl + kCtrl + uAlt + dCtrl + yhistory命令history命令能显示操作历史,最近得操作在最后,行号最大。
2023-04-28 16:29:35
902
原创 Shell学习(四)算数运算
如果不存在同名变量,Bash 就会将其作为空值,因此不会报错。作为前缀是先运算后返回值,作为后缀是先返回值后运算。上面例子中,逗号前后两个表达式都会执行,然后返回后一个表达式的值。这个式子本身也是一个表达式,返回值就是等号右边的值。内部是求值运算符,执行前后两个表达式,并返回后一个表达式的值。会自动忽略内部的空格,所以下面的写法都正确,得到同样的结果。注意,除法运算符的返回结果总是整数,比如。命令用于将算术运算的结果,赋予一个变量。上面例子中,如果有非整数的运算,支持的赋值运算符,有以下这些。
2023-04-28 15:46:48
1570
原创 Shell学习(三)字符串操作
上面两种语法会删除变量字符串结尾的匹配部分(将其替换为空),返回剩下的部分。区别是一个是最短匹配(又称非贪婪匹配),另一个是最长匹配(又称贪婪匹配)。区别是一个是最短匹配(又称非贪婪匹配),另一个是最长匹配(又称贪婪匹配)。如果匹配成功,就删除匹配的部分,换成其他的字符串返回。如果匹配成功,就删除匹配的部分,返回剩下的部分。如果匹配成功,就删除匹配的部分,返回剩下的部分。上面两种语法都是最长匹配(贪婪匹配)下的替换,区别是前一个语法仅仅替换第一个匹配,后一个语法替换所有匹配。开始,一直返回到字符串的结尾。
2023-04-27 16:31:49
1022
原创 Shell知识点(二)引号,转义,变量
用户创建得变量仅可用于当前Shell 子Shell默认读取不到父Shell定义得变量,为了把变量传递给子Shell,需要使用export命令,这样输出得变量,对于子Shell来说就是环境变量。由于反斜杠在单引号里面变成了普通字符,所以如果单引号之中,还要使用单引号,不能使用转义,需要在外层的单引号前面加上一个美元符号(声明为整数,覆盖以后,Bash 不会报错,但会赋以不确定的值,上面的例子中可能输出0,也可能输出的是3。单引号用于保留字符的字面含义,各种特殊字符在单引号里面,都会变为普通字符,比如星号(
2023-04-26 17:16:17
1870
原创 Shell知识点(一)基本语法
有些参数是命令的配置项,这些配置项一般都是一个连词线开头,比如上面的-l 同一个配置项往往有长和短两种形式,比如 -l 是短形式 --list是长形式, 它们的作用完全相同。因此扩展的结果是由Bash负责的,与所要执行的命令无关,命令本事并不存在参数扩展,收到什么参数就鸳鸯执行,这一点无比需要记住。Shell接收到用户输入的命令以后,会根据空格将用户的输入,拆分成一个个词元,然后,Shell会扩展词元里面的特殊字符,扩展完成后才会调用相应的命令。表示一个字符类,扩展成某一类特定字符之中的一个。
2023-04-26 12:09:25
539
原创 我眼中的并发编程
为了保证共享内存的正确性(可见性,原子性,有序性),内存模型定义了共享内存系统走红多线程程序读写操作的行为的规范。通过这些柜则来规范对内存的读写操作,从而保证指令执行的正确性。它与处理器有关,与并发有关,与编译器也有关。他解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。内存模型解决并发问题主要就是采用两种形式,限制处理器优化和内存屏障。
2022-12-29 18:45:26
218
java项目包含SSM,SSH,springBoot,SpringCloud等100个项目
2020-07-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人