自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小程故事多的博客

一名工作十多年的技术老兵,永保初心!合著作品《深入分布式缓存--从原理到实践》

  • 博客(207)
  • 收藏
  • 关注

原创 跟我学系列之趣解NIO和IO的区别

在上一次分享中,咱们谈到了阻塞与非阻塞,同步与异步的区别,http://www.jianshu.com/p/e9c6690c0737那么在这一次分享中,咱们主要是以讲故事的方式讲述一下NIO和IO的区别。那么在下一次分享中,将进行Java NIO源码的分析。故事的背景:有一个动物园,动物园里面有狮子,老虎,猴子等动物,他们每天定期来吃不同的水果,而这些水果要由动物园管理员到货场领取分配

2016-07-06 15:25:26 669

原创 同步,异步,阻塞和非阻塞的区别

一、概念异步:某个事情需要10s完成。而我只需要调用某个函数告诉xxx来帮我做(然后我再干其他的事情)同步:某个事情需要10s完成,我需要一直等它完成(等10s),再能继续后面的工作。阻塞:做某件事情,直到完成,除非超时非阻塞:尝试做,如果不能做,就不做(直接返回),如果能做,就做。 前两者和后两者不容易区分,不过前两者更多的有涉及到多线程交互(消息)的场景。 二、

2016-07-06 15:25:19 553

原创 跟我学系列之RabbitMQ深入研究

./rabbitmq-plugins  enable rabbitmq_management

2016-07-06 15:25:12 609

原创 跟我学系列之JVM远程性能监控

新写的文章在这里:   http://www.jianshu.com/p/fe37a62ba155

2016-07-06 15:25:04 437

原创 【转】使用 VisualVM 进行性能分析及调优

概述开发大型 Java 应用程序的过程中难免遇到内存泄露、性能瓶颈等问题,比如文件、网络、数据库的连接未释放,未优化的算法等。随着应用程序的持续运行,可能会造成整个系统运行效率下降,严重的则会造成系统崩溃。为了找出程序中隐藏的这些问题,在项目开发后期往往会使用性能分析工具来对应用程序的性能进行分析和优化。VisualVM 是一款免费的性能分析工具。它通过 jvmstat、JMX、SA(Se

2016-07-06 15:24:57 4963 1

原创 Using Redis as an LRU cache文章翻译

周末有空翻译了:http://redis.io/topics/lru-cache#maxmemory-configuration-directive 具体如下:       当用Redis作为一个LRU存储时,有些时候是比较方便的,在你增添新的数据时会自动驱逐旧的数据。这种行为在开发者论坛是非常有名的,因为这是流行的memcached系统的默认行为。       LRU实际

2016-07-06 15:24:50 593

原创 【转】如何用消息系统避免分布式事务?

前阵子从支付宝转账1万块钱到余额宝,这是日常生活的一件普通小事,但作为互联网研发人员的职业病,我就思考支付宝扣除1万之后,如果系统挂掉怎么办,这时余额宝账户并没有增加1万,数据就会出现不一致状况了。上述场景在各个类型的系统中都能找到相似影子,比如在电商系统中,当有用户下单后,除了在订单表插入一条记录外,对应商品表的这个商品数量必须减1吧,怎么保证?!在搜索广告系统中,当用户点击某广告后,除了在

2016-07-06 15:24:43 530

原创 一段JAVA线程池的设置引发的血案

应公司需求我们对一个项目进行了线上压力测试,结果发现,三台服务器一共只有59TPS,结果惨不忍睹。那么针对这样的场景,我们利用一周时间进行专注性的优化,寻找性能的瓶颈点。 第一步:我们针对线上的环境进行模拟,尽量真实的在测试环境中再现,采用数据库连接池为咱们默认的C3P0。那么当压测到二万批,100个用户同时访问的时候,并发量突然降为零!报错如下:Could not get J

2016-07-06 15:24:33 670

原创 【转】Scala从零开始:使用Intellij IDEA写hello world

在之前的文章中,我们介绍了如何使用Scala IDE也就是eclipse中集成的Scala开发插件来进行Scala语言程序的开发,在使用了一段时间之后,发现eclipse对Scala的支持并不是很好。用户体验比较差,比如联想速度比较慢等。由于在公司一直使用的Scala开发工具是Intellij IDEA(好吧,其实我使用Scala IDE的目的就是想试一下这两个各有什么优缺点),各方面感觉还不错,

2016-07-06 15:24:26 1352

原创 GC日志分析

JVM的GC日志的主要参数包括如下几个:-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)-XX:+PrintH

2016-07-06 15:24:19 327

原创 【转】Java常见内存溢出异常分析

Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而内存模型中不同的部分都会出现相应的OOM错误,接下来我们就分开来讨论一下。 栈溢出(StackOverflowError) 栈溢出抛出java.lang.StackOverflowError错误,出现

2016-07-06 15:24:12 451

