系统架构过程中常用到的术语 性能:Web系统的性能受多方面因素的影响,但大多数开发人员主要关心的是响应时间和可扩展性这两方面。n 响应时间:Web应用从收到请求到返回响应结果所花费的时间。而应用系统应该在可接受的时间范围内返回响应结果,否则就不能算是一个性能良好的应用系统。n 可扩展性:如果Web应用通过增加更多硬件可以使处理的请求数呈线性增长,那么该应用是可扩展的。在同一个应用中,响应时间和可扩展性并不总是能够同时达到最好
软件程序性能衡量指标 如果抛开所有的内部技术因素,我们只看应用程序的性能指标,那么一般来说,程序的性能大体可以通过以下几个方面来衡量。n 响应时间:系统对用户行为或者事件做出响应的时间。响应时间越短,性能一定越好,所以我们在系统设计过程中应该尽量采用异步处理方式,让用户能够尽快收到回执,这样用户体验会较好。n 启动时间:应用系统从运行到可以正常处理业务所需要花费的时间,对于用户来说,肯定是越快启动越好,所以我们在系统设
订单系统的优化方案 要优化订单系统,提高订单的每秒交易数量(TPS,Transactionper second),我们首先要做的是对下订单的逻辑进行剥离,只保留核心部分,而把附加功能剔除出去。比如说下单要考虑库存量、考虑发短信、要给卖家发消息通知、要对订单做统计、要做销售额统计等,我们需要对这些功能进行分析,哪些功能是必需的,哪些是附加的功能,要最大程度提高下单这一步的TPS,就要先不考虑这些附加的功能。下单必然会涉
程序性能优化策略 列举几点常见的性能优化策略。n 用空间换时间。该策略属于系统架构层面的优化。我们知道,各种缓存机制,从CPU L1/L2/RAM到硬盘,都可以通过空间换时间的策略。这类策略基本上是通过采用把计算的过程一步一步地保存或者缓存等方式,避免重复计算的发生。具体的方式可以采用数据缓冲、CDN等。类似的策略还表现为诸如冗余数据,比如数据镜像、负载均衡等。n 用时间换空间。该策略也属于系统架构层面的优化。有时
采用Clone()方式创建对象 Java语言里面的所有类都默认继承自java.lang.Object类,在java.lang.Object类里面有一个clone()方法,JDK API的说明文档里面解释了这个方法会返回Object对象的一个拷贝。我们需要说明两点:一是拷贝对象返回的是一个新对象,而不是一个对象的引用地址;二是拷贝对象与用new关键字操作符返回的新对象的区别是,这个拷贝已经包含了一些原来对象的信息,而不是对象的初始
避免对boolean判断 Java里的boolean数据类型被定义为存储8位(1个字节)的数值形式,但只能是true或是false。有些时候我们出于写代码的习惯,经常容易导致习惯性思维,这里指的习惯性思维是想要对生成的数据进行判别,这样感觉可以在该变量进入业务逻辑之前有一层检查、判定。对于大多数的数据类型来说,这是正确的做法,但是对于boolean变量,我们应该尽量避免不必要的等于判定。如果尝试去掉boolean与true
LRU算法 LRU是Least Recently Used 的缩写,即“最近最少使用”,基于LRU算法实现的Cache机制简单地说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现就是
LFU算法 LFU(LeastFrequently Used),即最近最多使用算法。它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。LFU算法需要维护一个队列记录所有数据的访问记录,每个数据都需要维护引用计数。LFU算法需要记录所有数据的访问记录,内存消耗较高;需要基于引用计数排序,性能消耗较高。LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排
JVM之虚拟机栈 虚拟机栈是一种可以被用来快速访问的存储区域,该区域位于通用RAM[1]里面,通过使用它的所谓的“栈指针”可以让我们访问处理器。栈是一种快速有效的分配存储方法,存取速度仅次于寄存器,堆栈指针若向下移动,则分配新的内存,若向上移动,则释放那些内存。由于Java编译器需要预先去生成相应的内存空间,所以当我们尝试创建程序的时候,Java编译器必须知道被存储在栈内的所有数据的确切大小和生命周期,以便可以按照
JVM之堆 堆在JVM规范里是一种通用性的内存池(也存在于RAM中),用于存放所有的Java对象。堆是一个运行时数据区,类的对象从中分配空间。这些对象通过New关键字被建立,它们不需要程序代码来显式地释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存周期也不需要事先告诉编译器。由于它是在运行时动态分配内存的,Java的垃圾收集器会自动收走那些不再使用的数据。但缺点是,由于要在运行时动态分配内
JVM之程序计数器 冯·诺伊曼计算机体系结构的主要内容之一就是“程序预存储,计算机自动执行”,处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条地取到处理器中再译码、执行,以完成整个程序的执行。为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定下一条取址指令的地址,程序计数器正是起到这种作用,所以通常又称之为“指令计数器”。程序计数器(Program Cou
JVM之本地栈 本地方法栈(Native Method Stacks)和Java虚拟机栈的功能很相似,Java虚拟机栈用于管理Java函数的调用,而本地方法栈用于管理本地方法的调用。本地方法并不是用Java实现的,而是使用C实现的。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界,本地方法可以通过本地方法接口来访问虚拟机运行时的数据区,但不止于此,它还可以做任何它想做的事情。比如,它甚
FIFO算法 FIFO(First in First out),即先进先出算法,比如在超市购物之后会提着我们满满的购物车来到收银台排在结账队伍的最后,眼睁睁地看着前面的客户一个个离开,这就是一种先进先出机制,先排队的客户先行结账离开。其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度机制,采用先来先服务的原则,为什么这个原则在很多地方都会用到呢?因为这个原则简单,符合人们的惯性思维,具备公
技术团队领导者定位 前段时间看一个明星家庭独自带孩子的直播节目。一位知名女星的老公,在女星眼睛肿成灯泡一样的时候,没有任何照顾行动,反而在女星准备去看病的时候对她说:“你早点回来,我一个人搞不定!”,这是一个爸爸、一个老公应该说的话吗?工作中做好工作,赚钱养家,回到家帮助家庭打理家务、赡养老人、照顾孩子,这些是一个有家的男人的职责,所以古话说得好“宠子不发”。回到技术领域。大家要明白,一家企业能够生存,一定是业务开展
技术面试技巧 我比较喜欢自己出面试题,不喜欢网上千篇一律的题目,当然公司出的笔试题我会认真批改,并将它作为挑选面试者的依据。我们以Java程序员面试题为例:1. 请使用两种设计模式编写代码。(考察基础编程能力)。2. 请描述面向对象的三个特性及使用场景。(考察基本面向对象知识)3. 编写数据结构相关的程序,例如“实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作”。(考察对于数据结构的了
逻辑思维能力观察 其实这个考察内容可以包含在面试技巧里。我一般会采用口述或者让面试者对我描述的场景和需要做的事情进行快速的归纳总结,从他开始阅读或者倾听我的话开始计时,直到他用最简洁的语句描述出事情的背景及我希望他做的事情。我们看下面这个例子:“我们今天想做一个测试,准确的说是想做一个系统接入能力的测试,也可以说是性能测试,有些公司当然也有其他的称呼,我们不多做纠结,就叫性能测试吧,三周时间内完成并提交测试报告,小
IT从业者职业生涯收入曲线分析 IT从业者在整个职业生涯的收入趋势,这个话题很多我的读者开小窗问我,我做一个自己的想法说明。根据我实际的观察,我认为一位IT从业者在整个职业生涯中的收入趋势可能由以下几种情况(最后三种是不可能出现的,我也列出,并做解释),我逐一说明。这条曲线说明从业者前期个人工作比较努力,因此收入一直在不断增长(所处行业也需要比较景气,以下同),进入职业生涯中期(比如35-45之间),收入开始趋于平稳,职业生涯末
第一个ZooKeeper客户端程序 我们可以采用新建一个工程,然后导入ZooKeeper.3.4.7.jar包,接着编写独立的JAVA程序的方式来实现演示工作,如果采用这种方式,需要javac –cp命令编译java文件,并使用java –cp命令运行编译后的文件。这里不采用这种方式,而是采用ZooKeeper自带的源代码程序,新创建一个test文件夹,如图所示。图1-3 ZooKeeper程序目录图新建了test文件夹,位于“or
大话性能优化 2011年1月,新加坡飞往杭州的航班。飞行持续时间很长,大约6个小时,坐在四周的人很快熟悉了,互相攀谈起来。有一位小姑娘,十六七岁的模样,长得很漂亮,默默地坐在座位上。热心的阿姨和她攀谈,问起她的情况,她带着疲倦自我介绍起来,“我在新加坡念初三,那所学校一点都不好,我在成都是最好的初中毕业的,也考上了成都最好的高中,但是,我的父母,他们一定要我来新加坡复读初三,让我考新加坡的高中,我一点都不喜欢这
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