V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxc1234
V2EX  ›  程序员

请教 Java 面试题

  •  
  •   zxc1234 · 2020-03-25 18:32:43 +08:00 · 4811 次点击
    这是一个创建于 1707 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.java 内存模型为什么要有 工作内存和主内存

    2.java new 一个对象的时候,什么情况下会发生 GC

    如果新生代和老年代没有满呢

    3.jdk 8 去掉方法区用 元数据 代替,是为什么?

    4.dubbo 调用一个服务的详细过程

    第 1 条附言  ·  2020-03-26 11:22:16 +08:00
    5.如果服务器部署在一个机房,没有跨机房,那么机房挂了 比如断电了,网络不通

    那么应该如何处理,有什么措施吗
    第 2 条附言  ·  2020-03-26 20:50:23 +08:00
    6. 表 test 有 a,b,c,d

    建立联合索引:b,c,d

    如果查询语句 select * from test where b = “aaa” and c=“bbb” and d=“eee”

    会用到 索引吗 为什么
    第 3 条附言  ·  2020-03-26 20:51:07 +08:00
    7. 表 test 有 a,b,c,d

    建立联合索引:b,c,d

    如果查询语句 select * from test where c = “aaa” and d=“bbb” and b=“eee”

    会用到 索引吗 为什么
    第 4 条附言  ·  2020-03-27 23:54:32 +08:00
    8.关于 B+tree 的疑问

    mysql 中 innodb 引擎索引使用 B+tree

    我看网上资料说 ===:

    ( B+ 树中的节点不存储数据,只是索引,而 B 树中的节点存储数据)

    可是 innodb 的主键索引的叶子节点就是数据啊

    请问 是哪里不对吗
    48 条回复    2020-04-02 18:49:22 +08:00
    hantsy
        1
    hantsy  
       2020-03-25 18:38:06 +08:00
    这是 P8 的面试吗?
    hantsy
        2
    hantsy  
       2020-03-25 18:38:52 +08:00
    内存模型,虚拟机,GC 全上了。
    luckyrayyy
        3
    luckyrayyy  
       2020-03-25 18:39:08 +08:00
    1. cpu 都有三级缓存啊,速度更快,还有寄存器。
    2. gc root 不可达该对象的时候。满了就 full gc,没满就 minor gc
    3. 方法区是一个概念吧,虽然永久代去除了,不能说方法区没有了。不知道为什么... HotSpot 觉得实现方式不合适?
    zxc1234
        4
    zxc1234  
    OP
       2020-03-25 18:44:38 +08:00
    @hantsy p8 问这些????
    hantsy
        5
    hantsy  
       2020-03-25 18:55:44 +08:00
    这种面试的公司有病。。。
    cxshun
        6
    cxshun  
       2020-03-25 19:00:40 +08:00
    1 、为了优化啊,每次都从主内存读,肯定性能不大行
    2 、gc root 不可达的情况下。
    新生代的 eden 区未满不会有 GC,只有 eden 区快要满才,会发生 ygc,并且 s0,s1 交换
    3 、没有去年方法区,去掉永久代,改为元数据区。这样是为了突破 JVM 的内存限制,直接使用物理内存。
    4 、dubbo 调用会先从 zookeeper 拉取 producer 的地址列表 ,然后根据负载均衡算法挑选一下进行调用。他们的协议是用自己的。我用的不多,只知道大概原理。
    zxc1234
        7
    zxc1234  
    OP
       2020-03-25 22:16:35 +08:00
    @cxshun 第四个 如果负载均衡选到了挂掉的机器,怎么办
    hangszhang
        8
    hangszhang  
       2020-03-25 22:44:47 +08:00
    @zxc1234 挂了的话 zk 会知道
    y0bcn
        9
    y0bcn  
       2020-03-25 22:52:55 +08:00
    钓鱼贴?
    varrily
        10
    varrily  
       2020-03-25 23:23:57 +08:00
    4.dubbo 调用一个服务的详细过程

    spi, 动态代理,序列化,netty,nio,zk,选举,cap,重试机制

    java 的东西,深究起来是个无底洞,回答上关键字就行了。
    ysjiang4869
        11
    ysjiang4869  
       2020-03-26 00:04:31 +08:00 via Android
    阿里不都是这么问的么
    skypyb
        12
    skypyb  
       2020-03-26 07:15:07 +08:00
    额, 我当时一年经验去面试,好像也是问的这些东西
    java 圈子好像就是这样的。 (摊手
    人均百万并发、 面试问就是多线程、GC 、微服务、分布式。 哈哈
    ixx
        13
    ixx  
       2020-03-26 09:28:26 +08:00
    @cxshun #6 我猜你用五笔
    cxshun
        14
    cxshun  
       2020-03-26 09:58:51 +08:00
    @zxc1234 #7 对的,8 楼的兄弟回答了哈。由 zk 去维持心跳,挂了的会被剔除的。当然,客户端也会有相应的重试。因为客户端在拉取 provider 列表的时候,会保存在本地一段时间,如果此时某台机器不可用,客户端并不知道,这里调用就会失败,客户端会发起重试。
    @ixx #13 哈哈,是啊。是因为我把”去掉“打成”去年“了是吧
    zxCoder
        15
    zxCoder  
       2020-03-26 10:30:43 +08:00
    @skypyb 有没有问得比较简单的,想学一下,不想学 java 了
    sagaxu
        16
    sagaxu  
       2020-03-26 11:22:36 +08:00 via Android
    虽然没用,也不体现能力,但是就是爱问,毕竟很多面试官没有能力出题,只能网上找宝典问,久而久之,大家都觉得这些很重要了
    zxc1234
        17
    zxc1234  
    OP
       2020-03-26 11:23:14 +08:00
    @cxshun
    @varrily
    @hangszhang
    @cxshun
    @luckyrayyy 请问下 第 5 点怎么处理呢 真诚求答 多谢~
    zxc1234
        18
    zxc1234  
    OP
       2020-03-26 11:27:43 +08:00
    个人觉得问这些没问题,要不然筛选候选人呢,怎么面试比较好呢
    zxc1234
        19
    zxc1234  
    OP
       2020-03-26 11:28:11 +08:00
    @y0bcn 为什么这么觉得?????
    luckyrayyy
        20
    luckyrayyy  
       2020-03-26 11:39:01 +08:00
    我也不太清楚第五点问的是什么,推测只是考察解决问题的思路?
    既然限定了没有跨机房,还是物理层的原因,那软件层面是处理不了故障了,只能尽量减少损失...说说怎么做日常的数据备份,通电之后怎么清理脏数据,怎么做数据恢复,怎么保证跟其他地方的数据一致性?跟其他机房有数据同步的话,会不会一开机就有这段时间攒下的数据涌进来?怎么避免类似缓存雪崩一样的问题?

    展开能说的就太多了,每一个点都有可能深问你,仅供参考。
    zxc1234
        21
    zxc1234  
    OP
       2020-03-26 11:42:08 +08:00
    @luckyrayyy 那如果是集群方式部署,跨机房呢
    luckyrayyy
        22
    luckyrayyy  
       2020-03-26 11:50:33 +08:00
    @zxc1234 我的话可能会从数据一致性、可用性方面回答。可以说说像多集群多节点的话怎么做数据同步,怎么保证数据一致,了解分布式一致性协议类似 raft 、zab 算法可以说一说。流量猛地转移到另一个机房会不会承载不了啊,是不是得扩容、熔断降级什么的...能说的也蛮多的。
    cxshun
        23
    cxshun  
       2020-03-26 12:06:03 +08:00
    @zxc1234 #17 单机房,机房挂了就没了。
    如果是上了云,有前置的 Load Balance,可以赶紧挂上一个新的另外一个机房的服务。如果没有用 LB,是直连机房,那神仙都没办法了,只能等恢复了。
    zxc1234
        24
    zxc1234  
    OP
       2020-03-26 12:09:31 +08:00
    @cxshun 所以一般是多机房部署,一个机房挂了,切到另一个机房 是这样子吗
    Aresxue
        25
    Aresxue  
       2020-03-26 12:37:37 +08:00
    1.因为 CPU 有缓存, 工作内存能有效利用缓存比主存执行速度要快;
    2.当分配内存的区域(Eden 和老年代都有可能)满了的时候会去 GC, 正常情况下不满就不会 GC ;
    3.避免方法区溢出,元空间存放在本地内存而非 JVM 内存内,严格意义上本地内存耗尽前不会溢出;
    4.只是调用不考虑初始化的话就是根据协议选取 Invoker 默认是 DubboInvoker, 拼接参数组别版本号之类, 判断是否配置了异步, 没有的话就是把异步转同步(实现上 dubbo 底层只有异步), 然后就是利用 netty 进行消息的发送和接收,实现类 HeaderExchangeChannel,中间还有个序列化操作, 默认用 hession(一种基于 tcp 的二进制协议)
    li24361
        26
    li24361  
       2020-03-26 14:34:51 +08:00
    2 如果分配对象比较大,会直接进入老年代,满了就 fullGc
    zhuyichen1017
        27
    zhuyichen1017  
       2020-03-26 15:44:11 +08:00
    1. storeBuffer, invalidateQueue
    yjxjn
        28
    yjxjn  
       2020-03-26 16:20:37 +08:00
    @ysjiang4869 其实我想说的是,大部分进入做开发的话,貌似真没有能考虑这么多的,比如垃圾回收机制,再比如 GIT 的原理,以及 Java 虚拟机之类的问题,想想工作中大部分的都在写逻辑代码,这些可能真的不会考虑的(可能我这个工作比较 low,真的高并发,分布式啥的用不上呀。。。)
    yjxjn
        29
    yjxjn  
       2020-03-26 16:33:29 +08:00
    @luckyrayyy 大佬你好,我想问一下,既然楼主前面给的问题大多是 Java 相关的,但是第五道题其实不都涉及到运维层面了么,这到底是是招聘开发还是运维 😝
    MrCastle
        30
    MrCastle  
       2020-03-26 16:37:01 +08:00
    第五题,把所有服务器都放在一个机房的运维,是要被吊死在桅杆上的……
    sadfQED2
        31
    sadfQED2  
       2020-03-26 16:56:38 +08:00
    第五题,面试官想问的应该是自动熔断以及自动降级相关的问题吧,或者是服务切换。实际生产中,有人问我这种问题,我只会说,你他妈机房肯定有备用电源已及发电机啊,机房都能断电,玩蛇啊
    zxc1234
        32
    zxc1234  
    OP
       2020-03-26 17:40:15 +08:00
    @MrCastle 确实 我当时回答所有服务放在同一个机房的时候,我感觉我要挂了
    Lonely
        33
    Lonely  
       2020-03-26 18:16:34 +08:00 via iPhone
    @zxCoder 想太多,换个语言照样可以问这么多
    zsdroid
        34
    zsdroid  
       2020-03-26 20:50:06 +08:00
    如果碰到第五题,就反问他,如果地球炸了,那么应该如何处理,有什么措施吗
    zxc1234
        35
    zxc1234  
    OP
       2020-03-26 20:51:32 +08:00
    老哥们 帮忙看下第 7 个问 谢谢
    leafre
        36
    leafre  
       2020-03-26 20:54:46 +08:00
    5.如果服务器部署在一个机房,没有跨机房,那么机房挂了 比如断电了,网络不通

    那么应该如何处理,有什么措施吗

    先通电
    noteseeker
        37
    noteseeker  
       2020-03-26 21:31:49 +08:00
    @zxc1234 第 7,and 中的顺序对如何选择索引无关,查询优化器会自动优化顺序,选择最有效率的顺序执行,所以会用到索引。
    TimeRain
        38
    TimeRain  
       2020-03-26 21:47:52 +08:00 via Android
    看深入 Java 虚拟机那本书吧,垃圾收集器,锁,类加载器等知识那本书都有
    cxshun
        39
    cxshun  
       2020-03-27 15:43:43 +08:00
    @zxc1234 #24 对的,这是正常的多机房方案。当然,你要是想要再复杂点,可以参考支付宝的“两地三中心”的部署方案。那个就太复杂了,正常情况下都没必要。
    回答一个另外两个:
    6 和 7 是同类问题,因为这里完全是等值的,引擎会把语句优化成可以使用缓存的情况,因此是可以用到缓存的。
    你可以简单的这样认为,当没有完全覆盖索引的情况下,需要使用最左前缀原则来分析,如上面的比如只有 c = 'xxx' and b = 'xxx'这里就要用最左前缀原则;而如果覆盖到了就没那么简单了,比如上面的 b,c,d 都覆盖到了,这里还要考虑引擎优化的情况,就是顺序的处理上面。
    zxc1234
        40
    zxc1234  
    OP
       2020-03-27 23:54:59 +08:00
    求大佬们帮忙解答 第 8 个问题
    zxc1234
        41
    zxc1234  
    OP
       2020-03-30 21:18:15 +08:00
    @cxshun
    @hangszhang

    刚刚面试被问

    dubbo 是怎么调用的? zookeeper 是怎么获取到 producer 地址列表的???
    RRRSSS
        42
    RRRSSS  
       2020-03-31 11:20:10 +08:00
    其实 Java 是这样的,因为这些东西出来太久了,默认就是你应该要会,要不没什么好问的,因为就只是写业务搬砖的话,每个人区别不大,只能这么涮人。面试考算法同理。
    cxshun
        43
    cxshun  
       2020-03-31 17:05:32 +08:00
    我来答一下 8
    B+树不会在正常结点中存放数据,会在叶子结点中存放数据,并且是通过链表组织的,可以通过链表获取所有数据。
    @zxc1234 #41
    dubbo 怎么调用?是指 consumer 怎么调用 producer 吗?那就是 RPC 罗,因为 dubbo 用了自己的协议,详细可以找一下网上的文章。
    zookeeper 获取到 producer 地址? zookeeper 不需要获取 producer 的地址啊,producer 的地址是注册到 zookeeper,由 consumer 去获取。
    而 dubbo 获取 producer 的地址就直接通过 zookeeper 提供的 client 去获取的,没啥特殊的东西。
    zxc1234
        44
    zxc1234  
    OP
       2020-04-01 12:29:50 +08:00
    @cxshun B+树叶子节点中通过链表组织 是单链表 还是双向链表呢
    zxc1234
        45
    zxc1234  
    OP
       2020-04-01 12:31:14 +08:00
    @cxshun dubbo 用 RPC 协议 那 netty 是做什么用的 ,一直没用过 netty,都不知道是做啥的
    zxc1234
        46
    zxc1234  
    OP
       2020-04-01 12:47:03 +08:00
    @cxshun producer 的地址是注册到 zookeeper,zookeeper 没有自动发现功能吗
    cxshun
        47
    cxshun  
       2020-04-02 12:39:04 +08:00
    @zxc1234 #44 这问题有点多哈,搞得好像我在面试一样。
    1 、B+树叶子节点是通过双向链表来实现的,因为在解析过程中很可能要往前遍历。
    2 、netty 是一个 java nio 框架,负责网络协议解析啊。dubbo 的 RPC 协议就是通过 netty 来解析和传输的。
    3 、自动发现不是说真的全网去搜,只是一个形容而已吧。也是要提供方主动注册上去的。
    zxc1234
        48
    zxc1234  
    OP
       2020-04-02 18:49:22 +08:00
    @cxshun 非常感谢大大大大大大佬的回答!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3469 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:06 · PVG 08:06 · LAX 16:06 · JFK 19:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.