请教 Java 面试题

2020-03-25 18:32:43 +08:00
 zxc1234

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

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

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

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

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

4838 次点击
所在节点    程序员
48 条回复
zxc1234
2020-03-26 11:42:08 +08:00
@luckyrayyy 那如果是集群方式部署,跨机房呢
luckyrayyy
2020-03-26 11:50:33 +08:00
@zxc1234 我的话可能会从数据一致性、可用性方面回答。可以说说像多集群多节点的话怎么做数据同步,怎么保证数据一致,了解分布式一致性协议类似 raft 、zab 算法可以说一说。流量猛地转移到另一个机房会不会承载不了啊,是不是得扩容、熔断降级什么的...能说的也蛮多的。
cxshun
2020-03-26 12:06:03 +08:00
@zxc1234 #17 单机房,机房挂了就没了。
如果是上了云,有前置的 Load Balance,可以赶紧挂上一个新的另外一个机房的服务。如果没有用 LB,是直连机房,那神仙都没办法了,只能等恢复了。
zxc1234
2020-03-26 12:09:31 +08:00
@cxshun 所以一般是多机房部署,一个机房挂了,切到另一个机房 是这样子吗
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
2020-03-26 14:34:51 +08:00
2 如果分配对象比较大,会直接进入老年代,满了就 fullGc
zhuyichen1017
2020-03-26 15:44:11 +08:00
1. storeBuffer, invalidateQueue
yjxjn
2020-03-26 16:20:37 +08:00
@ysjiang4869 其实我想说的是,大部分进入做开发的话,貌似真没有能考虑这么多的,比如垃圾回收机制,再比如 GIT 的原理,以及 Java 虚拟机之类的问题,想想工作中大部分的都在写逻辑代码,这些可能真的不会考虑的(可能我这个工作比较 low,真的高并发,分布式啥的用不上呀。。。)
yjxjn
2020-03-26 16:33:29 +08:00
@luckyrayyy 大佬你好,我想问一下,既然楼主前面给的问题大多是 Java 相关的,但是第五道题其实不都涉及到运维层面了么,这到底是是招聘开发还是运维 😝
MrCastle
2020-03-26 16:37:01 +08:00
第五题,把所有服务器都放在一个机房的运维,是要被吊死在桅杆上的……
sadfQED2
2020-03-26 16:56:38 +08:00
第五题,面试官想问的应该是自动熔断以及自动降级相关的问题吧,或者是服务切换。实际生产中,有人问我这种问题,我只会说,你他妈机房肯定有备用电源已及发电机啊,机房都能断电,玩蛇啊
zxc1234
2020-03-26 17:40:15 +08:00
@MrCastle 确实 我当时回答所有服务放在同一个机房的时候,我感觉我要挂了
Lonely
2020-03-26 18:16:34 +08:00
@zxCoder 想太多,换个语言照样可以问这么多
zsdroid
2020-03-26 20:50:06 +08:00
如果碰到第五题,就反问他,如果地球炸了,那么应该如何处理,有什么措施吗
zxc1234
2020-03-26 20:51:32 +08:00
老哥们 帮忙看下第 7 个问 谢谢
leafre
2020-03-26 20:54:46 +08:00
5.如果服务器部署在一个机房,没有跨机房,那么机房挂了 比如断电了,网络不通

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/656150

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX