public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } // 键为 null 单独处理 if (key == null) return putForNullKey(value); int hash = hash(key); // 肯定桶下标 int i = indexFor(hash, table.length); // 先找出是否已经存在键为 key 的键值对,若是存在的话就更新这个键值对的值为 value for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; // 插入新键值对 addEntry(hash, key, value, i); return null; }
static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; int hash; }
索引失效:
https://blog.csdn.net/u011498644/article/details/72698517
分支更多,深度更浅(更少的IO次数)java
公平锁:每一个线程抢占锁的顺序为前后调用 lock 方法的顺序依次获取锁,相似于排队吃饭。web
读取i; i=i+1;这是多个操做;
能够 使用AtomicInteger类的getAndIncrement()方法实现i++redis
public final int getAndIncrement() { for (;;) { int current = get(); // 取得AtomicInteger里存储的数值 int next = current + 1; // 加1 // 调用compareAndSet执行原子更新操做 if (compareAndSet(current, next)) return current; } }
类别 | syncronized | ReentrantLock |
---|---|---|
可重入 | 是 | 是 |
公平性 | 否 | 是 |
阻塞的线程数量 | ReentrantLock 提供了一个很synchronized 关键字不具有的方法 tryLock() 。 该方法仅仅当锁未被其余线程占用的时, 才会获取锁, 这样能够减小同一时刻阻塞在同一个锁上的线程数量 | |
可中断 | 长期阻塞 | 可被中断 |
条件变量 | 不支持 | 支持 |
volatile能够实现禁止指令重排的做用。
经过“内存屏障”方式禁止指令重排算法
(1)可见性。一个变量声明为volatile,就意味着这个变量是随时会被其余线程修改的,所以不能将它cache在线程memory中。
(2)禁止指令重排序spring
安全数据库
序列化算法通常会按步骤作以下事情:
(1)将对象实例相关的类元数据输出。
(2)递归地输出类的超类描述直到再也不有超类。
(3)类元数据完了之后,开始从最顶层的超类开始输出对象实例的实际数据值。
(4)从上至下递归输出实例的数据后端
http://www.javashuo.com/article/p-zglzmmfr-dp.html设计模式
http://www.javashuo.com/article/p-qibouqrk-o.htmlapi
排队:
直接提交
有界队列
无界队列数组
拒绝:
4个
http://www.javashuo.com/article/p-khyvetso-dt.html
ping
ICMP
(1)不要显式调用System.gc()
(2)尽可能减小临时对象的使用
(3) 对象不用时显式置为null
(4) 尽可能使用StringBuffer来累加字符串
(5) 尽可能使用基本类型
(6) 尽可能少用静态对象变量
(7) 分散对象建立或者删除的时间
jvm server比jvm client 更优化,
jvm server 启动较慢但启动后运行速度较快。jvm client 启动较快。
jvm client 中能运行的可能在jvm server中运行出错 ,因此这样的话最好在开发、测试阶段都使用jvm server ,保持和服务器相同。不过一直用client,也没出现过什么问题,服务器端用的是server的。可能这种高技术含量的bug至关不容易出现了。
JVM Server模式与client模式启动,最主要的差异在于:-Server模式启动时,速度较慢,可是一旦运行起来后,性能将会有很大的提高。JVM若是不显式指定是-Server模式仍是-client模式。
1.减小查询的模糊匹配
尽可能避免在一个复杂查询里面使用 LIKE ‘%parm1%’—— 红色标识位置的百分号会致使相关列的索引没法使用,最好不要用.
解决办法:
其实只须要对该脚本略作改进,查询速度便会提升近百倍。改进方法以下:
a、修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改成下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就能够直接用等于来关联了。
b、直接修改后台——根据输入条件,先查出符合条件的供应商,并把相关记录保存在一个临时表里头,而后再用临时表去作复杂关联
◆避免对索引字段进行计算操做
◆避免在索引字段上使用not,<>,!=
◆避免在索引列上使用IS NULL和IS NOT NULL
◆避免在索引列上出现数据类型转换
◆避免在索引字段上使用函数
◆避免创建索引的列中使用空值。
http://database.51cto.com/art/200904/118526.htm
浅谈系统性能调优思路
web服务器访问缓慢,做为运维人员,如何定位故障?
ASP.NET 性能监控和优化入门
Linux内核源码之自旋锁的实现
//--------------------------------------------------------个人蚂蚁三面---------------------------------------------------------
从项目入手
static finally public private 方法
就是要了解对象的序列化机制
//--------------------------------------------------------个人蚂蚁二面---------------------------------------------------------
不是
(1)不讲效率的话,hashtable
(2)concurrentHashMap
(1)getValue;
(2)value++;
(3)putValue;
不能保证线程安全的
将value的int类型改成AtomicInteger类型
safe类+CAS
读写锁
(1)保证可见性
(2)防止指令重排
Eden --> 老年代
标记-清除
标记-整理
复制
分代
碎片
分配时:
gc时:
没
c会超时重传
讲了page cache
内外存之间的缓存
置脏页
没
RPC
//--------------------------------------------------------个人蚂蚁一面---------------------------------------------------------
(1)数组连续地址空间;链表不是连续的
(2)数组能够根据index直接取数据
(3)空间的占用不同,链表有额外开销。
碎片
标记-清除
标记-整理
复制
分代
关键地方;是否会中断正在运行的程序