自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Emine

九层之台,始于垒土

  • 博客(205)
  • 资源 (1)
  • 问答 (3)
  • 收藏
  • 关注

原创 【求投票】博客之星投票

麻烦请走过路过的兄弟姐妹们,动动你们的金手指,帮忙投个票。投票方法:点开链接https://bbs.csdn.net/topics/603959652,拉倒最下方,点亮五星即可,如下图。

2021-12-28 16:17:22 1026 7

原创 G1和ZGC垃圾收集器

G1的瓶颈:标记阶段停顿分析初始标记阶段:初始标记阶段是指从GC Roots出发标记全部直接子节点的过程,该阶段是STW的。由于GC Roots数量不多,通常该阶段耗时非常短。并发标记阶段:并发标记阶段是指从GC Roots开始对堆中对象进行可达性分析,找出存活对象。该阶段是并发的,即应用线程和GC线程可以同时活动。并发标记耗时相对长很多,但因为不是STW,所以我们不太关心该阶段耗时的长短。再标记阶段:重新标记那些在并发标记阶段发生变化的对象。该阶段是STW的。清理阶段停顿分析清理阶段清点出有存

2021-08-04 23:54:32 1377

原创 JVM垃圾收集器原理分析

标记-清除算法将需要回收的对象标记,并且清除。大量内存碎片,大对象无法存储复制算法将内存分成两块,每次将存活的对象复制到另一块上去,并且把使用的空间一次性清除掉。空间利用率低,不适合大对象的频繁复制经典的新生代收集算法,将内存划分一块较大的Eden,和大小相等的survivor两块,每次回收时将eden和survivor中还存活的对象复制到另一块survivor中,并一次性清理掉,保证每次都会有整块的内存回收 适用于新生代的小对象,频繁的复制操作标记-整理算法将需要回收的对象清除,留下来的存活的

2021-08-04 00:45:59 289

原创 SpringBoot自动装配底层原理分析

springboot 注解驱动springboot自动装备https://blog.csdn.net/Aqu415/article/details/107676073https://invincible.blog.csdn.net/article/details/102630519

2021-07-09 17:26:38 599

原创 seata分布式事务原理分析

原理seata涉及到三个角色之间的交互,本文通过流程图将AT模式下的基本交互流程梳理一下,为我们以后的解析打下基础。假设有三个微服务,分别是服务A、B、C,其中服务A中调用了服务B和服务C,TM、TC、RM三者之间的交互流程如下图:1、服务A启动时,GlobalTransactionScanner会对有@GlobalTransaction注解的方法进行AOP增强,并生成代理,增强的代码位于GlobalTransactionalInterceptor类中,当调用@GlobalTransaction注

2021-05-14 02:00:06 1055 1

原创 线程池中的线程是如何超时自动销毁的?

