自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java常用命令及实践

一、jinfojinfo可以查看java进程的扩展参数Usage:jinfo [option] <pid>(to connect to running process)jinfo [option] <executable <core>(to connect to a core file)jinfo [option] [server_id@]<remote server IP or hos...

2020-12-24 21:18:33 240 2

原创 在SpringBoot下使用Mybatis-plus设置了TypeAliasesPackage,IDEA运行可以,但打包不生效

一、背景SpringBoot项目,使用了Mybatis-plus的MybatisSqlSessionFactoryBean去生成SqlSessionFactory的Bean,其中设置了TypeAliasesPackage,在IDEA里直接运行可以正常启动,打包运行就报entity的别名找不到。//配置sqlSessionFactory的bean,设置分页拦截配置@Bean(name = "sqlSessionFactory") public SqlSessionFactory sql

2020-07-28 22:33:31 8927 3

原创 《Redis设计与实现》4.独立功能的实现

一、发布与订阅通过PUBLISH发布、SUBSCRIBE订阅、PSUBSCRIBE模式订阅组成。 1.频道订阅与退订 虚线为新增订阅,如果channel已经存在,则直接添加到对应链表尾端,如果不存在,则现在pubsub_channels中添加新channel,然后添加节点。 与订阅相反,退订时如果去掉该客户端节点后,channel没有其他订阅者,则将该channel从pubsub_channels中删除。 ...

2020-05-21 16:42:39 234

原创 《Redis设计与实现》3.多机数据库的实现

一、复制SLAVEOF 旧版本复制功能:sync同步、command propagate命令传播 同步:当客户端像从服务器发送SLAVEOF 从服务器向主服务器发送SYNC命令 主服务器收到SYNC命令,执行BGSAVE,并使用一个缓冲区缓存从现在开始的命令 BGSAVE完成,将文件发送给从服务器 主服务器将缓冲区的命令发送到从服务器执行 命令传播 主服务器将执行的写命令发送

2020-05-21 16:40:46 162

原创 《Redis设计与实现》2.单机数据库的实现

一、数据库 redis的key过期时间设置:EXPIRE设置ttl秒,PEXPIRE设置ttl毫秒,EXPIREAT设置过期时间戳秒,PEXPIREAT设置过期时间戳毫秒。 保存过期时间:redis过期时间存放于expires字典中,其中都是转为PEXPIREAT命令存储的。 删除过期时间:PERSIST key 过期键删除策略:redis采用惰性删除+定期删除 定时删除:设置过期时间的同时,创建定时器,定时器在键过期时立即执行删除操作(内存友好,但CPU不友好

2020-05-21 16:33:28 154

原创 《Redis设计与实现》1.数据结构域对象

一、SDS:simple dynamic string int len:已使用的buf长度 int free:未使用的长度 char buf[]:存储字符串 二、链表:双向链表,包含head、tail指针,head的prev为null,tail节点的next为null三、字典:类似于java hashmap,rehash过程是渐进式的,内部维护一个是否正在rehash的标识,维护一个rehash四、跳跃表: header头结点 tail尾结点

2020-05-21 16:27:49 165

原创 《RabbitMQ实战》11.提升性能,保障安全

一、对速度的需求 消息持久化:持久化消息降低投递性能 消息确认:降低性能 路由算法与绑定规则 direct:查询一条 fanout:忽略路由键,查询所有路由关系 topic:占用内存更多,性能低 二、消息投递...

2020-05-20 09:36:57 219

原创 《RabbitMQ实战》7.warren和Shovel:故障转移和复制

一、warren模式 模式1:每个MQ服务器都是独立的,当主节点故障后,故障转移工具会将其切换到副节点上,可以发布新消息,消费新消息。待故障节点恢复,也允许消费者重新连接到该节点进行消息消费。 模式2:每个节点是相互独立的,但共享存储,当主节点故障后,故障转移工具会将其切换到副节点上,可以继续发布新消息,也可消费新消息,因为存储共享,也可以消费旧消息。 二、远距离通信和复制生产者发布一个消息到MQ1服务器的交换器,交换器路由到队列1中,然后通过Shovel复制到MQ2服务.

2020-05-20 09:34:22 284

原创 《RabbitMQ实战》6.从故障中恢复

一、为RabbitMQ做负载均衡二、连接丢失和从故障中恢复消费者感知恢复,代码如下while(true){try{//建立连接//创建队列、交换器、绑定关系//监听队列}catch(Exception e){//打印错误}}生产者感知恢复,代码如下send(){ //建立连接 //发送消息}...

2020-05-20 09:31:36 171

原创 《RabbitMQ实战》5.集群并处理失败

一、集群架构RabbitMQ始终会记录元数据: 队列元数据:队列的名称及属性(持久化、自动删除) 交换器元数据:交换器名称及属性(持久化) 绑定元数据:消息路由绑定表 vhost元数据:vhost的队列、交换器、绑定关系及安全属性。 二、集群 每个节点都会有完整的交换机与队列元数据,但是仅有一个节点有真正的队列及队列内容,发布消息时,其他节点需要将消息传递给拥有改队列的节点;消费消息亦是如此。三、镜像队列 创...

2020-05-20 09:29:39 238

原创 《RabbitMQ实战》4.解决Rabbit相关问题:编码与模式

一、解耦接收订单与处理订单解耦 很大程度的提高了接单的吞吐量,并且也很容易进行处理能力的扩展。 订单系统与订单处理也不用关心对方使用的啥语言,降低对接成本。 二、发后即忘1)批处理:异步化批处理任务。2)告警通知:可以利用direct或者topic方式3)并发处理:可以使用fanout模式三、RabbitMQ实现RPC并等待响应服务端、客户端与RabbitMQ的调用关系,如下图服务端、客户端流程图如下...

