GC
GC三种基本方式
- 标记清除方式(Mark and Sweep) 从根开始将可能被引用的对象用递归的方式进行标记,然后将没有标记到的对象作为垃圾进行回收。缺点:分配了大量对象,并且其中只有一小部分存货的情况下,消耗过多不必要时间。变形:标记压缩(Mark and Compact)
- 复制收集方式(Copy and Colection) 克服标记清除法中的缺点。从根开始,将被引用的对象递归复制到另外的空间中。缺点:存活对象比例较高,不利。优点:局部性(Locality)。
- 引用计数方式(Reference Count) 每个对象中保存该对象的引用计数,当引用增减时对计数进行更新。缺点:无法回收循环引用,增减计数的bug,不适合并行管理。优点:实现容易,瞬间释放,中断时间短。
进一步改良:
- 分代回收(Generational GC) 一般性程序所具备的性质:大部分对象都会在短时间内成为垃圾,而经过一定时间依然存活的对象往往拥有较长的寿命。记录集(remembered set)用于对来自老生代的引用进行记录。
- 增量回收(Incremental GC) 为了维持程序的实时性,不等到GC全部完成,而是将GC操作细分成多个部分逐一执行。采用写屏障,解决渐进GC过程中,程序运行时对对象的引用关系变化问题。
- 并行回收。
数据库
ACID特性(Atomicity,Consistency,Isolation,Durability)
CAP(Consistency,Availaility,Partition Tolerance) 解决大规模数据库不能满足ACID特性
BASE(Basically Available,Soft-state,Eventually consistent) CAP的解决方案
SQL Databases vs NoSQL Databases –Michael Stonebraker
- NoSQL的优势在于性能和灵活性。
- NoSQL的性能优于SQL这一说法,并非在所有情况下都成立。
- 通常认为NoSQL是通过牺牲SQL和ACID特性来实现其性能的,然而性能问题与SQL和ACID是无关的。
根据这篇文章,决定SQL数据库性能的,是客户端与服务器之间的通信开销,以及服务器上的事务处理开销。而通信开销可以通过将大部分处理放在服务器上的存储过程(Stored Procedure)在一定程度上得以解决。
而对于服务器上的处理,大致进行分类的话,主要有4个瓶颈,而对于这些瓶颈的应对就是决定性能的关键:
- 日志(Logging):为了防止磁盘崩溃等故障的发生,大多数关系型数据库都会执行两次写入。即数据库一次,日志一次。而且为了防治日志信息丢失(D),必须保证这些数据确实写入了磁盘中。
- 事务锁(Locking):为了防止其他线程对记录进行修改。
- 内存锁(Latching):指对锁和B树等共享数据结果进行访问时所需要的一种排他处理方式。
- 缓存管理(Buffer Management):数据库的数据是写入都固定长度的磁盘页面中的。对于哪个数据写入哪个页面,或者是哪个页面的数据缓存在内存中。
see VoltDB (比传统RDBMS高50倍的成绩)
- & 4. 内存数据库,持久性是通过复制(replication)的方式来维持的,也提供了定期将数据写入文件的快照功能。
- & 3. 数据库分割成多个分区(partition)来管理的,对于每个分区都分配了一个独立的管理线程。
Redis (对memcached的不满)
意大利程序员Salvatore Sanfilippo
- 内存型
- 支持永久化
- 支持分布
- 除字符串之外的数据结构
- 高速
- 原子性(单线程实现)
- 不兼容memcached协议
多核编译
ccache,distcc
# CC=’ccache gcc’ make -j4 # .ccche
# CC=’distcc gcc’ make -j4 # ~/.distcc/hosts
提高工作效率
- 减负,由惯性思维所产生的不必要不紧急的工作,如果能够砍掉的话,就能够大幅度提高工作效率。
- 拖延,按照紧急程度从高到低来完成任务的话,就可以进一步提高自己的工作效率。还要注意相互依赖关系。
- 委派,多核的困难:任务分割、通信开销、可靠性。
Node.js
事件驱动模型,在事件检测上,采用与连接数无关,能够维持一定性能的epoll(Linux)和kqueue(FreeBSD),减少每个连接所消耗的资源。
分布式
阿姆达尔定律:(通过并行计算所获得的)系统性能提升效果,会随着无法并行的部分而产生饱和。
活用多CPU的处理:
- 数据分割、分配
- 对已分配的数据进行并行处理
- 将已处理的数据进行集约
ZeroMQ
底层通信手段:
1. tcp
2. ipc 同一台计算机上进行进程间通信
3. inproc 统一进程中的线程间通信
4. multicast 采用UDP实现的多播通信
为分布式应用程序的构建提供的主要连接模型
- REQ/REP 应答模型,双向通信
- PUB/SUB 在服务器注册过的客户端都会收到该信息,数据分发布数等场合,单向通信
- PUSH/PULL 向队列中添加和取出信息的一种模型,应用场景:管道(一对一)、任务分配(一对多)、任务集约(多对一),单向通信
- PAIR 一对一双向