自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何正确设置线程池的线程数,提高性能

往往在生产环境中,工作线程数,设置小了,无法充分利用CPU资源,性能会下降。设置大,线程上下文切换过于频繁(可以关注一下协程,如java库提供的Quasar fiber轻量级线程、kilim以及kotlin语言支持的协程。java线程是用户线程与内核线程之间映射的,1:1模式,是通过内核完成调度的。而协程是N个内核线程多路复用M个协程的,N:M的模式,也就是在用户态的协程调度器完成的,减少了与内核之前的交互。可以很好的避免上下文切换。),反而会使性能降低.如何设置线程池的线程数首先我们先理解多线程执行的

2020-11-09 13:22:26 3447

原创 响应式编程(1)-Reactor

1、响应式编程的出现我们平时写的代码大多数都是串行的,也就是传统编程,就会带来了以下的问题:阻塞导致性能瓶颈和浪费资源增加线程可能会引起资源竞争和并发问题(这是解决其中的一种办法)引入了异步编程,然后也会带来了一下问题:Callbacks 是解决非阻塞的方案,但是随着业务代码太多了,回调也会很多,他们之间很难组合,最终导致网中流行的“Callback Hell”,翻译为回调地狱Futures 相对于 Callbacks 好一点,不过还是无法组合,但是到了java8中,引入了 Comple

2020-08-02 19:22:45 766 1

原创 android9.0以上glib可能会显示不出来图片,存在兼容性的问题

当时做项目的时候,用了glide加载网络图片,当时在Android9.0以下的手机都是显示正常的在9.0以上发现只显示glide默认的图片 ,于是百度了,找到了答案。在这里记一下解决方案很简单,在AndroidManifest.xml文件里, application字段里 加入 android:usesCleartextTraffic="true"就可以了,图片就会正常显示...

2019-10-08 10:42:13 393

原创 学习springCloud(十)之config配置中心

Zookeeper其实是实现过分布式的配置中心,springcloudconfig的核心作用其实就是在于对配置进行管理虽然springcloud使用springboot进行开发,节省了大量的配置文件,但每个服务依然有自己的application.yml配置文件,而且每个服务一般都有负载均衡,所以,这么依赖对于配置文件的统一管理就非常有必要了。上图是springcloudconfig总体结构图...

2019-10-07 17:27:33 274

原创 学习springCloud(九)之zuul路由

前面介绍了微服务都是通过Eureka找到的,但是在很多开发中为了规范微服务的使用,提供有一个处理控制器ZuulZuul其实是一个API网关,类似于设计模式里面的Facade门面模式,他的存在就像是整个微服务的门面,所有的外部客户端访问都需要经过它来进行调度与过滤zuul的基本使用新建立一个模块【springcloud-zuul-gateway】【springcloud-zuul-gatew...

2019-10-07 16:58:22 187

原创 学习springCloud(八)之Hystrix熔断机制

在分布式环境下,微服务之间不可避免的发生互相调用的情况,但是没有一个系统是能保证自身绝对正确的,在服务的调用过程中,很可能面临服务失败的问题,因此需要一个公共组件能够在服务通过网络请求访问其他微服务时,能对服务失效情况下有很强的容错能力,对微服务提供保护和监控。Hystrix是netflix的一个开源项目,他能够在依赖服务失效的情况下,通过隔离系统依赖的方式,防止服务的级联失败(服务的雪崩)...

2019-10-05 21:37:04 260

原创 学习springCloud(七)之Feign接口服务

前面已经简述了Ribbon负载均衡,从Eureka获取服务的实例在通过RestTemplate调用,并转换成需要的对象 List<Product> list = restTemplate.exchange(PRODUCT_LIST_URL,HttpMethod.GET,new HttpEntity<Object>(httpHeaders), List.class).get...

2019-10-05 21:11:54 265

原创 学习springCloud(六)之Ribbon负载均衡(下)

上篇文件主要是简述了Ribbon的基本的使用,以及Ribbon的负载均衡的实现学习springCloud(六)之Ribbon负载均衡(上)今天简述的是springCloud的自定义Ribbon负载均衡自定义Ribbon路由前面已经使用Ribbon实现了路由,通过测试,也不难发现默认Ribbon使用的路由策略是轮询,可以看下源代码BaseLoadBalancer全局路由配置这种负载均衡的...

2019-10-04 21:30:58 192

原创 学习springCloud(五)之Ribbon负载均衡(上)

现在服务提供方已经可以通过Eureka进行注册了,但对于服务的消费者,目前并没有处理,对于服务的消费方,也应该连接上eureka,进行服务的获取,这个时候就应该使用Ribbon这个组件了。ribbon对应的pom文件如下<dependency> <groupId>org.springframework.cloud</groupId> <ar...

