蚂蚁金服/OceanBase面试

HashMap内部实现原理

  • 散列表解决冲突的方法
    -开放定址法
    -再哈希法
    -链地址法
    -公共溢出区
  • put的具体步骤
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;
}
  • hashmap的Entry存储了哪些东西
static class Entry<K,V> implements Map.Entry<K,V> 
{
    final K key;
    V value;
    Entry<K,V> next;
    int hash;
}

TCP三次握手

TCP链接,客户端发送一个包给服务端,客户端怎么知道包是否丢失了?

数据库索引的做用。何时索引失效?数据库索引为何不用红黑树

索引失效:
https://blog.csdn.net/u011498644/article/details/72698517
分支更多,深度更浅(更少的IO次数)java

对于concurrentHashMap,若是两个线程访问的是同一段,这两个线程的操做是并行的仍是串行的?

如何设计线程获取锁的公平性?

公平锁:每一个线程抢占锁的顺序为前后调用 lock 方法的顺序依次获取锁,相似于排队吃饭。web

i++为何不能保证原子性?如何让i++能够保证原子性?

读取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;
      }
 }

ReentrantLock比syncronized有什么优点?

类别 syncronized ReentrantLock
可重入
公平性
阻塞的线程数量 ReentrantLock 提供了一个很synchronized 关键字不具有的方法 tryLock() 。 该方法仅仅当锁未被其余线程占用的时, 才会获取锁, 这样能够减小同一时刻阻塞在同一个锁上的线程数量
可中断 长期阻塞 可被中断
条件变量 不支持 支持

禁止指令重排序,怎么实现的?

volatile能够实现禁止指令重排的做用。
经过“内存屏障”方式禁止指令重排算法

Java的volatile的做用

(1)可见性。一个变量声明为volatile,就意味着这个变量是随时会被其余线程修改的,所以不能将它cache在线程memory中。
(2)禁止指令重排序spring

多核多线程系统,缓存和内存不一致怎么办?

  • Cache一致性协议
    目录式协议
    物理存储器中数据块的共享状态被保存在目录中
    监听式协议
    每一个cache除了包含物理存储器中块的数据拷贝以外,也保存着各个块的的共享状态信息
    *两种方法解决cache一致性问题
    写做废协议
    在处理器对某个数据进行写入以前,保证它拥有对该数据项的惟一访问权(做废其它的副本)
    写更新协议
    当处理器对某数据项进行写入时,经过广播使其它cache中全部对应于该数据项的副本进行更新。

hdfs副本复制是安全的吗?

安全数据库

序列化底层是怎么实现的

序列化算法通常会按步骤作以下事情:
(1)将对象实例相关的类元数据输出。
(2)递归地输出类的超类描述直到再也不有超类。
(3)类元数据完了之后,开始从最顶层的超类开始输出对象实例的实际数据值。
(4)从上至下递归输出实例的数据后端

字节与字符的区别

tomcat集群怎么保证同步

怎么解决项目中超卖的问题

乐观锁vs悲观锁

http://www.javashuo.com/article/p-zglzmmfr-dp.html设计模式

并发包里了解哪些

b树,b+树,b*树

java有什么后端技术

springIOC优势

jdk动态代理vscglib动态代理,他们底层分别怎么实现的

描述一下java线程池。

http://www.javashuo.com/article/p-qibouqrk-o.htmlapi

线程池的排队策略和拒绝策略

排队:
直接提交
有界队列
无界队列数组

拒绝:
4个
http://www.javashuo.com/article/p-khyvetso-dt.html

怎么保证redis和db中的数据一致

设计模式怎么用到项目中?

类加载

一条链路中,某两个节点间断了,怎么判断?

ping

ping和traceroute用的什么协议?

ICMP

程序中如何减小GC

(1)不要显式调用System.gc()
(2)尽可能减小临时对象的使用
(3) 对象不用时显式置为null
(4) 尽可能使用StringBuffer来累加字符串
(5) 尽可能使用基本类型
(6) 尽可能少用静态对象变量
(7) 分散对象建立或者删除的时间

Client版本的JDK和Server版本的jdk的区别

jvm server比jvm client 更优化,

jvm server 启动较慢但启动后运行速度较快。jvm client 启动较快。

jvm client 中能运行的可能在jvm server中运行出错 ,因此这样的话最好在开发、测试阶段都使用jvm server ,保持和服务器相同。不过一直用client,也没出现过什么问题,服务器端用的是server的。可能这种高技术含量的bug至关不容易出现了。

JVM Server模式与client模式启动,最主要的差异在于:-Server模式启动时,速度较慢,可是一旦运行起来后,性能将会有很大的提高。JVM若是不显式指定是-Server模式仍是-client模式。

优化Sql 语句

1.减小查询的模糊匹配

尽可能避免在一个复杂查询里面使用 LIKE ‘%parm1%’—— 红色标识位置的百分号会致使相关列的索引没法使用,最好不要用.

