自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 找出耗CPU的java线程脚本-优化版

查找java进程中耗CPU的线程,分为以下三步:1.列出进程id对应的线程idps -mp {pid} -o THREAD,tid,time2.将cpu占用高的线程id找出并转换为16进制printf “%x\n” {tid}3.打印出有问题的线程jstack {pid} |grep {tid} -A 30这样的方式有

2017-08-21 23:47:20 1548

原创 dubbo参数调优说明

dubbo作为一个服务治理框架,功能比较完善(相对),性能也还过得去。但很多朋友在使用dubbo的时候,只是简单的参考官方说明进行搭建,并没有过多的去思考一些关键参数的意义(也可能是时间紧任务多,没空出来研究),最终做出来的效果不可预知。 这里我根据目前我们项目的使用情况列出几个性能调优的参数,供大家参考。        在介绍参数之前,我们先了解下dubbo中配置的优先级,以免出现调优参数设

2016-07-13 22:28:50 44640 6

原创 dubbo源码分析-consumer端6-数据发送与接收

consumer端的数据经过处理后,最终进入发送的流程。接下来我们继续跟着数据的流向进行分析。 首先进入到了DubboInvoker,DubboInvoker中包含了多个ExchangeClient, 每个ExchangeClient都对应了一个物理连接,同一个DubboInvoker中的所有ExchangeClient都是连接的同一个ip/port。DubboInvoker循环的从Exchang

2016-07-07 00:28:58 3360

原创 redis集群客户端JedisCluster优化 - 管道(pipeline)模式支持

redis集群客户端JedisCluster优化 - 管道(pipeline)模式支持Redis在3.0版正式引入了集群这个特性,扩展变得非常简单。然而当你开心的升级到3.0后,却发现有些很好用的功能现在工作不了了, 比如我们今天要聊的pipeline功能。我们知道,普通的情况下,redis client与server之间采用的是请求应答的模式,即: Client: command1

2016-06-24 18:26:50 49837 13

原创 dubbo源码分析-consumer端5-Filter