2019-10-04 21:19:05 201

原创 学习springCloud(四)之Eureka注册中心(下)

上篇文章主要是简述了Eureka的服务使用,以及怎么将服务的提供方注册到Eureka注册中心学习springCloud之Eureka注册中心(上)接下来主要是简述了Eureka的高可用配置。Eureka的安全机制一般情况下Eureka 和服务的提供注册者都会在一个内网环境中,但免不了在某些项目中需要让其他外网的服务注册到Eureka,这个时候就有必要让Eureka增加一套安全认证机制了,让所...

2019-10-04 17:02:43 215

原创 学习springCloud(三)之Eureka注册中心(上)

Eureka服务注册与发现在学习zookeeper的时候,整理了服务注册与发现的流程,dubbo就是基于zookeeper来实现服务注册与发现的。基于zookeeper的服务注册与发现大致流程如下而在SpringCloud中,大量使用了Netflix的开源项目,其中Eureka就属于Netflix 提供的发现服务组件,所有的微服务都注册到Eureka中,它在其中扮演的就是注册中心的角色,后...

2019-10-04 16:44:25 160

原创 学习springCloud(二)之SpringSecurity安全验证配置

服务提供方配置安全验证前面的文章只是简单搭建了服务之间的调用,学习springCloud(一)之项目的搭建使用了RestTemplate进行远程接口调用,但要注意,这些Rest服务最终都可能暴露在公网的,任何人都可能调用,如果你的Rest服务属于一些私密信息,这样会导致信息的泄露。如果想进行安全方面的处理,首先要在服务的提供方上进行处理。【springcloud-provider-prod...

2019-10-03 15:26:40 2071

原创 学习springCloud(一)之项目的搭建

既然是微服务,整个项目必然会分成一个个微模块,microcloud-api 模块,作为公共的信息导入配置模块;microcloud-provider-product:作为服务提供者;microcloud-consumer:作为微服务调用的客户端使用;microcloud 父模块新建立一个maven项目:microcloud其中pom文件如下<?xml version="1.0"...

2019-10-03 15:02:25 254

原创 如何理解RESTfull的幂等性

理解RESTful的幂等性,并且设计符合幂等规范的高质量RESTful API。怎么理解幂等性HTTP幂等方法,是指无论调用多少次都不会有不同结果的 HTTP 方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。还是以之前的博文的例子为例。【GET】 /users # 查询用户信息列表【GET】 /users/1...

2019-10-02 11:29:31 494

原创 如何设计一个良好的API接口

版本号在 RESTful API 中,API 接口应该尽量兼容之前的版本。但是,在实际业务开发场景中,可能随着业务需求的不断迭代,现有的 API 接口无法支持旧版本的适配,此时如果强制升级服务端的 API 接口将导致客户端旧有功能出现故障。实际上,Web 端是部署在服务器,因此它可以很容易为了适配服务端的新的 API 接口进行版本升级,然而像 Android 端、IOS 端、PC 端等其他客户端...

2019-10-02 11:20:26 937

原创 mybatis解析核心源码(三):数据读写阶段

好了,到了我们关心的事情了,我们通过代理获得了mapper文件,然后执行映射文件的方法执行了mapper文件里面的sql语句。由于executor的代码量有点多,这次只是解释总体的流程1、executor是mybatis的核心接口之一了,总体使用了模板方法模式实现的。定义了数据库操作最基本的方法,sqlsession的功能都是基于它来实现的2、Executor的三个核心实现类:Simpl...

2019-09-22 17:30:58 134

原创 mybati解析核心源码(二):代理阶段

我们先来看一个问题:为什么使用mapper接口就能操作数据库呢?其实也就是解析mapper文件然后通过动态代理增强,找到了session中对应的方法执行,找到了命名空间和方法名,然后通过传递参数,最终可以通过sql语句访问数据库。1、通过将java pojo对象传到getmappermapperRegistry类主要是mapper接口和对应的代理对象工厂的注册中心。2、通过Mappe...

2019-09-22 17:14:36 206

原创 后端性能优化的指标

网站的性能测试性能测试是性能优化的前提,也是性能优化结果的检查和度量标准。性能测试的常用指标:响应时间并发数目吞吐量。常用的吞吐量指标:  ①TPS(每秒事务数)、②HPS(每秒Http请求数)、③QPS(每秒查询数,)性能计数器。常用的性能计数器有:System Load、对象和线程数、CPU使用、内存使用、磁盘和网络IO等指标。 性能测试的几个参考点:性能测试负载测试:系...

2019-09-19 11:49:38 2058

原创 mybatis解析核心源码(一):初始化阶段