worker 线程会从阻塞队列中获取需要执行的任务,这个方法不是简单的 take 数据,我们来分析下他的源码实现你也许好奇是怎样判断线程有多久没有活动了,是不是以为线程池会启动一个监控线程,专门监控哪个线程正在偷懒?想太多,其实只是在线程从工作队列 poll 任务时,加上了超时限制,如果线程在 keepAliveTime 的时间内 poll 不到任务,那我就认为这条线程没事做,可以干掉了 private Runnable getTask() { boolean timedOut

2021-03-17 17:01:27 2541

原创 AQS实现原理看这一篇就够了

在上一篇中我们讲解了synchronized,在jdk1.6之前,synchronized这个重量级锁性能一直较为低下,在1.6之后,进行了大量的锁的优化,如偏向锁、自旋锁等,但是与Lock相比,synchronized还是存在一下缺陷,缺少了获取锁和释放锁的可操作性,可中断、超时获取锁,且他为独占式在高并发场景下性能大大折扣。使用Lock必然离不开核心组件AQS什么是AQSAQS(AbstractQueuedSynchronizer),即队列同步器,它是构建锁或者其他同步组件的基础框架,如Reent

2020-08-18 18:00:29 3724 8

原创 锁对象、偏向锁、轻量级锁、重量级锁

锁对象在java中任何一个对象都能成为锁对象,java对象在内存中的存储结构主要有以下三个部分:1、对象头2、实例数据3、填充数据对象头的数据主要是一些运行时的数据,其简单结构如下长度内存说明32/64bitmark wordhashcode,GC分代年龄,锁信息32/64bitclass metadata address指向对象类型数据的指针32/64bitarray Length数组的长度(当对象为数组时候)从上面可以看出锁的信息是存储在对

2020-08-06 16:12:49 680

原创 支付宝如何获取buyer_id (即user_id)。支付宝服务窗(生活号)支付方式

背景: 最近需要利用支付宝中alipay.trade.create 这个接口,做企业版固定收款码。(我们作为服务商)。 在交易过程中,发现需要上送buyer_id,辗转多处得知,buyer_id就是用户的user_id,需要使用用户信息授权接口https://docs.open.alipay.com/289/105656。 注意:如果在用户无感...

2018-06-13 19:46:50 78720 11

原创 redisson 分布式锁

需求背景: 在分布式多机部署的情况下,我们要求某一个方法,只能同一个时间只能被一台机器的一个线程执行。在单机中,有synchronized,读写锁等方式可以解决同步问题。 但是,这些只能作用在同一个机器上,只能保证某一个机器中的方法,不会同时执行。多台机器还是可以同时执行。这时,就需要借助介质redisson,基于redis的分布式锁。。前提不多说了,先安装好redis,使用...

2018-05-04 18:43:29 15540 1

原创 Socket java.net.SocketException: Connection reset的解决方案

背景: 服务端通讯方式:TCP/IP socket 短链接。 首先看下我的最开始的socket代码:public static byte[] sendMessage(String url, int port, byte[] request, int timeout) { byte[] res = null; Socket socket = n

2018-01-16 19:56:17 174728 8

原创 cas原理和volatile

文章目录volatile为什么不能保证原子性?cas 原理?cas原理cas缺点CAS包含哪些参数:循环CAS:double check 单例模式中,变量为什么定义成volatile?volatile为什么不能保证原子性?1.首先volatile可以保证变量每次读的都是最新值。但是在并发操作中,向i++,这种操作不是原子性,因为这里涉及到了多个操作,1.线程A 获取i的值100,这个时候获取的是最新值,此时由于线程阻塞等原因,线程B获取的最新值100,然后将i 自增到101,更新到内存。此时线程A又来

2022-03-02 17:49:37 1324

原创 接口幂等性措施

接口幂等性为了防止上述情况的发生,我们需要提供一个防护措施,对于同一笔支付信息如果我其中某一次处理成功了,我虽然又接收到了消息,但是这时我不处理了,即保证接口的 幂等性。幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue

2022-03-01 15:58:53 1120

原创 redis热点数据

热点数据的存放场景:数据库中有2000w数据,而redis中只有100w数据,如何保证redis中存放的都是热点数据?方案:限定redis占用的内存,redis会根据自身数据淘汰策略,留下热数据到内存。所以可以计算100w数据大约占用的内存,然后设置一下redis内存限制即可,并将淘汰策略设置为allkeys-lru或者volatile-lru.设置redis最大占用内存:    打开redis配置文件,设置maxmemory参数,maxmemory是bytes字节类型哦!    m

2022-03-01 15:37:32 6423 1

原创 redlock实现原理

https://zhuanlan.zhihu.com/p/151735807三、Redlock算法作者认为,我们应该使用多个Redis,这些节点是完全独立的,不需要使用复制或者任何协调数据的系统,多个redis系统获取锁的过程就变成了如下步骤:以毫秒为单位获取当前的服务器时间尝试使用相同的key和随机值来获取锁,对每一个机器获取锁时都应该有一个超时时间,比如锁的过期时间为10s那么获取单个节点锁的超时时间就应该为5到50毫秒左右,他这样做的目的是为了保证客户端与故障的机器连接,耗费多余的时间!超时间

2022-02-28 15:22:06 1377

原创 通过自定义注解和import动态加载bean

文章目录【前言】import注解作用@Import使用的三种方式第一种直接导入类第二种使用ImportBeanDefinitionRegistrar简单用法高阶用法(配合自定义注解)1.首先自定义注解MyComponentScan2.定义ImportBeanDefinitionRegistrar实现类3.自定义注解MyService4.通过上面加载的ServicePostProcessor,实现加载指定路径下的Bean.5.自定义MyBeanScanner6.定义相关需要加载的Bean7.测试8.启动类Ma

2022-01-27 18:07:38 2132 3

原创 消息队列可靠性和顺序性消费

如何保证消息不被重复消费?造成重复消费原因其实都是类似的,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将该消息分发给其他的消费者。rabbitMQ是消费完成发送一个ACK确认消息,rocketMQ是消费完成返回一个CONSUME_SUCCESS成功标志,kafka消费过消息后,需要提交offset如何解决?根据消息的里面唯一标志,做幂等性处理,无论消费多少次都一样。如何保证消费的可靠性传输?消息不丢失?kafka :...

2022-01-26 18:14:37 2876

原创 微信支付获取用户真实ip

​一、官方手册官方文档说明,是PHP的方式,这里不再赘述,参考链接:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_5二、java获取真实ip方式根据Request获取客户端IP在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,将http://1

2022-01-18 10:58:19 2888 7

原创 HASH索引和B树索引的区别

B+Tree索引B+Tree首先是有序结构,为了不至于树的高度太高,影响查找效率,在叶子节点上存储的不是单个数据,提高了查找效率; 为了更好的支持范围查询,B+树在叶子节点冗余了非叶子节点数据,为了支持翻页,叶子节点之间通过指针相连; 2、B+树算法: 通过继承了B树的特征,通过非叶子节点查询叶子节点获取对应的value,所有相邻的叶子节点包含非叶子节点,使用链表进行结合,有一定顺序排序,从而范围查询效率非常高。 缺点:因为有冗余节点数据,会比较占内存。Hash索引Hash是k,v形式,通过一个散

2022-01-17 09:24:43 4330

原创 【老生常谈系列】hashMap 1.7 和1.8的区别

之前做过一篇关于hashMap 1.7 和1.8原理分析,在这里再次做一下小结HashMap 1.7数据结构数组+链表。entry是hashmap的最小单元每个entry都存有下一个元素的指针,组成一个单向的链表。同一条entry链表的的数据key,计算得到的hash值一定相同(这个是经过HashMap特定的hash计算方法,而不是key本身的hashcode)put 过程当key为null ,则加入到table[0]key不为null,就计算key的hash值,根据hash值找到数组的下

2022-01-04 20:18:04 4405 2

原创 线程池源码分析

文章目录ThreadPoolExecutor.java线程池状态addWorkerWorker 类说明runWorker 方法getTaskprocessWorkerExit线程回收tryTerminate()finalize()线程池中的线程初始化小知识ThreadPoolExecutor.java public void execute(Runnable command) { if (command == null) throw new NullPoi

2021-12-28 14:59:57 849

原创 JVM内存模型分析

文章目录class 文件解读类加载器方法区:常量池:什么是常量池?为什么需要常量池常量池分类:方法调用过程对象内存布局:栈桢:栈桢内容栈中可能出现哪些异常StackOverflowError:栈溢出错误OutOfMemoryError:内存不足Native Method Stacks(本地方法栈):句柄池方法区永久代和元空间PermGen(永久代)元空间使用元空间的优点什么是字面量:方法区:线程栈问题QA:class 文件解读https://blog.csdn.net/lzy_zhi_yuan/ar

2021-12-28 14:58:14 891

原创 线上内存溢出原因排除

【分析】如果机器比较紧缺,第一时间要恢复应用,可以直接先将该节点下线,保存线程栈快照,和堆内存快照。然后进行重启。生产机器一般都是集群部署,如果只是某一台出现这种情况,可以不着急立即重启,保存现场,1.看看最近有什么上线,分析改动代码,2. 如果没有找到问题使用top 命令找出比较消耗资源的进程,使用top hp命令打印该进程下面比较消耗资源的线程3. 使用jstack 打印出线程信息,看看是哪个类。或者是什么类型的线程。4. 再结合使用jmap -histo找出内存的大对象,按照对象大小排序。

2021-12-28 14:56:05 2378 1

原创 Mysql事务和锁原理分析

文章目录什么是事务事务的特性锁?InnoDB中的锁1.表级锁2.行级锁(或者叫行锁算法:记录锁、间隙锁、临建锁)什么是当前读,什么是快照读(MVCC)InnoDB的行级锁定同样分为两种类型,共享锁和排他锁InnoDB行锁实现方式间隙锁(Next-Key锁)什么时候使用表锁死锁mysql 如何解决脏读 (read commit)mysql如何实现可重复读的?(repeatable read)MySQL是如何解决幻读的?(serializable )mysql默认隔离级别以及原因事务的特性原子性、隔离性、持久性

2021-12-28 14:50:43 1227

原创 日志查询常用命令

按关键字查询尾部,日志滚动查询 tail -100f /log/xx.log | grep --color=auto “关键字”查询: grep ‘关键字’ /log/xxx.log | tail -7 7表示条数

2021-11-30 17:32:03 983

原创 dubbo monitor 原理分析

文章目录开启dubbo monitor原理分析开启dubbo monitor监控中心配置。对应的配置类: org.apache.dubbo.config.MonitorConfig开启有两种方法, 2. 通过注册中心发现服务直连监控中心的服务<dubbo:monitor address="dubbo//127.0.0.1:18109" />通过注册中心 <dubbo:monitor protocol="registry"/>原理分析<dubbo:

2021-11-29 17:05:52 1660

原创 顺序读写和随机读写区别和实现

顺序IO和随机IO对于磁盘的读写分为两种模式,顺序IO和随机IO。 随机IO存在一个寻址的过程,所以效率比较低。而顺序IO,相当于有一个物理索引,在读取的时候不需要寻找地址,效率很高。Java中的随机读写在Java中读写文件的方式有很多种,先总结以下3种方法:比如:public static void fileWrite(String filePath, String content) { FileOutputStream outputStream = null; try {

2021-11-25 17:45:04 14196

原创 【限流】Redis和Lua脚本实现令牌桶算法

参考rateLimiter实现,触发式添加令牌。取令牌的时候,通过计算上一次添加令牌和当前的时间差,计算出这段时间应该添加的令牌数,然后往桶里加,curr_mill_second = 当前毫秒数last_mill_second = 上一次添加令牌的毫秒数r = 添加令牌的速率reserve_permits = (curr_mill_second-last_mill_second)/1000 * r脚本编写添加完令牌之后再执行取令牌逻辑— 获取令牌— 返回码— 0 没有令牌桶配置— -1

2021-11-23 18:11:09 1610

原创 dubbo负载均衡源码分析-加权随机

public class RandomLoadBalance extends AbstractLoadBalance { public static final String NAME = "random"; private final Random random = new Random(); @Override protected <T> Invoker<T> doSelect(List<Invoker<T>> inv

2021-11-22 16:46:10 855

原创 rabbitMQ延迟队列实现

死信队列方式定义消费者,和队列package com.demo.test.rabbitMQ.delay;/** * @Date 2021/11/10 11:30 */public class Constant { public final static String EXCHANGE_NAME = "SIMPLE_EXCHANGE_TEST2"; public final static String QUEUE_NAME = "SIMPLE_QUEUE_TEST2";

2021-11-11 18:15:56 821

原创 序列化分析

package com.reflect.singleton;import java.io.Serializable;/** * if (obj != null && * handles.lookupException(passHandle) == null && * desc.hasReadResolveMethod()) * { * Object rep = desc.

2021-08-19 00:50:59 154

原创 Spring AOP 实战案例

文章目录定义service定义切面模拟正常访问模拟异常访问定义servicepackage com.demo.test.aop;import com.demo.test.entity.User;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind

2021-08-17 12:33:39 800

原创 强引用、软引用、弱引用、虚引用、finalize

Java引用介绍Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用⑴强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。⑵软引用(SoftReference)如果一个对象只具有软引用,则内存空间足

2021-08-01 22:21:46 332

原创 zookeeper 原理(二)

zookeeper节点类型持久节点, 节点会被持久临时节点,客户端断开连接后,ZooKeeper 会自动删除临时节点顺序节点,每次创建顺序节点时,ZooKeeper 都会在路径后面自动添加上10位的数字,从1开始,最大是2147483647 (2^32-1)ZAB协议ZAB 协议包括有两种模式,分别是 崩溃恢复和消息广播。崩溃恢复:当整个服务框架在启动过程中,或是当 Leader 服务器出现网络中断、崩溃退出与重启等异常情况时,ZAB 协议就会进人恢复模式并选举产生新的 Leader 服务器

2021-07-02 17:56:52 247 1

原创 zookeeper 原理(一)

zookeeper是在分布式系统中解决分布式协调、负载均衡、发布订阅,master选举、分布式锁和分布式队列、集群管理、。zookeeper分为服务器端和客户端,客户端可以连接到所有的服务端(除非服务端显示的制定不允许连接)。zookeeper节点建议设置为奇数个,大多数服务可用,zookeeper就可用。zookeeper有三个角色,leader、follower、observerzookeeper有三种角色leaderleader节点负责写数据,更新系统状态,同时还负责投票的发起和决议,f

2021-07-02 17:48:35 138 1

原创 volatile和内存屏障

文章目录什么是内存屏障?cpu高速缓存volatile什么是内存屏障?当多个线程访问同一个数据,内存屏障可以保证数据可见性和有序性。可以禁止指令重排序。因为cpu对内存的访问是乱序的,如果发生了指令重排序,可能会导致不同的结果。所以需要一个内存屏障,保证内存屏障前后的指令的有序性,可以确保屏障之前的读写操作,都提交到内存之后,再执行屏障后的读写操作从操作系统硬件的层面而言:cpu高速缓存线程是cpu调度的最小单元,cpu在处理运算时候,还需要与内存交互,比如读取内存数据,存储运算结果,这个IO是很

2021-06-02 03:00:32 1973

原创 spring中Bean的生命周期各个接口详细执行顺序

BeanDefinitionRegistryPostProcessor首先BeanDefinitionRegistryPostProcessor ,这个类在动态注册Bean的时候用的很多(比如自定义注解Import),实际继承的是一个BeanFactoryPostProcessor接口,是一个Bean工厂的处理器,所以在容器启动时候最先加载。这两个接口一共有两个方法。这两个方法只会被执行一次,这个是容器级别接口,不管多少个Bean,一个实现只会执行一次。public interface BeanDefi

2021-05-31 00:11:13 1688 4

原创 关于Redis的二三事

关系型数据库1.以表格形式,基于行的数据存储,是一个二维模式2.存储的结构化的数据,数据存储有固定的模式,数据需要适应表结构表与表之间存在关联大部分关系型数据库都支持sql的操作,支持复杂的关联查询通过支持事务来提供严格的实时一致性redis 内存淘汰机制分布式锁 setNx限流 并发访问spring session内存计数秒杀...

2021-05-19 00:44:58 187

原创 MongoDB和Redis的区别

文章目录MongoDB和Redis的区别是什么应用场景MongoDB 更类似 MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,但是不支持事务。Redis 是一个基于内存中的数据结构存储系统,支持多种类型的数据结构,可用作数据库,高速缓存和消息队列代理。MongoDB和Redis的区别是什么内存管理机制redis数据全部存放在内存,定期写入磁盘,当内存不够用时候,可以使用LRU、LFU等淘汰策略mongoDB数据存在内存,当内存不够用的

2021-05-18 23:32:55 460

原创 分布式事务-XA协议和MQ分布式事务解决

分布式事务分布式事务常用于分布式系统中,保证各个节点之前数据一致性。比较代表的是oracle提出的XA分布式事务协议XA协议包含两阶段提交(2PC)和三阶段提交(3PC)两种实现,这里我们重点介绍两阶段提交的具体过程。在XA分布式事务的第一阶段prepare1.作为事务协调者(事务管理器)会首先向所有的参与者(资源管理器)发送Prepare请求,通知他们开始准备事务。2.事务参与者受到接收到消息后开始准备,写好日志并且开始执行事务,但是不提交,然后将是否就绪的消息返回事务管理器。(此时事务已经大部

2021-05-14 01:58:29 482

S2SH简单的查询学生信息

实现了在SSH中对学生信息的查询,数据库中以偶id name no 三个字段

2013-04-10

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

TA关注的人

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