2020-05-20 09:28:57 241

原创 《RabbitMQ实战》2.理解消息通信

一、队列1)消费消息 通过AMQP的basic.consume命令订阅。 通过AMQP的basic.get从队列获取单条消息。 队列有多个消费者,则会采取循环(round-robin)的方式发给消费者。 消息必须确认:可以是通过AMQP的basic.ack显式确认或者订阅队列时设置auto_ack为true。 拒绝消息:可以通过AMQP的basic.reject消息或者消费者从RabbitMQ服务器断开连接。reject的话存在两种情况,requeue设..

2020-05-20 09:27:48 128

原创 《深入理解JAVA虚拟机》13.线程安全与锁优化

一、线程安全代码本身封装了所有必要的正确性保证手段,令调用这个无需关心多线程问题,更无需自己采取任何措施来保证多线程的正确调用。1)线程安全的实现方法 互斥同步:synchronize、ReentrantLock。 非阻塞同步:CAS自旋,其中ABA问题一般不影响正确性。 无同步方案:可重入代码(传入相同的参数,就能返回相同的结果)、线程本地存储(ThreadLocal) 二、锁优化自适应性自旋、锁消除、锁粗化、轻量级锁、偏向锁等1)自旋锁与自...

2020-05-13 09:15:43 124

原创 《深入理解JAVA虚拟机》12.Java内存模型与线程

一、硬件的效率与一致性 处理器、高速缓存、主内存间的交互关系,如下图二、Java内存模型1)主内存与工作内存 主内存:所有的变量都存储在主内存。 工作内存:每个前程都有自己的工作内存,保存了被该线程使用到的变量的主内存副本拷贝。 线程、工作内存、主内存的交互关系,如下图2)内存间的交互操作(操作:作用域,作用) lock(锁定):主内存,把一个变量标识为一个线程独占状态。 unlock(解锁):主内存,把一...

2020-05-13 09:13:22 131

原创 《深入理解JAVA虚拟机》9.类加载及执行子系统的案例与实践

一、Tomcat:正统的类加载器架构从图中的委派关系中可以看出: CommonClassLoader能加载的类都可以被Catalina ClassLoader和SharedClassLoader使用,从而实现了公有类库的共用。 CatalinaClassLoader和Shared ClassLoader自己能加载的类则与对方相互隔离。 WebAppClassLoader可以使用SharedClassLoader加载到的类,但各个WebAppClassLoader实例之间相互