一:创建sqlsessionFactory对象其实初始化就是通过《建造者模式》创建出来的工厂类。目的就是将mybatis的配置文件进行解析的操作。具体的建造者模式的模型:其中:xmlconfigBuilder:主要是负责mybatis-config.xml里面的参数字段xmlMapperBuilder:主要是负责解析映射配置文件,也就是mybatis-config.xml配置文件里面...

2019-09-18 16:47:32 198

原创 谈谈jvm调优的经验

一般jvm调优可以从三个方面去调优1、调整新生代的大小到最合适和老年代的大小最合适(上线的时候)2、选择合适的GC回收器3、代码的调优首先通过在线上服务通过命令行jps -vVml,查找你当前项目的服务的id然后通过jstat -gc <服务的id>,查看新生代触发的次数,以及垃圾回收所消耗的时间,查看老年代触发的次数,以及垃圾回收所消耗的时间。并且通过打开GC日记,或者是...

2019-09-12 18:42:54 1822 1

原创 jvm调优的jstat命令查看GC

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:1、类加载统计: - Loaded:加载class的数量 - Bytes:所占用空间大小 - Unloaded:未加载数量 - Bytes:未加载占用空间 - Time:时间2、编译统计 - Compiled:编译数量。 - Failed:失败数量 - Inval...

2019-09-12 14:57:49 668

原创 MySQL数据库为什么大多使用B+树,而不是用Hash存储索引

通常B+数据的查询时间为log(n),而利用Hash时间为o(1),那为什么还要用B+树呢。对于B+树,相比于Hash好处:1.利用Hash需要把数据全部加载到内存中,如果数据量大,是一件很消耗内存的事,而采用B+树,是基于按照节点分段加载,由此减少内存消耗。2.和业务场景有段,对于唯一查找(查找一个值),Hash确实更快,但数据库中经常查询多条数据,这时候由于B+数据的有序性,与叶子节点又...

2019-09-01 15:45:02 613

原创 MyBatis where、set、trim标签的用法

1 where用法<where>标签的作用:如果该便签包含的元素中有返回值,就插入一个where;如果where后面的字符串是一and或or开头的,就将它们剔除掉。 案例分析 当if条件不满足的时候,where元素中没有任何内容,所以SQL中不会出现where,也就 不存在4.1.1节中的SQL错误的问题。如果if条件满足,whe...

2019-08-31 16:04:50 1272

原创 分布式锁解决并发的三种实现方式

分布式锁解决并发的三种实现方式在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。有的时候,我们需要保证一个方法在同 一时间内只能被同一个线程执行。在单机环境中,Java中其实提供了很多并发处理相关的API,但是这些API在分布式场景中就无能为力了。也就是说单纯的Java Api并不能提供分布式锁的能力。所以针对分布式锁的实现目前有多种方案:分布式...

2019-08-25 16:58:10 255

原创 zookeeper的zab协议原理

zookeeper的集群特点 顺序一致性客户端的更新顺序与它们被发送的顺序相一致。 原子性更新操作要么成功要么失败,没有第三种结果。 单一视图无论客户端连接到哪一个服务器,客户端将看到相同的 ZooKeeper 视图。 可靠性一旦一个更新操作被应用,那么在客户端再次更新它之前,它的值将不会改变。 实时性连接上一个服务端数据修改,所以其他的服务端都会实时的跟新,不算完全...

2019-08-25 16:31:47 643

原创 深入理解JVM虚拟机之堆、栈、堆栈,常量池的区别

先说一下栈和堆栈,我们听老一辈的程序员一般都会说堆栈,其实栈就是堆栈的意思,连着叫只是由于历史的原因。博主04年学数据结构的时候,书上都是说的堆栈,FILO(先进后出),也经常拿堆栈和队列,FIFO(先进先出)这两种数据结构拿来作比较。系统中的堆、栈 和 数据结构堆、栈系统中的堆、栈和数据结构堆、栈不是一个概念。可以说系统中的堆、栈是真实的内存物理区,数据结构中的堆、栈是抽象的数据存储结构...

2019-06-13 16:13:19 3002 2

原创 深入理解JVM之内存结构(栈,堆划分)

一、JVM的整体流程JVM在运行过程中会把它所管理的内存划分成若干不同的数据区域!线程私有:程序计数器、虚拟机栈、本地方法栈线程共享:堆、方法区二、线程私有程序计数器指向当前线程正在执行的字节码指令的地址(行号),JVM里面唯一不会发生OOM的区域。java是多线程,为了记录线程之间的切换。确保在多线程的情况下能正常执行。本地方法栈其实就是native方法调用了jni层...

2019-06-05 17:31:26 1466 1

原创 深入理解JVM之堆内存(年经代,老年代)

一、为什么会有年轻代我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很...

2019-06-05 15:00:13 2121

原创 深入源码学习1.8的ConcurrentHashMap(二)

