自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(136)
  • 资源 (1)
  • 收藏
  • 关注

原创 关于类加载的十个双亲委派问题

1、什么是双亲委派?2、为什么需要双亲委派,不委派有什么问题?3、"父加载器"和"子加载器"之间的关系是继承的吗?4、双亲委派是怎么实现的?5、我能不能主动破坏这种双亲委派机制?怎么破坏?6、为什么重写loadClass方法可以破坏双亲委派,这个方法和findClass()、defineClass()区别是什么?7、说一说你知道的双亲委派被破坏的例子吧8、为什么JNDI、JDBC等需要破坏双亲委派?9、为什么TOMCAT要破坏双亲委派?10、谈谈你对模块...

2021-02-06 21:02:23 309

原创 从业务层面和运维层面优化Redis

业务层面业务层面主要是开发人员需要关注,也就是开发人员在写业务代码时,如何合理地使用Redis。开发人员需要对Redis有基本的了解,才能在合适的业务场景使用Redis,从而避免业务层面导致的延迟问题。在开发过程中,业务层面的优化建议如下: key的长度尽量要短,在数据量非常大时,过长的key名会占用更多的内存 一定避免存储过大的数据(大value),过大的数据在分配内存和释放内存时耗时严重,会阻塞主线程 Redis 4.0以上建议开启lazy-free机制,释放大valu

2020-09-09 09:06:26 235

原创 Redis为什么变慢了

使用复杂度高的命令 存储大key 集中过期 实例内存达到上限 fork耗时严重 绑定CPU 开启AOF 使用Swap 网卡负载过高 总结 Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头雾水。很多时候,Redis出现访问延迟变大,都与我们的使用不当或运维不合..

2020-09-09 09:04:59 541

原创 maven如何编译java和kotlin编码的混合项目

一、前提 应用程序同时使用java和kotlin两种开发语言,则必须在 Java 编译器之前调用 Kotlin 编译器。 二、解决方案 根据 maven 的方式,则需要在 maven-compiler-plugin 之前运行 kotlin-maven-plugin,因此我们要确保 pom.xml 文件中的 kotlin 插件位于 mav...

2020-03-26 16:19:03 2085

转载 蚂蚁消息中间件 (MsgBroker) 在 YGC 优化上的探索

GC 一直是 Java 应用中被讨论得最多的话题之一,尤其对于消息中间件这样的基础应用,GC 停顿产生的延迟会严重影响其在线服务能力,是开发和运维人员关注的重点。关于 GC 优化,首先最容易想到的就是调整那些影响 GC 性能的 JVM 参数(如新生代与老年代的大小、晋升到老年代的年龄、甚至是 GC 回收器类型等),使得老年代中存活的对象数量尽可能的少,从而降低 GC 停顿时间。然而,除了少数较...

2019-12-14 17:46:37 553 1

原创 BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor以及BeanPostProcessor执行先后顺序

1、BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor以及BeanPostProcessor都属于Spring的后置处理器,可以实现它们以达到动态注册bean定义,动态修改bean定义,以及动态修改bean。2、BeanDefinitionRegistryPostProcessor继承接口BeanFactoryPostPro...

2019-12-11 16:24:13 2106 1

转载 MySQL:change buffer

1、change bufferInnoDB的数据是按数据页为单位来读写的。也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。在InnoDB中,每个数据页的大小默认是16KB。在更新数据页时,首先去内存中查看是否有这个数据页,如果在内存中有,就直接更新;如果内存中没有这个数据页的话,InnoDB就会将这些更...

2019-11-05 09:11:43 88

原创 spring基于注解的方式注册bean的集中方式

spring容器帮我们管理bean,因此需要将bean注册在spring容器中,而bean可以通过xml或者注解的方式进行注册,基于xml的配置一般是通过<bean>、<context:component-scan>等xml标签配合进行配置,然后由spring容器扫描xml文件进行注册;基于注解的注册主要是通过几种spring定义的注解进行配置,同样是由sp...

2019-11-02 11:27:27 202

原创 JVM反射调用优化,导致发生大量异常时log4j2线程阻塞

在使用log4j2打日志时,当发生大量异常时,造成大量线程block问题的问题。大量线程block原因发生异常,打印异常栈时,会调用org.apache.logging.log4j.core.impl.ThrowableProxy.toExtendedStackTrace方法。ThrowableProxy.toExtendedStackTrace内部会进行loadCla...

