蚂蚁金服/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次数)

对于concurrentHashMap,如果两个线程访问的是同一段,这两个线程的操作是并行的还是串行的?

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

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

i++为什么不能保证原子性?如何让i++可以保证原子性?

读取i; i=i+1;这是多个操作;
可以 使用AtomicInteger类的getAndIncrement()方法实现i++

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)禁止指令重排序

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

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

hdfs副本复制是安全的吗?

安全

序列化底层是怎么实现的

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

字节与字符的区别

tomcat集群怎么保证同步

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

乐观锁vs悲观锁

https://juejin.im/post/5b4977ae5188251b146b2fc8

并发包里了解哪些

b树,b+树,b*树

java有什么后端技术

springIOC优点

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

描述一下java线程池。

https://blog.csdn.net/fuyuwei2015/article/details/72758179

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

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

拒绝:
4个
https://blog.csdn.net/wang_rrui/article/details/78541786

怎么保证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滑动窗口。拥塞控制,用塞避免

发布了306 篇原创文章 · 获赞 46 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/kaikai_sk/article/details/88874946