自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

沉默的夏虫

小时候的那只铅笔盒

  • 博客(164)
  • 收藏
  • 关注

原创 spring 默认事务控制之前理解的缺陷记录一下

public class serverone { @Autowired private BizTradeChargeDyDao bizTradeChargeDyDao; @Autowired private BizTradeRefundDyDao bizTradeRefundDyDao; public void sws() { try { sw1(); }catch (Exception e){ .

2020-08-12 11:25:48 388

原创 mysql中InnoDB中的各种锁

一种分类方式:行锁(索引上锁) 表锁(表上锁)一种分类方式:共享锁(以及获取前先获取意向共享锁)lock in share model 排它锁(以及获取前先获取意向排它锁)for update一种分类方式(该分类前提—命中索引):记录锁(单条行锁) 间隙锁(无记录时候的临键锁退化为间隙锁) 临键锁(查询范围左侧那条记录至查询范围右侧那条记录之间的锁,左闭右开的锁住)其他的:自增锁(针对自增键累加操作的锁)参考:https://www.bilibili.com/video/BV1

2020-06-25 12:00:10 418

转载 redis线程模型&内存结构

Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。redis线程模型消息处理流程文件事件处理器使用I/O多路复用(multiplexing)程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(wri

2020-06-17 21:58:22 461

原创 redis 集群模式中master选举机制和zookeeper集群中的选举以及nacos选举的对比记忆

最近翻到redis集群中某个master宕机后如何选举新的master出来时发现有点类似zookeeper中的选举【稍有不同】;redis集群中:当某个master宕机之后,某个slave感知到他的master变为fail状态了,会将自身的epoch值加一,然后尝试变为master,向集群中的其他master询问自身能不能做新的master,如果超过一半的master同意了,他就会晋升为新的master,超不过一半此过程后重复(期间别的salve也可能会竞争),一旦被半数认可,会广播告知集群中的其.

2020-06-17 21:41:25 1208

原创 RPC与RMI区别

RPC:远程过程调用,协议多样比如dubbo/http,甚至可以自定义协议,只要两侧都能解析协议,调用端与被调用端可以是不同语言实现RMI: 远程方法调用,要求序列化,服务接口实现Remote接口,注册中心位于服务提供端自己维护,底层通过socket进行数据通讯,仅适用于Java需要...

2020-06-16 18:49:04 242

原创 反射为什么消耗性能

反射真正损耗性能的地方在于getxxx操作,而set方法相差无几例如:hashSet.getClass().getField("字段名");hashSet.getClass().getMethod("方法名");hashSet.getClass().getDeclaredField("字段名");hashSet.getClass().getConstructor(参数类型集合)这些get方法之所以慢是因为根据方法名或字段名在获取method或field时类似于在class所在方法区做遍历匹配.

2020-06-16 17:44:27 4138

原创 基础数据类型

最近再算一些空间成本时候需要计算对象大小,所以回忆一下基础类型的空间开辟情况:1byte=8bit占用1byte:byte、boolean占用2byte:short、char占用4byte:int、float占用8byte:long、double1、2、4、8各两种...

2020-06-16 17:07:59 117

原创 netty轻量级对象缓存

最常用的方式就是获取池化buffer【PooledByteBuf】主要原理就是在利用FastThreadLocal【底层是个数组,每个FastThreadLocal对象在对应线程创建时都有一个数组索引号,递增的】,数组中的每个元素是一个栈,栈中维护着池化的对象,每次获取和回收都由recycler回收器进行操作详细:https://www.jianshu.com/p/83469191509b...

2020-06-16 14:33:52 189

原创 为什么java中一些连接对象或者io流对象用完之后需要主动调用close

为什么java中一些连接对象或者io流对象用完之后需要主动调用close主动调用close会主动释放连接或io流的句柄,从而主动断开这次连接,释放操作句柄如果不主动释放,在java GC时也会被动释放掉:参考实验;所以不主动close并且未触发gc条件,那么连接和句柄将一直被占用着,如果此时连接使用的时连接池,将造成连接池中的连接不能及时回收,一但占满就会造成后续获取连接进行操作的阻塞或失败,如果io占用着文件句柄未及时释放,也会造成文件无法被删除的情况。如果堆状态一直无法到达gc条件就麻烦大了

2020-06-13 17:47:31 1209

原创 redis 删除策略 逐出算法 最大内存 aof重写原理 主从复制原理(细节)

删除策略:逐出算法:最大内存:aof重写原理:主从复制原理(细节):

2020-06-11 22:37:37 217

原创 分布式集群唯一id生成 redis集群或雪花算法

使用jdk自带的UUID可以实现,但是如果是作为MySQL的主键id会带来一下性能损失:UUID为32位过长,浪费索引空间导致每一个page的容量数减少; 另外UUID无序,会造成插入时的page的重构和分裂解决办法:雪花算法...

2020-06-08 22:30:02 1062

原创 spring循环引用解决原理

主要一点,早期暴露半成品对象会被维护到早期暴露缓存中;getSingleton方法如果在单例池中拿不到对象,则会去早期暴露缓存中看看有没有,有则直接返回而循环引用的过程A包含属性B,B包含属性A;创建A对象->先去getSingletonA返回null->实例化A对象->并进行半成品早期暴露【将A维护到早期暴露缓存】->A属性注入B->获取B->getSingletonB返回null->实例化B->并进行半成品早期暴露【将B维护到早期暴露缓存】-

2020-06-08 15:44:43 470

转载 Activiti工作流

1:什么是工作流,工作流的核心对象是什么,activiti共操作数据库多少张表* 工作流就是多个参与者,按照某种预定义的规则,传递业务信息,进行审核的功能一个框架(Activiti)* processEngine,调用Service,从而操作数据库的表* 23表2:工作流中RepositoryService、RuntimeService、TaskService、HistoryService分别表示什么操作RepositoryService:流程定义和部署对象RuntimeService:执行管

2020-06-06 09:07:37 447

原创 RocketMQ详解

nameserv:发现以及路由Brocker:存放消息的地方中转 queren,topic,同步刷盘、异步刷盘productor:消息生产者,与nameserv连接,nameserv告知他“你提供的消息主题在某某些Brocker可接受”,同步发送(保证可靠性)、异步发送(快速,异步回调监听保证可靠性)、单向发送(快,不管成功与否),集群模式(一个group中消费一次,以组为单位)&广播模式consumer:消费端,告知nameserv我的订阅内容在哪些Brocker中存在 push&am

2020-06-03 11:01:44 341

原创 spring boot 自动装配原理

@EnableAutoConfiguration注解->@Import({AutoConfigurationImportSelector.class})->在AutoConfigurationImportSelector是import注解的三种引入bean定义的其中一种,通过ImportSelector的selectImports方法中解析所有META-INF/spring.factories文件中的内容拿到对应自动注入...

2020-06-01 14:34:41 141

原创 spring的xml解析以及注解方式解析简述

xml中的信息大多都是被最终解析为bean定义注册到spring容器中大体过程在spring容器,刷新beanFactory时【obtainFreshBeanFactory()方法】,会解析xml配置文件(beanDefinitionReader)和扫描(beanDefinitionScaner)指定包class来注册所有可加载beanDefinitionbeanDefinitionReader->命名空间解析器NamespaceHandlerResolver->通过xml头部的命.

2020-05-31 10:34:13 725

原创 mybatis整合spring原理流程

结合spring的容器初始化过程方便了解mybatis整合spring原理流程:关键点就是@MapperScan注解通过Import方式向容器中注入了MapperScannerConfigurer(他实现了BeanDefinitionRegistryPostProcessor),在执行工厂的后置处理器时执行了MapperScannerConfigurer的注册beanDefinition的方法,而注册进去的beanDefinition被修改为MapperFactoryBean(一种工厂bean),且构造

2020-05-30 19:39:20 334

原创 java SPI机制

SPI机制就是java内部一种为了便于扩展的约定:java.util.ServiceLoader可以动态加载制定目录【在resources目录中创建\META-INF\services\接口的全限定名的文件】,全限定名的文件文件中存放想要被加载的接口实现类的类全限定名,多个换行;举例:我在项目中想要实现com.ph.ChoseOS接口,不同的操作系统我自己配置不同的ChoseOS的实现类:com.ph.impl.ChoseWinsOS implementsChoseOS、com.ph.imp.

2020-05-29 22:29:25 169

原创 redis、ES、mysql、MongoDB 对比

redis:纯内存数据库,RDB和aof是为了数据恢复,key-value只能通过key查询,可以虚拟内存,弱事务ES:海量数据的文本检索数据库,查询快,增删改慢,一般是定期批量进行增删改(比如每天凌晨1点)mysql:关系型,复杂联表条件查询,数据字段规整不经常变化,支持事务MongoDB:算是以上三者都沾一点,但是都不精,是个内存性数据库,可以虚拟内存,可以利用mmap加快对数据的操作速度是个内存性数据库,但是速度没有redis快;也支持文本检索但是量级太大速度就不行

2020-05-28 21:38:11 2535

原创 ReentranLock使用AQS实现同步锁原理、ReentranLock.lockInterruptibly()的实现原理

ReentranLock:包括公平锁和非公平锁; 实现了Lock(一个锁的标准函数规范lock,tryLock,unLock...); 三个内部类Sync extends AbstractQueuedSynchronizer 抽象同步队列的子类、NonfairSync extends Sync 非公平锁队列、FairSync extends Sync 公平锁队列 属性final Sync sync用来实例化ReentranLock时,默认实例的sync是NonfairSync,用那种队列就是那种锁

2020-05-28 14:26:49 275

原创 zookeeper实现分布式锁

zookeeper原理简述:zookeeper树形节点存储,类似Unix文件结构 zkClient与zk建立连接后可以获取节点信息,也可以监听节点变化 节点下建立的节点可以选择有序节点因此实现分布式锁不要太简单:先去拿号(创建自己的节点),记住自己的号; 拿取所有有序节点,看自己的是序号是不是最小,是就拿到锁了,用完锁之后在finally中删掉自己的那个节点; 如果不是最小就阻塞等待循环sleep(100ms),醒来如果监听器监听到节点变化,发现发现目前自己是最小的号,跳出循环,拿到锁去执

2020-05-27 11:05:34 163

原创 TCP三次握手(第三次失败咋整),四次挥手(为啥他多一次)

三次握手:(自身的序列号如非进行的真正的数据传输,自身不会对自己的序列号进行累加)客户端发送syn=1和一个系列号x 服务端返回ack=1,确认序列号返回x+1(将对端序列号+1),syn=1,序列号y 客户端返回ack=1,确认序列号y+1,序列号x+1(我的序列号已被变为x+1了)四次挥手:客户端发送关闭请求 服务端返回收到你的结束请求 服务端也发起结束请求 客户端返回确认结束三次握手如果第三次失败了会怎么样:失败了服务端收到不确认包,会超时重发5次,若还是没有收到确认包,或.

2020-05-27 10:20:27 2289 1

原创 redis4.x混合持久化

rdb+aof 在redis进行rdb的时候到下次rdb之前的所有写入修改操作都以aof的方式存储,这样既保证了rdb的空间小,由aof的及时性,但是也丢失了aof的可读性

2020-05-26 21:29:11 249

原创 一次http流未关闭引发的血案(jvm排查)

同事弄了一个定时任务,定期去请求一些数据来,定时任务交由线程池管理,http连接由连接池维护分配//允许异步执行 Schedule@EnableAsync@Componentpublic class TestSchedule { private static final Logger LOGGER = LoggerFactory.getLogger(LotterySchedule.class); // 使用线程池myAsync来执行这个Job @Async("myAs

2020-05-26 15:17:35 1472

原创 深入剖析ThreadLocal为何会造成内存泄漏

首先要了解另一个概念:弱引用弱引用 WeakReference:如果一个对象只剩下弱引用指向他,那么当进行GC时会被回收掉,且会把弱引用扔到一个与之建立时绑定的队列,GC后再用那个虚引用获取值就是null了顺别说一下虚引用:与弱引用类似,唯一区别是即便gc还没回收它,在程序中也拿不到该对象,是个null;进入正题我们翻看threadLocal.set(valxxx)方法,发现他底层的大概逻辑是:根据当前代码执行所在线程,拿到线程中的threadLocalMap将一个key为当前threadL

2020-05-26 09:53:11 425

原创 NIO中的非直接缓冲区、直接缓冲区、内存映射、零拷贝

零拷贝:此处的零拷贝指的是没有CPU拷贝非直接缓冲区(ByteBuffer):在jvm中开辟数据空间(用户空间); 每次的io操作都会有内核空间缓存和jvm缓存之间的copy操作 以网络IO往外读为例:JVM用户内存 通过CPU拷贝->内核缓冲buffer 通过DMA拷贝->网络协议通道中直接缓冲mmap内存映射DirectByteBuffer(零拷贝):在jvm越过jvm堆直接开辟内核空间 jvm中只存有数据的引用地址,为了内核安全该地址也不是真正的内核空间地址,而是会有.

2020-05-19 18:00:26 643

原创 seata 的注册中心和配置中心

注册中心:服务端注册中心(位于seata-server的registry.conf配置文件中的registry.type参数),为了实现seata-server集群高可用不会使用file类型,例如下边代码表示:使用zookeeper作为seata服务们的注册管理中心,当前seata服务将会交由这个zk管理registry { # 可选用的类型file 、nacos 、eureka、redis、zk、consul、etcd3、sofa # 使用zookeeper作为seata服务的注册管理中

2020-05-12 16:18:42 8011 1

原创 伪代码实现分布式事务【两阶段方式】

场景:之前做的一个电商网站,因为业务和用户量的扩增,改造成了依赖dubbo框架的分布式项目这里实现的两阶段就是:一阶段实现sql执行,二阶段全提交或全回滚关键点描述:1.@OuterTransactional用于声明参与分布式事务的service方法注解【@OuterTransactional、@Transactional同时存在于方法上】2.TC事务协调器:使用netty实现事务事务协调器服务端3.TM全局事务控制器:位于各个分布式项目中都存在,用于发起事务(如果是全局事务的开头者的话

2020-05-10 19:03:16 514

原创 分布式事务控制

TM:事务管理器1.两阶段方式:所有的事务一阶段执行sql不提交 ,都成功之后TM通知所有事务进行二阶段主动提交,如果有一个失败TM通知所有事务进行二阶段回滚2.TCC :try阶段所有参与者进行尝试提交业务(eg:创建订单的订单状态是CREATING,减库存虽然进行了100-2=98,但是会记录本次有2个冻结中的库存,等类似try操作);Confirm阶段 如果try阶段的执行都成功了则TM通知所有参与者执行真正的提交(eg:创建订单的订单状态改为CREATED,减库存 被冻结的2个库存直接删

2020-05-10 11:09:03 410

原创 NIO+多路复用

BIO建立连接或者io读写操作都是阻塞的,所有多个客户端为了满足及时响应,我们可能需要主动开启多线程NIO建立连接或者io读写操作都是非阻塞的,如果不实用多路复用,但是想满足相应,可能需要循环获取连接,如果成功了,将连接记录到list中,循环中再套一个循环遍历list,进行io读写操作NIO+多路复用(epoll是linux特有的时间复杂度O(1)当有io就绪时被动的被event通知到,连接数量无限制;select大多数操作系统都支持时间复杂度O(n)每次都是内核去遍历所有连接拿到就绪的连接数量有限

2020-05-08 17:48:24 358

原创 Spring中ignoredDependencyTypes和ignoreDependencyInterface的区别

首先我们要明确Spring属性注入默认是通过反射调用setXxx方法实现的;ignoredDependencyTypes :ignoredDependencyTypes 实现忽略ABC作为属性注入:这个好理解,就是在使用ByType类型的方式注入属性时,如果工厂提前设置了ignoredDependencyTypes(ABC.class),那么其他类中如果仅使用byType的方式...

2020-05-06 13:34:59 615

原创 Memory Analyzer(MAT)分析堆内存

Memory Analyzer的安装和使用如前文所述,Eclipse Memory Analyzer(简称MAT)是一个功能丰富且操作简单的JVM Heap Dump分析工具,可以用来辅助发现内存泄漏减少内存占用。使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对象的 Retained Size,查看是谁在阻止垃圾回收,并自动生成...

2020-04-27 23:41:22 528

原创 AOP实现原理 以@EnableAspectJAutoProxy+@Aspect举例说明

以@EnableAspectJAutoProxy+@Aspect实现方式为例(这种目前用的做多,且最方便使用,其他的实现方式大同小异)@EnableAspectJAutoProxy注解都干了什么:一层一层点进去会发现他是通过@Import(AspectJAutoProxyRegistrar.class):给容器中导入AspectJAutoProxyRegistrar注册器,注册器中的reg...

2020-04-25 22:12:09 2501

原创 JVM调优常用命令

前置操作先定位pid、tid:1. 一般是运维团队首先受到报警信息(CPU Memory)2. top命令观察到问题:内存不断增长 CPU占用率居高不下3. top -Hp 观察进程中的线程,哪个线程CPU和内存占比高1.jstack:导出java进程中各个栈内线程信息 eg:jstack -l 12306 >>threadlog.txt 将进程号为12306...

2020-04-24 17:27:16 624

原创 编译后或者打完jar中部分文件乱码问题

一般是因为maven编译时造成的编码破坏pom文件加入过滤即可: <!-- 避免font文件的二进制文件格式压缩破坏 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artif...

2020-04-23 14:25:09 308

转载 mysql分区表跟主键问题

mysql规定 作为分区的字段必须是主键。那可用性不就相当低了吗?按discuz论坛程序来说,如果有1000万的帖子,而帖子表的主键是帖子id,那分区只能按id来分了?如果我想根据帖子的作者的出生日期分区那该怎么办?又假如我项目特殊,以用户生日数据为主,生日有单独的表,所针对的用户从20岁-60岁,每个阶段的数据都特别多,而id是自增的,id经常作为查询条件进行查找。所以我要实现按生日分...

2020-04-19 17:22:40 1848

原创 MYSQL 学习笔记

索引下推 前缀索引(降低索引选择性) 组合索引最左匹配 where order使用组合索引时机

2020-04-18 16:31:45 293

原创 CMS和G1详解

首先1.G1是包括年轻代和年老代的GC2.CMS是年老代GC3.二者在某些时候都需要FullGC(serial old GC)的辅助1 CMS收集器CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。这是因为CMS收集器工作时,GC工作线程与用户线程可以并发执行,以此来达到降低收集停顿时间的目的。CMS收集器仅作...

2020-04-16 19:31:55 6880

原创 ArrayList和LinkedList以及Vector的区别、扩容机制以及底层实现

都实现了List接口ArrayListArrayList的底层实现为数组存储在内存中,线程不同步。可通过数组下标的形式进行查找,所以在查询方面的效率较为出色,常用在查询较多的情景下。LinkedListLinkedList的底层实现为链表形式,也为线程不同步。而链表的底层也决定了它在查询方面不如数组底层的ArrayList而在指定位置插入等修改操作下,性能优于ArrayList。V...

2020-04-16 16:15:15 350

原创 深入剖析i=i++和i=++i

首先说结果 public static void main(String[] args) { int i = 8; i = i++;//i的8先压入操作数栈,之后执行局部变量中的i自增1变为9,之后执行赋值 将操作数栈中的8弹出赋值给i,结果i最终为8// i = ++i;//先执行局部变量中的i自增1变为9,之后i的9压入操作数栈,在之后执...

2020-04-13 14:05:19 975

空空如也

空空如也

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

TA关注的人

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