2019-10-31 10:49:32 952

转载 SpringMVC支持版本管理的Restful接口

需求移动互联网时代的到来,软件开发的模式也在变化。记得以前做B/S的后台开发,基本上没有Http接口一说,全部是通过渲染模板技术(jsp,freemark)把最终html展示给最终用户。现在完全变了,基于后台接口提供方,我们从来不是针对只是浏览器展示的后台输出,而是各种终端,比如android,ios。所以设计接口的时候一定要小心,一旦放出去的接口可能就永远都难以变动(除非你强制客户端用户升级...

2019-10-15 09:47:13 122

原创 使用Maven运行注解处理器

1、注解处理器介绍 注解处理器其实全称叫Pluggable Annotation Processing API,插入式注解处理器,它是对JSR269提案的实现。它是怎么工作的呢?可以参考下图:1.parse and enter:解析和输入,java编译器这个阶段会把源代码进行词法、语法分析,自动填充符号表,接着解析生成AST(抽象语法分析树);2.annotati...

2019-10-08 17:02:57 1789

转载 WebMvcConfigurationSupport与WebMvcConfigurer的关系

在spring中配置WebMvc时有两种方法,一种是继承WebMvcConfigurationSupport,重写里面相应的方法,还有一种是继承WebMvcConfigurer的子抽象类WebMvcConfigurerAdapter,也是重写里面相应的方法,但是需要在配置类上添加@EnableWebMvc注解。那这两个类直接是什么关系呢? WebMvcConfigur...

2019-09-30 10:02:25 321

原创 JVM的逃逸分析详解

即时编译(Just In Time,简称JIT)是一种通过在运行时将字节码翻译成机器码,从而改善字节码编译语言性能技术。逃逸分析并不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其他优化手段,如同步消除、栈上分配和标量替换等提供依据。 发生逃逸行为的情况有两种:方法逃逸和线程逃逸; 方法逃逸:当一个对象在方法中定义之后,作为参数...

2019-08-27 15:40:07 207

转载 图解分布式一致性协议Paxos

Paxos协议/算法是分布式系统中比较重要的协议,它有多重要呢?<分布式系统的事务处理>:Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品。<大规模分布式存储系统>:理解了这两个分布式协议之后(Paxos/2PC),学习其他分布式协议会变得相当容易。学习Paxos算法...

2019-08-20 11:14:20 148

转载 redis分布式锁RedLock解析

设计分布式锁需要哪些条件?首先应该是互斥性,即无论任何情况下,只能有一个客户端能够获得分布式锁;其次应该是安全性,不会发生死锁,即使是持有锁的客户端宕机;最后要考虑的应该是容错机制,当Redis某个节点异常的时候,该如何保证分布式锁的性能?用Redis来实现分布式锁最简单的方式就是在单实例里创建一个键值,创建出来的键值一般都是有一个超时时间的(这个是Redis自带的超时特性),所以...

2019-08-16 11:35:08 333

原创 使用Disruptor实现高效队列

关于Disruptor,本文就不做过多介绍,重点介绍项目引入Disruptor实现高效队列功能。1、pom文件引入依赖2、编写高效队列处理模板3、编写数据包装类4、编写默认异常处理类5、编写事件工厂类6、一个业务基础队列类,继承高效队列模板7、编写需要处理的数据对象8、编写一个事件类继承数据包装类9、编写一个事件消费者...

2019-07-24 16:56:47 373

原创 spring整合Drools规则引擎

项目中有一个特殊需求,需要根据一定的规则监控可疑的开票,鉴于规则的复杂性以及多变性,放弃硬编码的想法,引入Drools规则引擎,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。规则文件可以使用 .drl文件,也可以是xml文件,这里我们使用drl文件。接下来就直接上代码:第一步:maven引入Drools依赖第二步:在r...

2019-07-08 10:38:44 1452

原创 使用@TransactionalEventListener结合@Async在事务提交之后异步进行Event的处理

Spring的发布订阅模型实际上并不是异步的,而是同步的来将代码进行解耦。而TransactionEventListener仍是通过这种方式,只不过加入了回调的方式来解决,这样就能够在事务进行Commited,Rollback...等的时候才会去进行Event的处理。 实际上通过TransactionSynchronizationManager.registerSy...

2019-07-05 09:59:47 7072 3

转载 基于Java Instrument以及Attach api的Agent实现

0 介绍使用 Instrumentation,使得开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和 Java 类操作了,这样的特性实际上提供了 一种虚拟机级别支持的 AOP 实现方式,使得开发者无需对 JDK 做任何升级和改动,就可以实现某些 AOP 的...

2019-07-01 10:22:52 2046 1

原创 TransactionSynchronizationAdapter结合ThreadPoolExecutor实现事务后处理功能

项目中有一个功能涉及多个业务流程,且在同一个事务中,每个业务流程结束后都需要进行RPC调用,考虑到RPC调用的代价,决定做成异步调用,但是由于每个调用都必须在业务流程结束后进行,这时候就想到TransactionSynchronizationManager和TransactionSynchronizationAdapter。 TransactionSynchr...

2019-06-20 10:53:27 6408

转载 curator笔记-分布式锁的实现与原理

1.分布式锁在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题。但当我们的应用是分布式部署的情况下,那么就需要一种更加高级的锁机制来处理这个进程级别的代码同步问题。那么接下来引出现在比较常用的几种分布式锁实现方案,如下图:分布式锁的常用实现方案而在这几次的实现方案也是各有优缺点,对比如下:...

2019-06-19 10:15:42 265

原创 基于redisson实现快速缓存

package com.*.servicecore;import com.google.common.collect.*;import org.redisson.api.*;import java.util.*;import java.util.concurrent.TimeUnit;/** * @desc redis缓存工具类 * @author ly * @date 20...

2019-06-13 20:18:18 6071

原创 java利用软引用实现jvm缓存

在某些不存在缓存中间件的系统中,需要用到缓存,大多数时候都是使用map,但是map会占jvm内存,并且不会回收,缓存量大的情况会经常出现OOM错误,这时候就可以使用java的软引用结合map一起实现缓存机制。对于java的四种引用类型:强引用,软引用,弱引用,虚引用,这里就不做详细介绍。声明一下,软引用会在发生OOM之前,回收其中的对象。下面使用软引用结合map写一个对于内存敏感的高...

2019-06-12 11:06:01 1414

原创 Spring的context:component-scan 配置详解

一般我们在ApplicationContext.xml中会看到<context:component-scan>标签,同时在mvc-servlet.xml也会存在该标签,两者略微有点不同。ApplicationContext.xmlmvc-servlet.xml两者的区别可以理解为ApplicationContext是spring父容器,注册servic...

2019-06-06 10:40:46 1061

转载 Java魔法类:Unsafe应用解析

前言Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序...

2019-06-04 14:31:42 98

原创 并发框架Disruptor小demo

Disruptor是一个高性能的异步处理框架,或者可以认为是线程间通信的高效低延时的内存消息组件,它最大特点是高性能,其LMAX架构可以获得每秒6百万订单,用1微秒的延迟获得吞吐量为100K+。 关于Disruptor,可以参考http://ifeve.com/disruptor/。根据Disruptor优点,写了一个demo,仅供参考。下面直接贴代码。...

2019-05-30 10:17:37 400

转载 一篇对伪共享、缓存行填充和CPU缓存讲的很透彻的文章

认识CPU CacheCPU Cache概述随着CPU的频率不断提升,而内存的访问速度却没有质的突破,为了弥补访问内存的速度慢,充分发挥CPU的计算资源,提高CPU整体吞吐量,在CPU与内存之间引入了一级Cache。随着热点数据体积越来越大,一级Cache L1已经不满足发展的要求,引入了二级Cache L2,三级Cache L3。(注:若无特别说明,本文的Cache指CPU Cac...

2019-04-29 09:12:01 130

原创 简述三种实现动态代理代码

package com.bosssoft.nontax.agency.invoice.servicecore;import javassist.util.proxy.MethodHandler;import javassist.util.proxy.ProxyFactory;import org.springframework.cglib.proxy.Enhancer;import o...

2019-04-18 11:00:41 395

转载 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP

在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式。 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图。从3张图里我们看到了几点信息:1.CBO 使用的ALL_ROWS模式Oracle Optimizer CBO RBOhttp://www.cndba.cn/Dave/article...

2019-03-30 13:30:12 255

原创 JS中JSON.parse与eval的区别

相同点:JSON.parse与eval和能将一个字符串解析成一个JSON对象JSON.parse这方法只能解析属性名是双引号包裹的字符串对象,并会忽略换行和空格(值外面)。eval函数可将一个JavaScript代码字符串求值成特定的对象,所以解析成JSON对象只不过是作用之一。为什么eval()解析JSON字符串要加上括号?原因是两点:1. json对象是以”{}”的方式来开...

2019-03-18 20:14:28 302

原创 spring整合mybatis外部化配置文件详解

1、简单使用MapperFactoryBean: 我们知道在Mybatis的所有操作都是基于一个SqlSession的,而SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来生成的。但是Mybatis-Spring给我们封装了一个SqlSessionFactoryBean,在这...

2019-03-16 15:41:50 616

原创 详解synchronized 和ReentrantLock两种锁实现原理

概述Java 中的并发锁大致分为隐式锁和显式锁两种。隐式锁就是我们最常使用的 synchronized 关键字,显式锁主要包含两个接口:Lock 和 ReadWriteLock,主要实现类分别为ReentrantLock 和 ReentrantReadWriteLock,这两个类都是基于AQS(AbstractQueuedSynchronizer) 实现的。还有的地方将CAS也称为一种锁,...

2019-03-04 09:07:25 3812 1

转载 Oracle为分区表添加新分区

关键字:exchange partition unused ORA-14097 ORA-14323 CTAS需求:添加分区离线消息表OFFLMG,在原有分区的基础上添加一个分区。分析:数据量大1.该表有50张,从OFFLMG_0到OFFLMG_49,数据量比较大,最少的一张有几千万数据,50G左右,最大的一张有几亿数据,超过300G.2.该表为list分区表,有de...

2019-03-01 09:25:30 19764

原创 Spring加载classpath与classpath*的过程

Spring加载Resource文件是通过ResourceLoader来进行的,先来看看ResourceLoader的继承体系。本文重点分析左节点树资源解析器的源码。1、ResourceLoader类,由下图可见,ResourceLoader接口只提供了classpath前缀的支持2、接着看ResourceLoader子类ResourcePatternResolver,该类支持...

2019-02-25 20:43:03 2631

原创 redisson的分布式锁源码解析

RedissonLock.tryLockredisson-3.8.1-sources.jar!/org/redisson/RedissonLock.java @Override public boolean tryLock() { return get(tryLockAsync()); } @Override public RFut...

2019-02-14 09:26:08 406

转载 redis主从|哨兵|集群模式

一、主从通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。 。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此, ...

2019-02-14 09:15:53 592

转载 使用Redisson实现分布式锁,Spring AOP简化之

Redisson概述Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Se...

2019-01-14 09:54:48 330

原创 ORACLE的merge into与MYSQL的replace into以及on duplicate key

本文以mybatis为背景1、oracle用法:MERGE INTO une_cbill_cloud  c USING (            SELECT            #{fid,jdbcType=VARCHAR} fid,            #{fbid,jdbcType=VARCHAR} fbid,            #{fissueType,jdbcTy...

2019-01-09 09:15:07 1373

原创 利用存储过程向数据库插入对象集合

1、前提:由于公司一个业务需要向数据库插入集合对象,无论是一条一条插入,还是批量插入,都是相当耗时。所以打算利用存储过程传入list集合对象,提升效率。2、步骤:(1)数据库创建一个对象,对象字段和要插入的实体类属性对应create or replace type linkquery as object(  fid         VARCHAR2(32),  fbustype  ...

2018-12-28 15:39:40 2263

原创 环境变量JAVA_TOOL_OPTIONS、_JAVA_OPTIONS、JAVA_OPTS设置

1、JAVA_TOOL_OPTIONS是何物有些应用不方便设置JVM参数,如命令行应用、通过JNI(Java Native Interface)API调用虚拟机的应用、脚本嵌入虚拟机中的应用等。这种情况环境变量JAVA_TOOL_OPTIONS就非常有用了,它会被JNI API的JNI_CreateJavaVM函数使用。 Note:在有些场景为了安全考虑环境变量JAVA_TOOL_...

2018-12-25 20:49:27 25629

libsigar-aarch64-linux.so

sigar官方提供的动态库并不支持aarch64平台,所以将sigar源码拿到aarch64操作系统进行编译打包。

2020-12-29

空空如也

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

TA关注的人

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