原创 【转】分布式锁的实现

在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等。大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。其次Redis提供一些命令SETNX,GETSET,可以方便实现分布式锁机制。Redis命令介绍使用Redis实现分布式锁,有两个重要函数需要介绍SETNX命令(S

2016-07-06 15:24:05 476

原创 线程池在任何场景下都比顺序执行快吗??

有时候并不是在任何场景下使用线程池,效率都比顺序执行程序快,请看下面例子程序: 这是使用线程池程序。 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, nocar

2016-07-06 15:23:58 644 1

原创 利用Jmap进行简单日志分析

使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。比如下面的例子: 12345678910111213141516171819202122232425262728293031323334

2016-07-06 15:23:50 3803 1

原创 由不断的创建线程产生的内存错误所想到的

public class MultiThreadOOM { public static class SleepThread implements Runnable public void run(){ try { Thread.sleep(10000000); } catch (InterruptedExcep

2016-07-06 15:23:43 573

原创 跟我学之Dubbo源码类分析图

客户端类图: 服务端类图 大小: 89.7 KB 大小: 123.8 KB

2016-07-06 15:23:36 554

原创 跟我学系列之Netty源码图

客户端结构:  服务端结构: 大小: 112 KB 大小: 127.8 KB

2016-07-06 15:23:27 775

原创 跟我学系列之NIO的那些坑

public class EchoServer {      public static int DEFAULT_PORT = 7777;        public static void main(String[] args) throws IOException {          System.out.println("Listening for connection o

2016-07-06 15:23:19 923

原创 Nginx常见的优化策略

常用优化要点nginx使用的是固定数量的workers, 每个worker都处理进入的请求。最佳实践是每个CPU内核配置一个worker.如何知道您的系统有几个CPU? 1$ grep ^processor /proc/cpuinfo | wc -l对于一个四核处理器,配置文件类似:# One worker per CPU

2016-07-06 15:23:12 977

原创 临时记录

mvn deploy -Dmaven.test.skip=true http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redishttp://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage

2016-07-06 15:23:05 284

原创 单例模式与垃圾回收

讨论命题:当一个单例的对象长久不用时,会不会被jvm的垃圾收集机制回收。首先说一下为什么会产生这一疑问,笔者本人再此之前从来没有考虑过垃圾回收对单例模式的影响,直到去年读了一本书,《设计模式之禅》秦小波著。在书中提到在j2ee应用中,jvm垃圾回收机制会把长久不用的单例类对象当作垃圾,并在cpu空闲的时候对其进行回收。之前读过的几本设计模式的书,包括《java与模式》,书中都没有提到jvm垃圾

2016-07-06 15:22:58 467

原创 【转】IntelliJ IDEA导航特性Top20

在前面的文章里,我介绍了IntelliJ IDEA(以下称IntelliJ)中与代码补全及重构相关的特性。今天我将介绍另外一个利器——IntelliJ的导航(Navigation),只要运用得当,它将节约你大把的时间。作为一个IntelliJ的用户,你应先明确一点——IntelliJ是用来让你专注于代码的工具。只有这样我们才能充分利用并享受它的魔力。因此,大部分的时间里你应该专心工作于代码编辑

2016-07-06 15:22:51 498

原创 通过B2C购物流程所能想到些什么!!

如图: 大小: 48.4 KB 查看图片附件

2016-07-06 15:22:44 338

原创 【转】趣谈电商的秒杀与抢购

电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。这次我们会关注秒杀和抢购的技术实现和优化,同时,从技术层面揭开,为什么我们总是不容易抢到火车票的原因? 一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整

2016-07-06 15:22:37 512

原创 【转】MAVEN 解决包依赖冲突方案

使用maven最烦人的可能就是类包之间的版本冲突引发的问题了,类包冲突的一个很大的原因即产类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,因而可能造成一个我们不想要的类包的载入,严重的甚至会引起类包之间的冲突。 要解决这个问题,首先就是要查看pom.xml显式和隐式的依赖类包,然后通过这个类包树找出我们不想要的依赖类包,手工将其排

2016-07-06 15:22:29 907

原创 使用Eclipse MAT查找内存泄漏工具介绍

一、MAT是什么?      MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。 二、如何

2016-07-06 15:22:21 659

原创 JVM JSTAT命令的用法和参数讲解

一、常用命令分析1. jstat -gc pid           可以显示gc的信息,查看gc的次数,及时间。           其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。2.jstat -gccapacity pid           可以显示,VM内存中三代(young,old,pe

2016-07-06 15:22:13 471

原创 【转】RPC技术简介

思考一下分布式系统中的 RPC (Remote Procedure Call) 问题,一个完整的 RPC 模块需要可以分为三个层次服务层(service):RPC 接口定义与实现协议层(protocol):RPC 报文格式和数据编码格式传输层(transport):实现底层的通信(如 socket)以及系统相关的功能(如事件循环、多线程)在实际的大型分布式系统中,不同的服务往往

2016-07-06 15:22:05 466

原创 【转】Java Executor框架在多线程应用中的使用

java平台一直对并发程序设计和多线程有这很好的支持。但在早期这种支持也只是在应用层调用原生结构,这种方式最大的缺陷就是使这些原始构件有效的被调用;否则,应用将不能正确运行或者不能达到期望结果。 Executor框架自java1.5中被作为comcurrency包的一部分被引入。它是java多线程的一个抽象层实现,并且作为java中首个实用的并发框架被用来标准调用、在并行线程中调度、执行以

2016-07-06 15:21:58 726

原创 Dubbo源码分析系列2---Dubbo异步通信

敬请期待。。。

2016-07-06 15:21:51 448

原创 Dubbo源码分析系列1---Dubbo异步通信

1、client一个线程调用远程接口,生成一个唯一的ID(比如一段随机字符串,UUID等),Dubbo是使用AtomicLong从0开始累计数字。 2、将打包的方法调用信息(如调用的接口名称,方法名称,参数值列表等),和处理结果的回调对象callback,全部封装在一起,组成一个对象object。 3、向专门存放调用信息的全局ConcurrentHashMap里面put(ID, o

2016-07-06 15:21:44 853

原创 Spring ApplicationContextAware使用方法

项目用到了ApplicationContextAware,通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationContext方法。我们在ApplicationContextAware的实现类中,就可以通过这个上下文环境对象得到Spring容器中的Bean。使用方法如下:1.实现ApplicationConte

2016-07-06 15:21:37 1029

原创 探讨如何减少Linux服务器TIME_WAIT过多的问题

今天早上一上班,有同事就反映公司好几个网站都打不开,登陆数据库服务器(windows),发现很卡,于是重启了下服务器,进入系统后,没过一会问题依旧,查看了下系统进程,发现mysql占用率达到99%,可以肯定的是mysql连接出现问题:netstat -an192.168.12.13:3306 192.168.12.12:30443 TIME_WAIT192.16

2016-07-06 15:21:30 509

原创 NIO DirectByteBuffer 内存泄露的测试

写NIO程序经常使用ByteBuffer来读取或者写入数据,那么使用ByteBuffer.allocate(capability)还是使用ByteBuffer.allocteDirect(capability)来分配缓存了?第一种方式是分配JVM堆内存,属于GC管辖范围,由于需要拷贝所以速度相对较慢;第二种方式是分配OS本地内存,不属于GC管辖范围,由于不需要内存拷贝所以速度相对较快。  

2016-07-06 15:21:21 1443 1

原创 火车运煤算法--全面解析

你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大――每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市? 这道题一开始看上去好像是无解的,因为你的火车每一公里就要消耗一吨煤,而到目的地有1000公里,而火车最多只能装1000吨媒

2016-07-06 15:21:13 2437

原创 NIO 水平触发,边缘触发的区别

在linux的IO多路复用中有水平触发,边缘触发两种模式,这两种模式的区别如下:    水平触发:如果文件描述符已经就绪可以非阻塞的执行IO操作了,此时会触发通知.允许在任意时刻重复检测IO的状态,没有必要每次描述符就绪后尽可能多的执行IO.select,poll就属于水平触发.    边缘触发:如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知.在收到一个IO事件通知后要尽

2016-07-06 15:21:06 875

原创 Spring AOP 源码实现过程

我们看看在Spring AOP中拦截器链是怎样被调用的,也就是Proxy模式是怎样起作用的,或者说Spring是怎样为我们提供AOP功能的; 在JdkDynamicAopProxy中生成Proxy对象的时候: return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);         这里的this参

2016-07-06 15:20:59 859

原创 100个高质量Java开发者博客

名称(站点名或人名)国家备注1Adam Bien德国Java EE相关2Antonio Goncalves法国Java EE相关(《Java EE 5》和《Java EE 7》的作者)3Henrik Warne瑞典编程过程中的一些思考4Billy Yarosh美国Java日常开发中的实用代码示例5

2016-07-06 15:20:52 966

原创 【转】Java常见内存溢出异常分析

Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而内存模型中不同的部分都会出现相应的OOM错误,接下来我们就分开来讨论一下。栈溢出(StackOverflowError)栈溢出抛出java.lang.StackOverflowError错误,

2016-07-06 15:20:44 475

原创 负载均衡的基本算法

1、随机:负载均衡方法随机的把负载分配到各个可用的服务器上,通过随机数生成算法选取一个服务器,然后把连接发送给它。虽然许多均衡产品都支持该算法,但是它的有效性一直受到质疑,除非把服务器的可运行时间看的很重。 2、轮询:轮询算法按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。轮询算法在大多数情况下都工作的不错,但是如果负载均衡的设备在处理速度、连接速度和内存等方

2016-07-06 15:20:37 434

空空如也

空空如也

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

TA关注的人

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