2020-05-13 09:11:41 167

原创 《深入理解JAVA虚拟机》7.虚拟机类加载机制

一、类加载的时机类的生命周期,如下何时需要进行类加载: 遇到new、getstatic、putstatic、invokestatic字节码指令。 使用java.lang.reflect包方法对类反射调用。 初始化一个类,其父类未初始化时。 虚拟机启动时,需要执行一个main方法,那么需要初始化该类。 jdk1.7动态语言支持时,当java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_p.

2020-05-13 09:09:40 122

原创 《深入理解JAVA虚拟机》3.垃圾收集器与内存分配策略

哪些内存需要回收? 什么时候回收? 如何回收? 一、对象已死1.引用计数算法 为对象添加一个引用计数器,一个地方引用,计数器加1,引用失效则减1,当计数器为0是,该对象将不再使用。该算法存在孤岛问题(循环依赖)。如下图,A对象与B对象,计数器均为1,但是已经废弃,通过该算法无法回收。2.可达性分析算法 从GC Roots出发,向下搜索,所有走过的路径成为引用链(Reference Chain),当一个对象到GC Roots没有...

2020-05-13 09:08:21 199

原创 《深入理解JAVA虚拟机》2.Java内存区域与内存溢出问题

一、运行时数据区域程序计数器:当前线程所执行的字节码的行号。Java虚拟机栈:每个方法在执行的时候都会创建一个栈帧,存储局部变量表。操作数栈、动态链接、方法出口。本地方法栈:为虚拟机使用到的Native方法服务。Java堆:所有线程共享的内存区域,存放对象实例。元空间( 方法区 ):存放类信息、常量、静态变量、即时编译器编译后的代码。别名Non-Heap非堆。运行时常量池:是方法区的一部分。直接内存:NIO中的channel与buffer可通过Native函数职级分配堆外内存,.

2020-05-13 09:06:13 93

原创 《Java并发编程实战》4.高级主题

十三、显式锁1)Lock与ReentrantLock void lock(); 获取锁,未获取到则阻塞。 void lockInterruptibly() throws InterruptedException;获取锁,未获取到则阻塞,阻塞可中断。 boolean tryLock();获取锁,返回是否获取到 boolean tryLock(long time, TimeUnit unit) throws InterruptedException;获取锁,不能立即...

2020-05-11 11:24:46 107

原创 《Java并发编程实战》3.活跃性、性能与测试

十、避免活跃性危险1)死锁 死锁的产生:A线程持有锁1,尝试获取锁2,同时B线程持有锁2,尝试获取锁1。 避免死锁:使用支持定时的锁;控制锁顺序;多个锁转为1个锁。jstack -l pid可查看死锁。2)饥饿:某个线程一直获取不到它所需要的资源,导致线程饥饿。常见的是cpu饥饿,一般不设置线程的优先级(因为本身也不是很靠谱)。3)活锁:因为某些原因导致线程一直执行一个重复的操作。例如MQ的消费消息失败导致消息放回了MQ,然后又被消费到,如此循环。可以适当设置重试策略防止这种...

2020-05-11 11:23:27 95

原创 《Java并发编程实战》2.结构化并发应用程序

六、任务执行 Executor框架 1)线程池 newSingleThreadExecutor 一个线程 newFixedThreadPool 固定大小线程池 newCachedThreadPool 缓冲线程池 newScheduledThreadPool 延迟或定时线程池 2)Executor生命周期 ExecutorService继承了Executor,扩展了其生命周期的管理方法。其生命周期状...

2020-05-11 11:22:28 100

原创 《Java并发编程实战》1.基础知识

二、什么是线程安全 当多个线程访问某个类时,不管运行时采用的何种调度方式或者这些线程如何交替执行,并且再主调度代码也不需要任何额外的同步或者协同,这个类能表现出正确的行为,那么这个类就是线程安全的。三、对象共享线程封闭 栈封闭:栈封闭中,只能通过局部变量才能访问对象。 ThreadLocal类:使用ThreadLocal存储变量。 只读共享 不可变:对象不能修改,对象的所有域是final,对象创建时没有逸出。线程安全共享...

