- 博客(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
1610
原创 dubbo参数调优说明
dubbo作为一个服务治理框架,功能比较完善(相对),性能也还过得去。但很多朋友在使用dubbo的时候,只是简单的参考官方说明进行搭建,并没有过多的去思考一些关键参数的意义(也可能是时间紧任务多,没空出来研究),最终做出来的效果不可预知。 这里我根据目前我们项目的使用情况列出几个性能调优的参数,供大家参考。 在介绍参数之前,我们先了解下dubbo中配置的优先级,以免出现调优参数设
2016-07-13 22:28:50
44921
3
原创 dubbo源码分析-consumer端6-数据发送与接收
consumer端的数据经过处理后,最终进入发送的流程。接下来我们继续跟着数据的流向进行分析。 首先进入到了DubboInvoker,DubboInvoker中包含了多个ExchangeClient, 每个ExchangeClient都对应了一个物理连接,同一个DubboInvoker中的所有ExchangeClient都是连接的同一个ip/port。DubboInvoker循环的从Exchang
2016-07-07 00:28:58
3432
原创 redis集群客户端JedisCluster优化 - 管道(pipeline)模式支持
redis集群客户端JedisCluster优化 - 管道(pipeline)模式支持Redis在3.0版正式引入了集群这个特性,扩展变得非常简单。然而当你开心的升级到3.0后,却发现有些很好用的功能现在工作不了了, 比如我们今天要聊的pipeline功能。我们知道,普通的情况下,redis client与server之间采用的是请求应答的模式,即: Client: command1
2016-06-24 18:26:50
50501
4
原创 dubbo源码分析-consumer端5-Filter
前面一篇dubbo源码分析中,我们对ClusterInvoker和LoadBalance进行了分析,可以知道ClusterInvoker在一批Invoker中选择了一个Invoker来进行调用,而这里的Invoker是通过RegistryDirectory得到的,而RegistryDirectory返回的Invoker实现为:InvokerDelegete(RegistryDirectory的内部
2016-05-07 12:37:07
5779
原创 dubbo源码分析-consumer端4-ClusterInvoker与LoadBalance
dubbo中提供了多种集群调用策略: 1、FailbackClusterInvoker : 失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作; 2、FailfastClusterInvoker: 快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作; 3、FailoverClusterInvoker: 失败转移,当出
2016-04-23 16:10:13
6986
1
原创 dubbo源码分析-consumer端4-MockClusterInvoker
在前面几篇文章中,我们分析了consumer端的代理生成过程。创建完成后,应用就可以进行调用了,调用的代码如下: // 代理类中的sayHello方法 public String sayHello(String paramString) { // 将调用时的参数传入arrayOfObject中 Object[] arrayOfObject = new Object
2016-03-11 08:56:49
3468
原创 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
5681
原创 javassist使用中遇到的问题记录
Javassit提供了运行时操作Java字节码的方法,其效率低于asm。javassist主要是提供了代码级别的修改(也有bytecode级别),相比与asm的字节码级别的修改,学习成本低,开发效率高。因此,在实际应用中javassist是一个非常不错的选择。以下是在使用javassist的过程中碰到的问题及处理方法: 1、ClassLoader问题
2016-03-01 11:07:41
6678
原创 dubbo源码分析-consumer端2-创建注册中心
前面一篇文章我们分析了consumer代理的生成。在代理生成的过程中,会创建注册服务(com.alibaba.dubbo.registry.Registry)。通过注册服务提供url注册、订阅、查找的功能。本篇我们详细的看看注册中心的创建过程
2016-02-29 14:27:41
4194
原创 netty5笔记-总体流程分析5-客户端连接过程
前面几篇文章,我们从服务端的视角,分析了从启动到接收连接,到连接的read-write-close。现在我们开始切换到客户端的视角,看看客户端连接服务端的一些实现细节。还是从snoop的example代码开始,见HttpSnoopClient(稍有修改)
2016-01-26 18:00:52
1161
原创 netty5笔记-总体流程分析4-NioSocketChannel之服务端视角
NioSocketChannel之服务端视角上篇文章对NioServerSocketChannel进行了分析,了解了一个客户端连接在netty中是如何接收的。本篇我们将详细的了解服务端收到的连接的整个生命周期。需要说明的是由于采用的是服务端视角,因此一个连接的生命周期主要包括:创建读取数据写数据关闭创建快捷键加粗 Ctrl + B 斜体 Ctr
2016-01-13 11:40:19
5192
原创 netty5笔记-总体流程分析3-NioServerSocketChannel
前面我们讲了server的启动过程,同时介绍了其中非常重要的几个概念,ChannelPipeline,ChannelHandlerContext等。接下来我们看看server启动起来以后是如何运转的。
2016-01-09 15:23:32
2494
原创 netty5笔记-总体流程分析3-ChannelHandlerContext
上面一篇文章介绍了ChannelPipeline,它维护了一个有序的ChannelHandler列表,但并非是直接关联,而是通过维护ChannelHandlerContext进行关联。ChannelPipeline的每一个节点都是一个ChannelHandlerContext实例,不存在线程安全问题,而对应的ChannelHandler如果未标记Sharable也是新建的实例,也不存在线程安全问题
2016-01-02 23:29:41
15110
原创 netty5笔记-总体流程分析2-ChannelPipeline
上一篇文章中,我们介绍了ServerBootstrap的启动过程,在这个过程中引出了一个很重要的类ChannelPipeline。如果说内存池,线程模型是netty的基础,我们接触的相对来说并不是那么直接,那么ChannelPipeline则是我们开发中直接能够接触到的概念,如果对其不了解,很容易造成一些不正确的使用姿势或一些然并卵的优化。现在我们就来看看ChannelPipeline的作用到底是
2015-12-27 21:20:26
8048
1
原创 netty5笔记-总体流程分析1-ServerBootstrap启动
前面我们分析了netty内存池、线程模型,比较难的两个点已经被一一消化,接下来我们开始进入大家最关心的环节,总体流程分析。 这里我选了io.netty.example.http.snoop来作为分析的入口,分别从server端、client端的维度来看看netty是如果设计的。这里你将了解比较详细的netty处理流程,让你在今后的应用中不再感到疑惑 。 如果还有不清楚的地方,可以直接交流,通过交流
2015-12-21 12:29:39
5636
原创 netty5笔记-线程模型4-无锁队列MpscLinkedQueue
NioEventLoop里面使用了MpscLinkedQueue作为taskQueue,替换了父类中默认的LinkedBlockingQueue队列。taskQueue主要用于存放可执行任务,其调用的频率非常高,因此使用一个更高效的队列能带来很大的收益。 为什么在NioEvnetLoop里用MpscLinkedQueue替换了LinkedBlockingQueue,是使用了更好的算法?还是通过舍弃
2015-12-18 15:10:27
6373
原创 netty5笔记-concurrent-FastThreadLocal
并发的一个很大的敌人就是锁,很多时候我们必须加锁来应对并发带来的线程安全问题。而ThreadLocal则给我们开辟了另外一个思路,将数据与线程关联,一个线程无法读到其他线程的数据, 这样的数据存储方式,自然就能线程安全了。 那么ThreadLocal本身还有没有可以挖掘的优化点呢,号称性能极高的netty告诉你,有! 我们知道ThreadLocal的实现是在Thread里
2015-12-17 19:05:16
3598
2
原创 netty5笔记-线程模型3-EventLoop
NioEventLoop相对NioEventLoopGroup来说就复杂很多了,需要一定的耐心来看这篇文章。 首先从NioEventLoop的启动讲起,对于线程池来说,启动一般都是从第一个任务的添加开始的。经过跟踪,找到execute()方法在SingleThreadEventExecutor类中: public void execute(Runnable task)
2015-12-15 10:17:17
3517
原创 netty5笔记-线程模型2-EventLoopGroup
阅读本文之前,你需要对java的线程池有一定的了解,因为这里不会过多的讲解。 今天我们主要的任务就是看下netty中一个非常重要的类EventLoop,通过这篇文章,你应该了解EventLoop适用的场景,不会滥用它而导致你的应用缓慢。Netty适用了典型的Reactor模型结构,这其中一个很重要的角色就是EventLoop,它使用循环的方式来处理已经准备好的IO或者其他事件。
2015-12-13 13:19:43
7919
原创 netty5笔记-线程模型1-Promise
冬天实在太冷了,习惯了广东的天气,突然换个地方还真有点不适应, 早就想写的学习笔记也一直拖到现在。下面进入正题,一起来学习下netty的线程池实现。 我们知道java本身实现了一套线程池,即我们常见的ExecutorService。那么netty为什么还要定义自己的线程模型,什么时候适合用netty线程池,什么时候适合用ExecutorService。相信你看了这几篇文章就会有眉目。
2015-12-13 01:03:37
5964
原创 netty5学习笔记-内存池6-可调优参数
如果你看了前面的几篇内存池的介绍,你可能会觉得并没有什么卵用。 这里就搞点有用的 -- netty内存池可调优参数参数名说明默认值io.netty.allocator.pageSizepage的大小8192io.netty.allocator.maxOrder一个chunk的大小=pageSize 11io.n
2015-11-26 12:38:29
5483
原创 netty5学习笔记-内存池5-PoolThreadCache
看了前面的PoolArena分析,我们知道PoolArena在分配内存时,使用了synchronized来保证线程安全,这样就带来了一定的效率问题。如何能再此基础上再优化呢,答案很简单,使用ThreadLocal类似的解决方案避免加锁! 为什么可以使用ThreadLocal,如果了解过netty线程模型(有兴趣后续可以一起学习),应该知道netty的woker线程池,它负责了数据的接收、发送(编解
2015-11-25 20:52:45
4101
原创 netty5学习笔记-内存池4-PoolArena
前面我们讲到了内存池中的几个重要的类: 1、PoolChunk:维护一段连续内存,并负责内存块分配与回收,其中比较重要的两个概念:page:可分配的最小内存块单位;chunk:page的集合; 2、PoolSubpage:将page分为更小的块进行维护; 3、PoolChunkList:维护多个PoolChunk的生命周期。
2015-09-02 22:14:49
3677
原创 netty5学习笔记-内存池3-PoolChunkList
前面我们介绍了PoolChunk以及针对page的更细粒度的PoolSubpage,其实在chunk的上层还有一个管理类:PoolChunkList,PoolChunkList负责管理多个chunk的生命周期,在此基础上对内存分配进行进一步的优化,那它是如何去做的呢?我们来简单的了解下,先看看它的几个属性:PoolArena arena; // 这个东西又出现了,看来是个终极boss啊,后面再
2015-08-29 10:43:54
3284
原创 netty5学习笔记-内存池2-PoolSubpage
前面我们讲过了负责内存分配的类PoolChunk,它最小的分配单位为page, 而默认的page size为8K。在实际的应用中,会存在很多小块内存的分配,如果小块内存也占用一个page明显很浪费,针对这种情况,可以将8K的page拆成更小的块,这已经超出chunk的管理范围了,这个时候就出现了PoolSubpage, 其实PoolSubpage做的事情和PoolChunk做的事情类似,只是Poo
2015-08-25 21:39:04
2969
原创 netty5学习笔记-内存池1-PoolChunk
从netty 4开始,netty加入了内存池管理,采用内存池管理比普通的new ByteBuf性能提高了数(2)十倍。相信有些朋友会和我一样,对他的实现方式很感兴趣。这里把学习netty内存池的过程记录下来,与大家一起分享。首先给大家介绍的是PoolChunk, 该类主要负责内存块的分配与回收,下面看看几个重要的术语:page: 可以分配的最小的内存块单位。chunk: chunk是一
2015-08-23 21:34:14
8190
1
原创 netty5学习笔记-内存泄露检测
netty中用到内存泄露检测的地方主要有:1、CompositeByteBuf;2、HashedWheelTimer;3、继承AbstractByteBufAllocator的几个类。下面我们看看,netty里的内存检测类ResourceLeakDetector的具体实现:
2015-08-23 16:49:04
6024
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人