解决办法:

其实只须要对该脚本略作改进,查询速度便会提升近百倍。改进方法以下:

a、修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改成下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就能够直接用等于来关联了。

b、直接修改后台——根据输入条件,先查出符合条件的供应商,并把相关记录保存在一个临时表里头,而后再用临时表去作复杂关联

  1. 索引的使用
    不要在创建的索引的数据列上进行下列操做:

◆避免对索引字段进行计算操做
◆避免在索引字段上使用not,<>,!=
◆避免在索引列上使用IS NULL和IS NOT NULL
◆避免在索引列上出现数据类型转换
◆避免在索引字段上使用函数
◆避免创建索引的列中使用空值。

http://database.51cto.com/art/200904/118526.htm

Web系统性能很差的优化和排查思路

浅谈系统性能调优思路
web服务器访问缓慢,做为运维人员,如何定位故障?
ASP.NET 性能监控和优化入门

自旋锁的实现

Linux内核源码之自旋锁的实现
//--------------------------------------------------------个人蚂蚁三面---------------------------------------------------------
从项目入手

1. 对page cache的理解

2. page cache的脏页的处理

3. Linux内核中是怎么优化写的?

4. 内存管理

5. 内存管理中对碎片的处理

6. 内存中swap文件的处理

7. 冷内存 热内存

8. 你测试过HDD和SSD的随机读和顺序读的性能差别吗?

9. 协程实现原理

10. memcpy和memmove的区别以及实现原理

11. 写java程序的时候如何避免频繁gc

12. ByteBuffer类对象的位置

13. JDK Client模式和Server模式的区别

Full GC 会回收方法区吗?

JVM线程是占堆内内存仍是堆外内存?

线程结束后是怎么回收呢?

序列化机制,哪些要序列化,哪些不须要呢?

static finally public private 方法

你认为final修饰的变量会被序列化吗?

就是要了解对象的序列化机制

Integer,boolean,String变量是在内存哪一个区域的?

//--------------------------------------------------------个人蚂蚁二面---------------------------------------------------------

hashmap是线程安全的吗

不是

若是不是,怎么办呢?

(1)不讲效率的话,hashtable
(2)concurrentHashMap

concurrentHashMap必定是线程安全的吗?记录博客访问量场景,id是key,访问量做value,能保证value修改的安全吗?

(1)getValue;
(2)value++;
(3)putValue;
不能保证线程安全的

上面的不能保证线程安全,如何解决呢?

将value的int类型改成AtomicInteger类型

AtomicInteger内部实现

safe类+CAS

好,讲一下CAS原理

回来看下concurrentHashMap的实现,分段锁,读读,读写,写写,在分段锁那里是串行的吗?

若是让你实现读读,读写,写写的并发同步怎么设计?

读写锁

你用过读写锁吗? 怎么用的?

讲讲volatile关键字

(1)保证可见性
(2)防止指令重排

volatile关键字如何保证可见性的

防止指令重排又是怎么作的呢?

java对象在存货期间的声明过程

Eden --> 老年代

新生代到老年代的年龄阈值是多少呢?

垃圾回收算法有了解吗?

标记-清除
标记-整理
复制
分代

标记-清除缺点?

碎片

好,碎片是怎么产生的呢?

分配时:
gc时:

红黑树和跳表的区别

数据库索引用的是红黑树吗?为何不用红黑树?

Redis实现看过吗?

看下网络,当TCP链接创建以后,包丢失了,C/S各怎么处理?

c会超时重传

超时重传会无限重传吗?

server端如何识别重传的包?如何处理重传包?

讲一下你看过的源码。

讲了page cache

好,page cache的做用是什么呢?

内外存之间的缓存

好,缓存存在一致性的问题,page cache的一致性问题是如何解决的?

置脏页

netty框架用过吗?

hdfs各个节点是怎么链接的?

RPC

讲讲hdfs的RPC吧

//--------------------------------------------------------个人蚂蚁一面---------------------------------------------------------

1. 数组和链表的区别

(1)数组连续地址空间;链表不是连续的
(2)数组能够根据index直接取数据
(3)空间的占用不同,链表有额外开销。

2. 对象数组和链表的占有的空间是同样的吗?

3. 引用占用多少字节?

4. 大量使用链表会有什么弊端?

碎片

4. 碎片化怎么解决?

5. JVM中的碎片是怎么解决的?

标记-清除
标记-整理
复制
分代

6. 标记-清除和标记-整理各自的优缺点是什么?

关键地方;是否会中断正在运行的程序

7. syncronize和volatile关键字

8. volatile可见性的实现

9. syncronize和ReentrantLock的区别

10. 网络三次握手。

11. 第三次的握手的包丢了怎么办?

12. 第三次握手的包丢了,服务端怎么处理发过来的正常数据包

13. 第三次握手的包延迟了。数据包先到了,这种状况怎么处理?

13. TCP滑动窗口。拥塞控制,用塞避免