2020-05-11 11:21:30 106

原创 Java虚拟机学习-(4)类加载机制

类的加载过程加载:.class加载到方法区,并生成该类的Class对象。验证:规范验证,文件格式验证、元数据验证(类验证)、字节码验证(字节码指令、操作数验证)、符号引用验证(找类、方法、修饰符等)。准备:类变量分配内存。解析:符号引用变为直接引用,类、接口解析,类方法解析,接口方法解析,字段解析。初始化:执行<clinit>()类构造器。类加载...

2020-03-10 19:26:49 90

原创 Java虚拟机学习-(3)垃圾回收

垃圾收集(GC)需要两件事: 如何找出需要回收的内存? 如何回收这些内存?找出需要回收的内存 引用计数法(仅供学习)、可达性分析法、方法区回收条件引用计数法 给对象头添加一个引用计数器,被引用计数器就加1,引用失效减1,计数器为0,对象不再被引用,可被回收。 该算法存在孤岛问题,如下图,也就是A对象引用了B,B引用了A,A...

2020-03-10 19:25:30 118

原创 Java虚拟机学习-(2)内存区域

一、JVM内存布局1.虚拟机栈栈里存放的内调数据,叫栈帧。每个栈帧都包含四个区域:局部变量表、操作数栈、动态连接、返回地址局部变量表:方法参数、方法内部定义的局部变量。操作数栈:运行时操作码操作的的操作数。动态连接:Class文件的常量池中有大量符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。有些符号引用在运行期间转化为直接引用,这部分...

2020-03-10 19:24:49 78

原创 Java虚拟机学习-(1)概要

一、JVM、JRE、JDK分别是啥JVM:Java虚拟机JRE:Java运行时环境JDK:Java开发工具其中从大到小:JDK → JRE →JVM二、Java字节码 .java文件通过javac命令编译成.class文件,由操作码opcode+操作数组成三、Java代码如何运行解释执行: 字节码 →opcode+操作数 →机器码JIT:字节码 ...

2020-03-10 19:23:57 64

原创 死信队列+TTL实现延迟重试

思路MQ配置:1.设置正常处理队列及绑定关系,exchange,queue,key2.创建5s延迟队列queue_5s,10s延迟队列queue_10s,20s延迟队列queue_20s,差错处理队列queue_error,分别于exchange_delay绑定,设置routingKey分别为key_5s,key_10s,key_20s,key_error3.分别配置queue_...

2019-12-30 14:36:06 434

原创 java面试题:英雄PK(无答案)

