Java面试细节总结

作者: 一抹斜阳丶 | 来源:发表于2018-03-15 17:31 被阅读767次

    Java基础

    • Jvm内存模型有哪些,分别有哪些gc算法,如何优化jvm进程参数;
    • HashMap的数据结构怎样的,为什么HashMap是线程非安全的;
    • ConcurrentHashMap如何做到线程安全;
    1. 首先HashMap的对象是存储在堆中的,堆是线程共有的。这样就有多线程操作同一数据源的基础。
    2. 其次。HashMap每次put的过程就是先通过hashcode找到对应的槽。然后顺序遍历Node链表对比(通过hashcode 和 equals)
    3. 然而,如果多线程同时put,有一定概率出现某一个线程put时,正好发生resize过程。 这时这个线程在resize,数据重新copy的时候,其他线程正在put。就有可能造成Node链表循环。这就是HashMap线程非安全的原因。
    4. ConcurrentHashMap线程安全是因为加锁。默认有16个segment,每个segment存储不同的hash值范围的key。put,get操作时,只需要lock部分数据源。但是调用全局方法等操作时,lock整个数据源。
    • 堆栈是线程公有的吗?为什么这么设计;
    • Java内存泄露的问题调查定位:jmap,jstack的使用等等;
    • Jvm进程cpu飙升如何检查;
    • atomicinteger和volatile等线程安全操作的关键字的理解和使用 ;

    Java进阶

    • 线程创建的三种方式,阐述下多线程的数据结构;
    • Java并发包的内容,阐述;
    • 多线程下访问一份数据,如何保证一致性;
    • Java有哪几种级别的锁,synchronized, lock有哪些区别;
    • 场景:在一个主线程中,要求有大量(很多很多)子线程执行完之后,主线程才执行完成。多种方式,考虑效率;

    linux

    • top命令结果的一些含义,比如第一行最后三个数字是什么意思;
    • 如何查看jvm进程;
    • shell等;

    数据库

    • mysql的事物隔离级别;
    • acid的特性是什么;
    • mysql锁的产生原因,如何避免;
    • mysql索引的建立规则,底层数据结构如何建立的,mysql索引查询的效率依赖什么;

    常用中间件

    • rocketmq/ kafka有哪些模块,相互之间如何调用的,各自处理什么事情;
    • redis常用的数据结构,redis对存储做了哪些优化;
    • redis节点增删,rebalance的过程发生了什么;
    1. 首先redis的rebalance发生场景,是在redis集群增减节点时发生的。
      redis集群,通过hash槽将不同节点存储不同的数据块范围。hash槽是典型的圆环式。
    2. 增加节点到redis集群,redis不会立即提供服务,会有槽重新分配的过程。但是因为是hash槽,只会从某一节点划分部分数据到新的节点。
    3. 删除节点,也是不会立即下线,会将该节点的数据,按照重新hash值划分到不同的节点上。
    4. 整个过程就是rebalance。如果配置人rdb, aof 就能支持秒级持久化。其中持久化也是异步操作,性能无需担心。基本不会有什么问题。
    • nginx的进程启动是多少个,nginx重启为什么那么快,发生了什么;

    常见大题

    • 10亿url,存在文本中,有重复的。且类型种类不可控制。取出top n;
    1. 按照hash值按照url分流,循环递归拆分子文件,使得小文件小于内存大小。需保证同一url只能出现在一个子文件中;
    2. 建立队列,判断文件大小, 同时计算n个文件,快排得出结果;
    3. 归并排序得到top n的值。
    • 有活动页面,需要统计在线人数,给出方案。

    • 有商品评论页面,读写比大于1K,要求能查询所有评论,我的评论,并支持分页。如何设计缓存key的方案。

    答案太多,慢慢补充。欢迎关注

    相关文章

      网友评论

      本文标题:Java面试细节总结

      本文链接:https://www.haomeiwen.com/subject/ifwhqftx.html