一、ConcurrentHashMap的使用方法实现1、get操作get方法比较简单,给定一个key来确定value的时候,必须满足两个条件 key相同 hash值相同,对于节点可能在链表或树上的情况,需要分别去查找。2、put操作put方法就是,沿用HashMap的put方法的思想,根据hash值计算这个新插入的点在table中的位置i,如果i位置是空的,直接放进去,否则进行判断,...

2019-05-23 14:34:18 187

原创 深入源码学习1.8的ConcurrentHashMap(一)

一、1.8的ConcurrentHashMap实现流程与1.7的不同点,改进点:改进一:取消segments字段,直接采用transient volatile HashEntry<K,V>[] table保存数据,采用table数组元素作为锁,从而实现了对缩小锁的粒度,进一步减少并发冲突的概率,并大量使用了采用了 CAS + synchronized 来保证并发安全性。改进二:...

2019-05-23 14:10:24 186

原创 深入源码学习1.7的ConcurrentHashMap(二)

一、ConcurrentHashMap的使用方法实现1、get操作get操作先经过一次再散列,然后使用这个散列值通过散列运算定位到Segment(使用了散列值的高位部分),再通过散列算法定位到table(使用了散列值的全部)。整个get过程,没有加锁,而是通过volatile保证get总是可以拿到最新值。segment下的HashEntry数组用了transient字段修饰,不能被反序列化。...

2019-05-22 17:18:12 144

原创 深入源码学习1.7的ConcurrentHashMap(一)

一、ConcurrentHashMap的实现流程1、ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组。Segment的结构和Hash...

2019-05-22 14:35:21 181

原创 深入源码学习ThreadLocal之使用的导致的内存泄露和线程不安全的问题(三)

一、ThreadLocal导致的内存泄露1、根据前面的深入源码学习threadLocal(二)对ThreadLocal的分析,我们可以知道每个Thread 维护一个 ThreadLocalMap,这个映射表的 key 是 ThreadLocal实例本身,value 是真正需要存储的 Object,也就是说 ThreadLocal 本身并不存储值,它只是作为一个 key 来让线程从 ThreadL...

2019-05-15 15:06:53 422

原创 深入源码学习ThreadLocal(二)

一、ThreadLocal源码解析1、首先取到当前线程,然后调用getMap方法获取对应的ThreadLocalMap,ThreadLocalMap是ThreadLocal的静态内部类,然后Thread类中有一个这样类型成员,所以getMap是直接返回Thread的成员。 /** * Returns the value in the current thread's copy...

2019-05-14 11:35:44 187

原创 深入源码学习ThreadLocal(一)

一、ThreadLocal的作用ThreadLocal为每个线程都提供了变量的副本,使得每个线程在某一时间訪问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。而synchronized是利用锁的机制,使变量或代码块在某一时该仅仅能被一个线程访问。开发中遇到的例子:Spring的事务就借助了ThreadLocal类。Spring会从数据库连接池中获得一个数据库connection,然...

2019-05-14 11:07:07 199

原创 深入学习线程池总结(二)

一、深入源码解析线程池的方法参数1、常用的线程方法public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFact...

2019-05-13 15:05:37 158

原创 深入学习线程池总结(一)

1、线程池的作用第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。线程池技术正是关注如何缩短或调整T1,T3时间...

2019-05-13 14:48:07 201

原创 Redis 高可用解决方案总结

一、常见使用方式Redis 的几种常见使用方式包括:Redis 单副本;Redis 多副本(主从);Redis Sentinel(哨兵);Redis Cluster;Redis 自研。二、各种使用方式的优缺点1、Redis 单副本Redis 单副本,采用单个 Redis 节点部署架构,没有备用节点实时同步数据,不提供数据持久化和备份策略,适用于数据可靠性要求不高的纯缓存业务场景。...

2019-04-08 21:24:26 155

原创 anroid AudioRecord兼容手机

近期做项目,需要用AudioRecord实现录音,但是由于android 机型太多,适配有点不好。目前遇见小米6会出现初始化mAudioRecord.startRecording();报错startRecording() called on an uninitialized AudioRecord,查了很多资料大多数都是录音权限的问题,但是设置了还不行,后来通过不同的采样率(44100, 2205...

2019-03-08 13:45:23 490

原创 android 自定义view,缩放放大,平移边界检测

由于项目的需要,自定义个view,控制父控件,既可以缩放放大,滑动边界检测。自己实现了通过父控件就能操作子控件的自定义view,直接引用就可以使用。下面是我实现的一个思路,贴了部分代码,大家可以参考。具体的核心代码我都上传到了我的github上了,大家可以下载试试,感觉好的话,大家给个stardemo下载在MainActivity调用这个方法去初始化就可以了 : //parentView...

2019-03-07 14:20:37 4273

空空如也

空空如也

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

TA关注的人

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