wenwan 8 年 前
コミット
f7fff15cc9

+ 1 - 2
README.md

@@ -14,8 +14,6 @@
 *	HttpClient
 *	常用的设计模式
 
-### 进阶知识
-*	[一致性hash算法](advanced-knowledge/一致性hash.md)
 
 ### 数据库
 目前使用最多还是mysql,虽然单机性能比不上oracle,但免费开源,单机成本低且借助于分布式集群,可以有强大的输出能力。
@@ -60,3 +58,4 @@
 ### 其它
 
 *	抓包软件(charles)
+*	[一致性hash算法](other/一致性hash.md)

BIN
basic-knowledge/img/1.jpg


BIN
basic-knowledge/img/2.jpg


+ 1 - 1
basic-knowledge/java.md

@@ -13,6 +13,6 @@
 
 
 ### 进阶
-*  	jvm 内存结构
+*  	[jvm 内存结构](jvm内存结构.md)
 *  	jvm 性能调优
 * 	常用的jdk命令

+ 32 - 0
basic-knowledge/jvm内存结构.md

@@ -0,0 +1,32 @@
+## jvm内存结构
+
+---
+
+####虚拟机运行时的数据区
+![image](img/1.jpg)
+
+a)程序计数器(program counter register),一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。由于java虚拟机是采用多线程,通过线程切换获得时间片得到cpu的控制权。为了线程切换后能恢复到正确的执行位置。
+
+b)虚拟机栈,调用一个方法时会创建一个栈帧,用于存储局部变量、对象引用、方法返回值,每一个方法从调用到执行完成,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。通过 -Xss控制大小,如果线程请求的栈深度大于虚拟机所允许的深度,会抛出StatckOverflowError。
+通过递归死锁会引发这种问题。
+
+c)本地方法栈,与虚拟机栈相似,主要是针对native方法服务。
+
+d)堆(heap),所有线程共享,通过new操作产生对象,存放对象实例,分为年轻代(eden、两个survivor)和年老代,通过-Xmx和-Xms控制大小,如果内存不足会抛OutOfMemoryError。通过GC释放
+
+e)方法区:主要是类信息、常量、静态变量,也叫持久代,通过-XXMaxPerSize控制大小,当方法区无法满足内存分配需求时也会抛出OutOfMemoryError。特别注意动态代理子类,在运行期会创建很多新的子类,导致空间不足。
+
+![image](img/2.jpg)
+
+
+* Young GC 
+
+	Eden Space 满了 ;Survivor Space 满了
+
+* Full GC
+
+	老年代满了;持久代满了
+	
+```
+jstat –gcutil  进程ID  刷新时间(可以实时监控jvm 的gc情况)
+```

BIN
other/img/Snip20160613_8.png


+ 85 - 0
other/一致性hash.md

@@ -0,0 +1,85 @@
+## 一致性hash算法
+
+---
+
+### 简介
+
+一致性hash在缓存方面用的比较多,一般用来寻找路由节点,避免节点扩容导致的大面积数据原节点失效。
+
+1.构造节点,循环,每一个cache节点会将Long类型数字拆成160份。
+
+TreeMap的大小=节点数*160
+
+```
+		nodes = new TreeMap<Long, Node>();
+		for (int i = 0; i != shards.size(); ++i) {
+			final Node shardInfo = shards.get(i);
+			for (int n = 0; n < 160 ; n++) {
+				nodes.put(MurmurHash.hash("SHARD-" + i + "-NODE-" + n), shardInfo);
+		}
+	
+
+```
+MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc++、nginx、libmemcached等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的CityHash算法。 
+
+官方网站:https://sites.google.com/site/murmurhash/ 
+
+MurmurHash算法,自称超级快的hash算法,是FNV的4-5倍。
+
+```
+
+	public static long hash64A(ByteBuffer buf, int seed) {
+		ByteOrder byteOrder = buf.order();
+		buf.order(ByteOrder.LITTLE_ENDIAN);
+
+		long m = 0xc6a4a7935bd1e995L;
+		int r = 47;
+
+		long h = seed ^ (buf.remaining() * m);
+
+		long k;
+		while (buf.remaining() >= 8) {
+			k = buf.getLong();
+
+			k *= m;
+			k ^= k >>> r;
+			k *= m;
+
+			h ^= k;
+			h *= m;
+		}
+
+		if (buf.remaining() > 0) {
+			ByteBuffer finish = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
+			// for big-endian version, do this first:
+			// finish.position(8-buf.remaining());
+			finish.put(buf).rewind();
+			h ^= finish.getLong();
+			h *= m;
+		}
+
+		h ^= h >>> r;
+		h *= m;
+		h ^= h >>> r;
+
+		buf.order(byteOrder);
+		return h;
+	}
+```
+
+初始化的TreeMap的内容:
+
+![image](img/Snip20160613_8.png)
+
+2.根据缓存key找具体的数据节点
+
+```
+public Node getNodeByKey(byte[] key) {
+		//取大于或等于hash key的列表
+		SortedMap<Long, Node> tail = nodes.tailMap(MurmurHash.hash(key));
+		if (tail.isEmpty())
+			return nodes.get(nodes.firstKey());
+		return tail.get(tail.firstKey());
+	}
+
+```