前面一篇dubbo源码分析中,我们对ClusterInvoker和LoadBalance进行了分析,可以知道ClusterInvoker在一批Invoker中选择了一个Invoker来进行调用,而这里的Invoker是通过RegistryDirectory得到的,而RegistryDirectory返回的Invoker实现为:InvokerDelegete(RegistryDirectory的内部

2016-05-07 12:37:07 5687

原创 dubbo源码分析-consumer端4-ClusterInvoker与LoadBalance

dubbo中提供了多种集群调用策略:        1、FailbackClusterInvoker :  失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作;        2、FailfastClusterInvoker: 快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作;        3、FailoverClusterInvoker: 失败转移,当出

2016-04-23 16:10:13 6866 3

原创 dubbo源码分析-consumer端4-MockClusterInvoker

在前面几篇文章中,我们分析了consumer端的代理生成过程。创建完成后,应用就可以进行调用了,调用的代码如下: // 代理类中的sayHello方法 public String sayHello(String paramString) { // 将调用时的参数传入arrayOfObject中 Object[] arrayOfObject = new Object

2016-03-11 08:56:49 3375

原创 dubbo源码分析-consumer端3-Invoker创建流程

从前面一篇创建注册中心的流程当中,我们知道在从注册中心获取到provider的连接信息后,会通过连接创建Invoker。代码见com.alibaba.dubbo.registry.integration.RegistryDirectory的toInvokers方法:// protocol实现为com.alibaba.dubbo.rpc.Protocol$Adpative, // 之前

2016-03-08 14:04:19 5578

原创 javassist使用中遇到的问题记录

Javassit提供了运行时操作Java字节码的方法,其效率低于asm。javassist主要是提供了代码级别的修改(也有bytecode级别),相比与asm的字节码级别的修改,学习成本低,开发效率高。因此,在实际应用中javassist是一个非常不错的选择。以下是在使用javassist的过程中碰到的问题及处理方法:        1、ClassLoader问题

2016-03-01 11:07:41 6530

原创 dubbo源码分析-consumer端2-创建注册中心

前面一篇文章我们分析了consumer代理的生成。在代理生成的过程中,会创建注册服务(com.alibaba.dubbo.registry.Registry)。通过注册服务提供url注册、订阅、查找的功能。本篇我们详细的看看注册中心的创建过程

2016-02-29 14:27:41 4085

原创 dubbo源码分析-consumer端1-consumer代理生成

主要介绍dubbo的consumer代理类生成流程

2016-02-24 14:56:47 5676 3

原创 netty5笔记-总体流程分析5-客户端连接过程

前面几篇文章,我们从服务端的视角,分析了从启动到接收连接,到连接的read-write-close。现在我们开始切换到客户端的视角,看看客户端连接服务端的一些实现细节。还是从snoop的example代码开始,见HttpSnoopClient(稍有修改)

2016-01-26 18:00:52 1120

原创 netty5笔记-总体流程分析4-NioSocketChannel之服务端视角

NioSocketChannel之服务端视角上篇文章对NioServerSocketChannel进行了分析,了解了一个客户端连接在netty中是如何接收的。本篇我们将详细的了解服务端收到的连接的整个生命周期。需要说明的是由于采用的是服务端视角,因此一个连接的生命周期主要包括:创建读取数据写数据关闭创建快捷键加粗 Ctrl + B 斜体 Ctr

2016-01-13 11:40:19 5139

原创 netty5笔记-总体流程分析3-NioServerSocketChannel

前面我们讲了server的启动过程,同时介绍了其中非常重要的几个概念,ChannelPipeline,ChannelHandlerContext等。接下来我们看看server启动起来以后是如何运转的。

2016-01-09 15:23:32 2435

原创 netty5笔记-总体流程分析3-ChannelHandlerContext

上面一篇文章介绍了ChannelPipeline,它维护了一个有序的ChannelHandler列表,但并非是直接关联,而是通过维护ChannelHandlerContext进行关联。ChannelPipeline的每一个节点都是一个ChannelHandlerContext实例,不存在线程安全问题,而对应的ChannelHandler如果未标记Sharable也是新建的实例,也不存在线程安全问题

2016-01-02 23:29:41 15040 2

原创 netty5笔记-总体流程分析2-ChannelPipeline

上一篇文章中,我们介绍了ServerBootstrap的启动过程,在这个过程中引出了一个很重要的类ChannelPipeline。如果说内存池,线程模型是netty的基础,我们接触的相对来说并不是那么直接,那么ChannelPipeline则是我们开发中直接能够接触到的概念,如果对其不了解,很容易造成一些不正确的使用姿势或一些然并卵的优化。现在我们就来看看ChannelPipeline的作用到底是

2015-12-27 21:20:26 7972 1

原创 netty5笔记-总体流程分析1-ServerBootstrap启动

前面我们分析了netty内存池、线程模型,比较难的两个点已经被一一消化,接下来我们开始进入大家最关心的环节,总体流程分析。 这里我选了io.netty.example.http.snoop来作为分析的入口,分别从server端、client端的维度来看看netty是如果设计的。这里你将了解比较详细的netty处理流程,让你在今后的应用中不再感到疑惑 。 如果还有不清楚的地方,可以直接交流,通过交流

2015-12-21 12:29:39 5442

原创 netty5笔记-线程模型4-无锁队列MpscLinkedQueue

NioEventLoop里面使用了MpscLinkedQueue作为taskQueue,替换了父类中默认的LinkedBlockingQueue队列。taskQueue主要用于存放可执行任务,其调用的频率非常高,因此使用一个更高效的队列能带来很大的收益。 为什么在NioEvnetLoop里用MpscLinkedQueue替换了LinkedBlockingQueue,是使用了更好的算法?还是通过舍弃

2015-12-18 15:10:27 6287 1

原创 netty5笔记-concurrent-FastThreadLocal

并发的一个很大的敌人就是锁,很多时候我们必须加锁来应对并发带来的线程安全问题。而ThreadLocal则给我们开辟了另外一个思路,将数据与线程关联,一个线程无法读到其他线程的数据, 这样的数据存储方式,自然就能线程安全了。 那么ThreadLocal本身还有没有可以挖掘的优化点呢,号称性能极高的netty告诉你,有!        我们知道ThreadLocal的实现是在Thread里

2015-12-17 19:05:16 3549 2

原创 netty5笔记-线程模型3-EventLoop

NioEventLoop相对NioEventLoopGroup来说就复杂很多了,需要一定的耐心来看这篇文章。        首先从NioEventLoop的启动讲起,对于线程池来说,启动一般都是从第一个任务的添加开始的。经过跟踪,找到execute()方法在SingleThreadEventExecutor类中: public void execute(Runnable task)

2015-12-15 10:17:17 3463

原创 netty5笔记-线程模型2-EventLoopGroup

阅读本文之前,你需要对java的线程池有一定的了解,因为这里不会过多的讲解。    今天我们主要的任务就是看下netty中一个非常重要的类EventLoop,通过这篇文章,你应该了解EventLoop适用的场景,不会滥用它而导致你的应用缓慢。Netty适用了典型的Reactor模型结构,这其中一个很重要的角色就是EventLoop,它使用循环的方式来处理已经准备好的IO或者其他事件。

2015-12-13 13:19:43 7845

原创 netty5笔记-线程模型1-Promise

冬天实在太冷了,习惯了广东的天气,突然换个地方还真有点不适应, 早就想写的学习笔记也一直拖到现在。下面进入正题,一起来学习下netty的线程池实现。 我们知道java本身实现了一套线程池,即我们常见的ExecutorService。那么netty为什么还要定义自己的线程模型,什么时候适合用netty线程池,什么时候适合用ExecutorService。相信你看了这几篇文章就会有眉目。

2015-12-13 01:03:37 5833

原创 netty5学习笔记-内存池6-可调优参数

如果你看了前面的几篇内存池的介绍,你可能会觉得并没有什么卵用。 这里就搞点有用的 -- netty内存池可调优参数参数名说明默认值io.netty.allocator.pageSizepage的大小8192io.netty.allocator.maxOrder一个chunk的大小=pageSize 11io.n

2015-11-26 12:38:29 5413 2

原创 netty5学习笔记-内存池5-PoolThreadCache

看了前面的PoolArena分析,我们知道PoolArena在分配内存时,使用了synchronized来保证线程安全,这样就带来了一定的效率问题。如何能再此基础上再优化呢,答案很简单,使用ThreadLocal类似的解决方案避免加锁! 为什么可以使用ThreadLocal,如果了解过netty线程模型(有兴趣后续可以一起学习),应该知道netty的woker线程池,它负责了数据的接收、发送(编解

2015-11-25 20:52:45 4013

原创 netty5学习笔记-内存池4-PoolArena

前面我们讲到了内存池中的几个重要的类:        1、PoolChunk:维护一段连续内存,并负责内存块分配与回收,其中比较重要的两个概念:page:可分配的最小内存块单位;chunk:page的集合;        2、PoolSubpage:将page分为更小的块进行维护;        3、PoolChunkList:维护多个PoolChunk的生命周期。

2015-09-02 22:14:49 3625 6

原创 netty5学习笔记-内存池3-PoolChunkList

前面我们介绍了PoolChunk以及针对page的更细粒度的PoolSubpage,其实在chunk的上层还有一个管理类:PoolChunkList,PoolChunkList负责管理多个chunk的生命周期,在此基础上对内存分配进行进一步的优化,那它是如何去做的呢?我们来简单的了解下,先看看它的几个属性:PoolArena arena; // 这个东西又出现了,看来是个终极boss啊,后面再

2015-08-29 10:43:54 3232

原创 netty5学习笔记-内存池2-PoolSubpage

前面我们讲过了负责内存分配的类PoolChunk,它最小的分配单位为page, 而默认的page size为8K。在实际的应用中,会存在很多小块内存的分配,如果小块内存也占用一个page明显很浪费,针对这种情况,可以将8K的page拆成更小的块,这已经超出chunk的管理范围了,这个时候就出现了PoolSubpage, 其实PoolSubpage做的事情和PoolChunk做的事情类似,只是Poo

2015-08-25 21:39:04 2882 3

原创 netty5学习笔记-内存池1-PoolChunk

从netty 4开始,netty加入了内存池管理,采用内存池管理比普通的new ByteBuf性能提高了数(2)十倍。相信有些朋友会和我一样,对他的实现方式很感兴趣。这里把学习netty内存池的过程记录下来,与大家一起分享。首先给大家介绍的是PoolChunk, 该类主要负责内存块的分配与回收,下面看看几个重要的术语:page: 可以分配的最小的内存块单位。chunk: chunk是一

2015-08-23 21:34:14 8010 1

原创 netty5学习笔记-内存泄露检测

netty中用到内存泄露检测的地方主要有:1、CompositeByteBuf;2、HashedWheelTimer;3、继承AbstractByteBufAllocator的几个类。下面我们看看,netty里的内存检测类ResourceLeakDetector的具体实现:

2015-08-23 16:49:04 5948 2

空空如也

空空如也

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

TA关注的人

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