2014年6月,即将面临毕业找工作,无意间在网上看到这道题,并且附有招聘信息及邮箱,因为自己也是个爱玩游戏的仔,就抱着试一试的态度,花了半小时写了个代码,简单的测试了一下就发送到了招聘邮箱,对方也回复邮件指明了其中的bug,经过修改再次发送过去,因此找到了毕业后第一份工作。特此记录一下该题目,如下三个英雄角色参与PK每个英雄具有以下几个属性:生命值(为0时英雄倒下)、攻击力(每次攻...

2019-11-20 16:04:02 242

原创 JAVA设计模式-抽象工厂模式

一、概念先有一个抽象工厂,然后去生成其他具体工厂,然后用其他具体工厂创建对象。客户类和工厂类分开。消费者任何时候需要某套产品集合时,只需向抽象工厂请求即可。抽象工厂会再向具体的工厂生产出符合产品集规格的产品。(来源于百度百科)二、代码上例子:要生产一台电脑,定义一个抽象工厂(Factory),然后用该抽象工厂去创建一个生产主机的工厂(CaseFactory),再使用具体的...

2019-09-18 10:44:57 127

原创 JAVA设计模式-原型模式

一、概念 通过复制生成实例二、代码定义一个原型接口,实现Cloneablepublic interface Prototype extends Cloneable{ /** * 创建克隆对象 * @return 具体原型实例 */ Prototype createClone();}实现原型接口的具体的原型类,实现c...

2019-09-12 01:15:16 92

原创 ReentrantLock学习(五)Condition中await&signal

一、简介ReentrantLock 中ConditionObject内部类,实现了Condition接口,内部维护了一个单向链表(firstWaiter、lastWaiter),而Node中的nextWaiter正是用于该单链表await:释放当前锁持有的锁,生成线程等待node,存储到condition中的单链表中,等被唤醒的时候,在加入到锁的等待队列signal:唤醒cond...

2019-09-10 09:35:49 1775

原创 ReentrantLock学习(四)lock&unlock过程中sync队列及状态变化

一、AQS中的队列ReentrantLock锁的实现依赖于AQS,而AQS内部实现锁是依赖于volatile int state状态跟volatile Node head,volatile Node tail链表,模型大致如下AQS中的队列status:记录当前锁是否被占用,lock的次数,例如0代表未被占用,2代表lock了2次exclusiveOwne...

2019-08-30 12:10:34 358

原创 ReentrantLock学习(三)公平锁与非公平锁

一、概念理解公平锁:申请所的时候排队,谁也不插队非公平锁:申请的时候插队(先插队,不行了再排队)二、差别ReentrantLock的公平锁与非公平锁的差别在于,内部的同步器不一样,lock()方法调用的是sync的lock(),分别是FairSync与NonfairSync。sync的lock()内部调用了AQS的acquire,而AQS的acquire做了三件事,第一...

2019-08-28 13:43:21 293

转载 为什么浏览器User-agent总是有Mozilla字样

你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样?Mozilla/5.0 (WindowsNT 6.1;WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36Mozilla/5.0 (Linux; U; Android 4.1.2; zh-tw...

2019-08-22 14:21:49 430

原创 SpringBoot中修改proxyTargetClass,但事务代理始终为CGLIB

一、配置在Springboot中,开启事务特别简单,如下1.在启动类上或者配置类上增加@EnableTransactionManagement2.在需要开启事务的方法上增加@Transactional二、问题因为本人有个特别不好的习惯,经常把@Transactional注解使用在interface的方法上,最近遇到一个问题,事务不回滚。但在排查问题时debug发现,开...

2019-08-20 23:55:09 5578

原创 ReentrantLock学习(二)类整体结构及核心方法时序

一、整体结构ReentrantLock的核心实际为 AbstractOwnableSynchronizer,简称AQSLock:锁接口类,定义了锁的一些基本方法 ReentrantLock:其锁的实现依赖于内部sync Sync:ReentrantLock的内部类,继承了AQS,实现了部分模板方法 NonfairSync:ReentrantLock的内部类,继承了Sync,Reen...

2019-08-20 23:07:14 207

原创 ReentrantLock学习(一)ReentrantLock的使用

一、例子一段简单的使用ReentrantLock的例子public class ReentrantLockMain { static String workContent = null; public static void main(String[] args) throws InterruptedException { //new一个锁 ...

2019-08-19 22:56:39 537

转载 转载:swap内存飙升问题排查

转载:https://blog.csdn.net/kezhong_wxl/article/details/77374907正文:近期遇到一个堆外内存导致swap飙高的问题,这类问题比较罕见,因此将整个排查过程记录下来了现象描述最近1周线上服务器时不时出现swap报警(swap超过内存10%时触发报警,内存是4G,因此swap超过400M会触发报警),每次都是童鞋们通过重...

2019-08-16 10:36:53 1694

原创 apollo多namespace时,存在相同key,前覆盖后

一、配置方式演示//config配置方式1@Configurationpublic class TestConfig { @Value("${config.value.cfgVal}") private String cfgVal; public String getCfgVal() { return cfgVal; }}//conf...

2019-08-16 09:10:06 4886 7

原创 SpringAOP获取方法参数上的注解

一、示例① 如下代码,自定义一个参数注解@Test,并将其使用到方法参数上,用于标注需要检验的参数/*** 自定义注解,用于参数*/@Target(PARAMETER)@Documented@Retention(RetentionPolicy.RUNTIME)public @interface Test{}/*** 接口层,使用使用@Test注解标记参数*/@R...

2019-08-08 21:11:40 17794 10

空空如也

空空如也

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

TA关注的人

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