面试笔记9.21

面试笔记9.21

Zookeeper选举机制
	1,启动时
	2,集群运行期间
	Paxos
		解决分布式系统就某个协议达成一致的方案
分布式锁
	解决什么问题:分布式环境下解决共享资源问题
	场景:多台机器并发抢购商品
	步骤1:竞争set key  锁标识  value  客户端标识(推荐uuid)
		步骤2:设置有效期ttl,防止死锁,uuid只有保障上锁者有权解锁
			步骤三:处理业务逻辑
				步骤4:到期自动释放||逻辑结束惟一标识释放
	特征
		互斥性
			任意时刻只有一个客户端能够获取锁
		防死锁
			避免客户端在释放锁前宕机,其余客户端没法得到锁
		持锁线程解锁
			锁只能由加锁者释放
		可重入
			能够再次得到锁
高并发数据库优化
	数据库设计使用规范
		根据业务和字段长度和类型
			枚举 布尔 -》tinyint
			数量 -》Integer
			订单号 -》bigint
			金额 -》decimal,不用double
			经纬度坐标 -》double
			日期 -》datetime,不用时间戳
			尽可能不用大字段
	sql执行计划优化
		避免全表扫描
			禁止使用属性隐式转换 类型与字段类型不符
			禁止在where条件的属性上使用函数或表达式
			禁止负向查询
				eg: NOT, !=, <>, !<, !>,  NOT IN, NOT LIKE
			以%开头的模糊查询
		大表禁止join查询
			产生的临时表消耗过多内存及数据库性能
	分库分表
		分库
			业务分库:用户,订单,帐号业务
			流量会落到常常访问的业务库,不影响其余业务
		分表
			eg:单表数据超过500W,查询变慢
			id: 建立日期时间戳+客户端id
			数据分配规则:UID%数据库数量
	技术落地
		解决高并发都需求
			mysql  binlog主从架构方案分组
				主:写入
				从:查询
		解决单库高并发数据压力过大
			mysql  shading集群
				分库切片
JVM虚拟机
	GC
		说明:gc时对jvm中内存的垃圾进行收集和销毁
			回收算法
				1:标记清除
					1.1:标记全部须要回收的对象
					1.2:统一回收被标记对象
					特色:效率不高,空间不连续,产生内存碎片,当分配大对象时,没法找到连续内存,被迫触发另外一次垃圾回收
				2:复制算法
					将内存按容量分为相等的两部分,每次使用其中一块,将活着的对象复制到另外一部分,将已使用的内存一次清理掉 
					特色:实现简单,效率高,内存缩小为一半,代价过大
				3:标记整理
					标记后将全部存活对象向一端移动,而后直接清理掉边界之外的内存
				4:分代收集收集(经常使用)
					把Java堆分开
						新生代
							特色:回收率高,采用复制算法
						老年代
							特色:存活率高,采用标记清楚算法或标记整理
						永久代
							方法区永久代:存储class类,变量,方法描述
								特色:回收废弃的常量,无用的类
		stop the world
项目问题
	JVM故障分析
		gc卡断
		线程停顿
	cpu分析 经过top命令
	jstack [pin]的堆栈信息分析
	可能缘由
		线程中无线空循环
		正则表达式无限制向上匹配
		无阻塞
		线程上下文切换
		文件io和网络io阻塞