- 博客(439)
- 资源 (55)
- 收藏
- 关注
原创 系统架构过程中常用到的术语
性能:Web系统的性能受多方面因素的影响,但大多数开发人员主要关心的是响应时间和可扩展性这两方面。n 响应时间:Web应用从收到请求到返回响应结果所花费的时间。而应用系统应该在可接受的时间范围内返回响应结果,否则就不能算是一个性能良好的应用系统。n 可扩展性:如果Web应用通过增加更多硬件可以使处理的请求数呈线性增长,那么该应用是可扩展的。在同一个应用中,响应时间和可扩展性并不总是能够同时达到最好
2018-01-14 12:35:30
1879
原创 软件程序性能衡量指标
如果抛开所有的内部技术因素,我们只看应用程序的性能指标,那么一般来说,程序的性能大体可以通过以下几个方面来衡量。n 响应时间:系统对用户行为或者事件做出响应的时间。响应时间越短,性能一定越好,所以我们在系统设计过程中应该尽量采用异步处理方式,让用户能够尽快收到回执,这样用户体验会较好。n 启动时间:应用系统从运行到可以正常处理业务所需要花费的时间,对于用户来说,肯定是越快启动越好,所以我们在系统设
2017-12-25 13:12:07
6710
1
原创 订单系统的优化方案
要优化订单系统,提高订单的每秒交易数量(TPS,Transactionper second),我们首先要做的是对下订单的逻辑进行剥离,只保留核心部分,而把附加功能剔除出去。比如说下单要考虑库存量、考虑发短信、要给卖家发消息通知、要对订单做统计、要做销售额统计等,我们需要对这些功能进行分析,哪些功能是必需的,哪些是附加的功能,要最大程度提高下单这一步的TPS,就要先不考虑这些附加的功能。下单必然会涉
2017-12-20 16:45:12
5045
原创 程序性能优化策略
列举几点常见的性能优化策略。n 用空间换时间。该策略属于系统架构层面的优化。我们知道,各种缓存机制,从CPU L1/L2/RAM到硬盘,都可以通过空间换时间的策略。这类策略基本上是通过采用把计算的过程一步一步地保存或者缓存等方式,避免重复计算的发生。具体的方式可以采用数据缓冲、CDN等。类似的策略还表现为诸如冗余数据,比如数据镜像、负载均衡等。n 用时间换空间。该策略也属于系统架构层面的优化。有时
2017-12-11 10:55:14
665
原创 采用Clone()方式创建对象
Java语言里面的所有类都默认继承自java.lang.Object类,在java.lang.Object类里面有一个clone()方法,JDK API的说明文档里面解释了这个方法会返回Object对象的一个拷贝。我们需要说明两点:一是拷贝对象返回的是一个新对象,而不是一个对象的引用地址;二是拷贝对象与用new关键字操作符返回的新对象的区别是,这个拷贝已经包含了一些原来对象的信息,而不是对象的初始
2017-12-04 13:23:13
2711
原创 避免对boolean判断
Java里的boolean数据类型被定义为存储8位(1个字节)的数值形式,但只能是true或是false。有些时候我们出于写代码的习惯,经常容易导致习惯性思维,这里指的习惯性思维是想要对生成的数据进行判别,这样感觉可以在该变量进入业务逻辑之前有一层检查、判定。对于大多数的数据类型来说,这是正确的做法,但是对于boolean变量,我们应该尽量避免不必要的等于判定。如果尝试去掉boolean与true
2017-11-30 09:31:05
855
原创 LRU算法
LRU是Least Recently Used 的缩写,即“最近最少使用”,基于LRU算法实现的Cache机制简单地说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现就是
2017-11-27 16:08:10
823
原创 LFU算法
LFU(LeastFrequently Used),即最近最多使用算法。它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。LFU算法需要维护一个队列记录所有数据的访问记录,每个数据都需要维护引用计数。LFU算法需要记录所有数据的访问记录,内存消耗较高;需要基于引用计数排序,性能消耗较高。LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排
2017-11-24 09:17:57
5808
原创 JVM之虚拟机栈
虚拟机栈是一种可以被用来快速访问的存储区域,该区域位于通用RAM[1]里面,通过使用它的所谓的“栈指针”可以让我们访问处理器。栈是一种快速有效的分配存储方法,存取速度仅次于寄存器,堆栈指针若向下移动,则分配新的内存,若向上移动,则释放那些内存。由于Java编译器需要预先去生成相应的内存空间,所以当我们尝试创建程序的时候,Java编译器必须知道被存储在栈内的所有数据的确切大小和生命周期,以便可以按照
2017-11-21 11:20:06
479
原创 JVM之堆
堆在JVM规范里是一种通用性的内存池(也存在于RAM中),用于存放所有的Java对象。堆是一个运行时数据区,类的对象从中分配空间。这些对象通过New关键字被建立,它们不需要程序代码来显式地释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存周期也不需要事先告诉编译器。由于它是在运行时动态分配内存的,Java的垃圾收集器会自动收走那些不再使用的数据。但缺点是,由于要在运行时动态分配内
2017-11-13 18:43:17
762
原创 JVM之程序计数器
冯·诺伊曼计算机体系结构的主要内容之一就是“程序预存储,计算机自动执行”,处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条地取到处理器中再译码、执行,以完成整个程序的执行。为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定下一条取址指令的地址,程序计数器正是起到这种作用,所以通常又称之为“指令计数器”。程序计数器(Program Cou
2017-11-10 10:32:16
870
原创 JVM之本地栈
本地方法栈(Native Method Stacks)和Java虚拟机栈的功能很相似,Java虚拟机栈用于管理Java函数的调用,而本地方法栈用于管理本地方法的调用。本地方法并不是用Java实现的,而是使用C实现的。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界,本地方法可以通过本地方法接口来访问虚拟机运行时的数据区,但不止于此,它还可以做任何它想做的事情。比如,它甚
2017-11-04 16:03:35
428
原创 FIFO算法
FIFO(First in First out),即先进先出算法,比如在超市购物之后会提着我们满满的购物车来到收银台排在结账队伍的最后,眼睁睁地看着前面的客户一个个离开,这就是一种先进先出机制,先排队的客户先行结账离开。其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度机制,采用先来先服务的原则,为什么这个原则在很多地方都会用到呢?因为这个原则简单,符合人们的惯性思维,具备公
2017-11-02 10:09:55
2734
原创 技术团队领导者定位
前段时间看一个明星家庭独自带孩子的直播节目。一位知名女星的老公,在女星眼睛肿成灯泡一样的时候,没有任何照顾行动,反而在女星准备去看病的时候对她说:“你早点回来,我一个人搞不定!”,这是一个爸爸、一个老公应该说的话吗?工作中做好工作,赚钱养家,回到家帮助家庭打理家务、赡养老人、照顾孩子,这些是一个有家的男人的职责,所以古话说得好“宠子不发”。回到技术领域。大家要明白,一家企业能够生存,一定是业务开展
2017-10-30 22:09:33
867
原创 技术面试技巧
我比较喜欢自己出面试题,不喜欢网上千篇一律的题目,当然公司出的笔试题我会认真批改,并将它作为挑选面试者的依据。我们以Java程序员面试题为例:1. 请使用两种设计模式编写代码。(考察基础编程能力)。2. 请描述面向对象的三个特性及使用场景。(考察基本面向对象知识)3. 编写数据结构相关的程序,例如“实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作”。(考察对于数据结构的了
2017-10-27 08:46:02
944
原创 逻辑思维能力观察
其实这个考察内容可以包含在面试技巧里。我一般会采用口述或者让面试者对我描述的场景和需要做的事情进行快速的归纳总结,从他开始阅读或者倾听我的话开始计时,直到他用最简洁的语句描述出事情的背景及我希望他做的事情。我们看下面这个例子:“我们今天想做一个测试,准确的说是想做一个系统接入能力的测试,也可以说是性能测试,有些公司当然也有其他的称呼,我们不多做纠结,就叫性能测试吧,三周时间内完成并提交测试报告,小
2017-10-13 16:40:56
1124
原创 IT从业者职业生涯收入曲线分析
IT从业者在整个职业生涯的收入趋势,这个话题很多我的读者开小窗问我,我做一个自己的想法说明。根据我实际的观察,我认为一位IT从业者在整个职业生涯中的收入趋势可能由以下几种情况(最后三种是不可能出现的,我也列出,并做解释),我逐一说明。这条曲线说明从业者前期个人工作比较努力,因此收入一直在不断增长(所处行业也需要比较景气,以下同),进入职业生涯中期(比如35-45之间),收入开始趋于平稳,职业生涯末
2017-10-04 16:40:27
4642
原创 第一个ZooKeeper客户端程序
我们可以采用新建一个工程,然后导入ZooKeeper.3.4.7.jar包,接着编写独立的JAVA程序的方式来实现演示工作,如果采用这种方式,需要javac –cp命令编译java文件,并使用java –cp命令运行编译后的文件。这里不采用这种方式,而是采用ZooKeeper自带的源代码程序,新创建一个test文件夹,如图所示。图1-3 ZooKeeper程序目录图新建了test文件夹,位于“or
2017-09-30 16:35:58
765
原创 大话性能优化
2011年1月,新加坡飞往杭州的航班。飞行持续时间很长,大约6个小时,坐在四周的人很快熟悉了,互相攀谈起来。有一位小姑娘,十六七岁的模样,长得很漂亮,默默地坐在座位上。热心的阿姨和她攀谈,问起她的情况,她带着疲倦自我介绍起来,“我在新加坡念初三,那所学校一点都不好,我在成都是最好的初中毕业的,也考上了成都最好的高中,但是,我的父母,他们一定要我来新加坡复读初三,让我考新加坡的高中,我一点都不喜欢这
2017-09-26 18:49:46
640
原创 G1 GC日志分析
使用UseG1GC这个选项显示地要求JDK7或者JDK8对应的JVM采用G1 GC,据说JDK9开始默认GC会变更为G1 GC(现在是ParallelGC),但一切皆有可能。我们使用VM参数-XX:+PrintGCDetails-verbose:gc -Xloggc:gc.log -XX:+UseG1GC,日志输出如清单3-12所示。代码清单3-12 -XX:+UseG1GC运行输出Java Ho
2017-09-20 20:04:38
8432
1
原创 性格分析工具
DISC个性特征理论1928年,威廉.马其顿博士出版了《正常人的情绪》一书,书中提出DISC个性特性理论。他认为人类行为是个体自身的反应(主动或被动)以及其对环境的认知(友好与敌对)相互作用的结果,以这两方面的基本轴,可以区分个体与环境互动的四种典型模式,每一个个体或多或少会呈现4种不同的模式:l 支配型(Dominance):在敌对的环境中保持主动的态度和反应;l 影响力(Influence):
2017-09-18 17:44:30
2529
原创 G1的垃圾回收概念
通过市场的力量,不断淘汰旧的行业,把有限的资源让给那些竞争力更强、利润率更高的企业。类似地,硅谷也在不断淘汰过时的人员,从全世界吸收新鲜血液。经过半个多世纪的发展,在硅谷地区便形成只有卓越才能生存的文化。本着这样的理念,GC承担了淘汰垃圾、保存优良资产的任务。G1 GC在回收暂停阶段会回收最大量的堆内区间(Region),这是它的设计目标,通过回收区间达到回收垃圾的目的。这里只有一个例外情况,这个
2017-09-15 15:52:15
683
原创 HDFS中NameNode 单点失败的改进案例介绍
在Hadoop的使用中,NameNode的单点失败问题一直困扰着框架的使用者。这一节我们提出了一种利用ZooKeeper对NameNode进行冗余备份协同工作方案,避免了NameNode单点失败造成的服务不可用与文件丢失问题。NameNode是整个HDFS的核心,HDFS所有的操作均需由NameNode参与,并且NameNode负责维护整个分布式文件系统中所有文件的元信息以及目录信息。如果Name
2017-09-11 15:27:34
1073
原创 如何启动ZooKeeper(下)
(3). Module3 分布式模式由于ZooKeeper单机模式不支持单点失败保护,所以不推荐在生产环境下使用。ZooKeeper有另外一种支持多台机器的模式,即真正的分布式模式,这多台包含在一个应用体内的集群机器被称为quorum,这些机器最小配置为3台,最佳配置为5台,其中包含1台Leader(领导者)机器,由5台机器内部选举产生,另外4台机器就立即成为Follower(跟随者)机器,一旦L
2017-09-06 18:24:45
594
原创 如何启动ZooKeeper(中)
(2). Module2 伪分布式模式上面演示了如何启动单机模式,现在我们来演示设置伪分布式模式。我们可以在一台机器上创建模拟的ZooKeeper集群服务,假如我们需要3个节点,需要创建3个cfg文件,分别命名为zoo1.cfg,zoo2.cfg,zoo3.cfg,此外我们还需要创建3个不同的数据文件夹,分别是zoo1,zoo2和zoo3,目录位于/var/lib/zookeeper,如1-16、
2017-09-01 19:57:58
916
原创 如何启动ZooKeeper(上)
启动ZooKeeperZooKeeper服务的启动方式分为三种,即单机模式、伪分布式模式、分布式模式,这里针对三种模式均做逐一讲解。 Tips 调试过程建议尽量使用分布式模式,单机模式不推荐在生产环境下使用,伪分布式模式实质上是在一个进程内派生多个线程模拟分布式形态,由于操作系统的内部结构设计,容易造成一些问题,建议与其解决问题不如切换到分布式模式。生产环境下建议一定采用分布式模式,如果机器
2017-08-29 18:26:44
50390
2
原创 不懂技术的研究团队领导
不懂技术的人如果做了研发团队的领导,很容易出现严重的问题。例如,技术会议他到底需不需要参加,如果是一位技术专家出生的人,毫无疑问他需要参加,但是如果情况不是,这时候就会出现麻烦。他参加或者不参加,都会引起麻烦,所以尽量避免这样的人出任研发团队领导。另外,对于整个研发过程的管理,不懂技术的人很容易完全从产品角度考虑,忽略研发团队面临的困难和风险,忽略技术人员对于技术的憧憬,造成团队超负荷工作的情况、
2017-08-23 16:26:52
732
原创 并行程序设计模式
并行程序设计模式一般有Future模式、Master-Slave模式、保护暂停模式、不变模式、生产者/消费者模式等。1. Future模式Future模式有点类似商品订单。比如在进行网上购物时,当看中某一件商品时,就可以提交订单。当订单处理完毕后,便可在家里等待商品送货上门。卖家根据订单从仓库里取货,并配送到客户手上。在大部分情况下,商家对订单的处理并不那么快,有时甚至需要几天时间。而在这段时间内
2017-08-15 14:45:23
730
原创 不懂技术的研发团队领导
不懂技术的人如果做了研发团队的领导,很容易出现严重的问题。例如,技术会议他到底需不需要参加,如果是一位技术专家出生的人,毫无疑问他需要参加,但是如果情况不是,这时候就会出现麻烦。他参加或者不参加,都会引起麻烦,所以尽量避免这样的人出任研发团队领导。另外,对于整个研发过程的管理,不懂技术的人很容易完全从产品角度考虑,忽略研发团队面临的困难和风险,忽略技术人员对于技术的憧憬,造成团队超负荷工作的情况、
2017-07-22 19:47:34
3017
原创 HashMap使用经验(下)
对于任意给定的对象,只要它的hashCode()返回值相同,那么程序调用hash(int h)方法所计算得到的Hash码值总是相同的。接下来程序会调用indexFor(int h, int length)方法来计算该对象应该保存在table数组的哪个索引处。indexFor(inth, int length)方法的代码如清单3-48所示。代码清单3-48 HashMap的indexFor方法源代码
2017-07-21 18:06:38
537
原创 HashMap使用经验(上)
小时候妈妈都教过我们,不同的东西要放在不同的位置,需要时才能快速找到它。当然这个规则你必须记住,不然怎么都找不到了。HashMap之所以能够做到快速存、取,与我们下面要介绍的内容密切相关。HashMap和HashSet是JavaCollection Framework的两个重要成员,其中HashMap是Map接口的常用实现类,HashSet是Set接口的常用实现类。虽然HashMap和HashSe
2017-07-20 17:34:26
430
原创 JVM 垃圾回收器工作原理及使用实例介绍
垃圾收集基础Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况。自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担。拥有垃圾收集器可以说是 Java 语言与 C++语言的一项显著区别。在 C++语言中,程序员必须小心谨慎地处理每一项内存分配,且内存使用完后必须手工释放曾经占用的内存空间。当内存释放不够完全时,即存在分配但
2017-06-10 18:04:00
498
原创 Apache kafka 工作原理介绍
本文首先介绍了 Apache Kafka 的基本原理及专业术语,然后通过一个在线网络游戏的例子进一步解释 Kafka 的功能,最后通过具体案例介绍 Kafka 与 Flume 的差异。
2017-04-19 22:46:43
663
原创 JVMs across data center and twitter's jdk
第十届国际软件开发者大会(2016年11月7日-11月11日)在旧金山召开,昨天(11月7日)首日会上,来自Twitter JVM组的John Coomes(团队成员,两个孩子的父亲,昨天Twitter发文说参加大会同时也拿到了旧金山地区的超速罚单)介绍了团队基于OpenJDK的一个分支设立了自己的小组,并介绍了在此基础上所做的开发、上线、维护公司内部JDK版本的具体情况。
2017-01-02 19:00:39
635
原创 《大话Java性能优化》面向对象及基础类型相关部分
Java语言里面的所有类都默认继承自java.lang.Object类,在java.lang.Object类里面有一个clone()方法,JDK API的说明文档里面解释了这个方法会返回Object对象的一个拷贝。我们需要说明两点:一是拷贝对象返回的是一个新对象,而不是一个对象的引用地址;二是拷贝对象与用new关键字操作符返回的新对象的区别是,这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息,即每次拷贝动作不是一个针对全新对象的创建。
2016-08-28 16:56:41
1384
原创 关于若干选举算法的解释与实现
分布式中有这么一个疑难问题,客户端向一个分布式集群的服务端发出一系列更新数据的消息,由于分布式集群中的各个服务端节点是互为同步数据的,所以运行完客户端这系列消息指令后各服务端节点的数据应该是一致的,但由于网络或其他原因,各个服务端节点接收到消息的序列可能不一致,最后导致各节点的数据不一致。要确保数据一致,需要选举算法的支撑,这就引申出了今天我们要讨论的题目,关于选举算法的原理解释及实现,选举包括对机器的选举,也包括对消息的选举。
2016-08-24 22:44:22
6183
1
原创 Java程序为什么需要调优(《大话Java性能优化》第一章第一节)
随着互联网业务的不断拓展、繁荣,越来越多的系统架构开始参照互联网+企业的系统架构方式。笔者认为,任何技术都离不开对业务需求的支撑,所以开始研究程序性能问题之前,我们需要先了解系统业务逻辑。
2016-08-20 09:32:59
2858
原创 Apache ZooKeeper Watcher 机制源码解释
本文首先讲解了 Apache ZooKeeperWatcher 机制的使用方式,通过一个集群内部状态监听、触发动作的实例以及回调函数的基本知识,引发对于 Watcher 机制内部实现原理和源代码的讨论,然后通过对实现原理的解释让读者有一些工作方式的理解,接下来对源代码进行分析,进一步加深读者对 Watcher 机制的理解。
2016-07-16 11:29:57
4426
原创 Java 程序死锁问题原理及解决方案
我们发现,死锁虽然是较早就被发现的问题,但是很多情况下我们设计的程序里还是经常发生死锁情况。我们不能只是分析如何解决死锁这类问题,还需要具体找出预防死锁的方法,这样才能从根本上解决问题。总的来说,还是需要系统架构师、程序员不断积累经验,从业务逻辑设计层面彻底消除死锁发生的可能性
2016-07-09 11:19:46
5196
java foundattions introduction to programmer
2012-07-12
Beginning.iPhone.3.Development,Exploring.the.iPhone.SDK
2013-12-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人