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

请教 Java 面试题

  •  
  •   zxc1234 · 248 天前 · 3636 次点击
    这是一个创建于 248 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    第 1 条附言  ·  247 天前
    5.如果服务器部署在一个机房,没有跨机房,那么机房挂了 比如断电了,网络不通

    那么应该如何处理,有什么措施吗
    第 2 条附言  ·  247 天前
    6. 表 test 有 a,b,c,d

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

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

    会用到 索引吗 为什么
    第 3 条附言  ·  247 天前
    7. 表 test 有 a,b,c,d

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

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

    会用到 索引吗 为什么
    第 4 条附言  ·  246 天前
    8.关于 B+tree 的疑问

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

    我看网上资料说 ===:

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

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

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

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

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

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

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

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

    刚刚面试被问

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