加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 交互 > 正文

最新Java面试题及答案整理

发布时间:2020-12-24 15:13:43 所属栏目:交互 来源:网络整理
导读:副标题#e# 基础篇 一、基本功 面向对象特征 封装,继承,多态和抽象 1. 封装 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改 变它内部的数据。在 Java 当中,有 3 种修饰符: public, private 和 protected。每一种修

要知道Redis的数据结构并不全是简单的Key-Value,还有列表,hash,map等等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对象,等等。这些操作还可以合成MULTI/EXEC的组。这样一个操作中可能就需要加非常多的锁,导致的结果是同步开销大大增加。这还带来一个恶果就是吞吐量虽然增大,但是响应延迟可能会增加。

Redis在权衡之后的选择是用单线程,突出自己功能的灵活性。在单线程基础上任何原子操作都可以几乎无代价地实现,多么复杂的数据结构都可以轻松运用,甚至可以使用Lua脚本这样的功能。对于多线程来说这需要高得多的代价。

并不是所有的KV数据库或者内存数据库都应该用单线程,比如ZooKeeper就是多线程的,最终还是看作者自己的意愿和取舍。单线程的威力实际上非常强大,每核心效率也非常高,在今天的虚拟化环境当中可以充分利用云化环境来提高资源利用率。多线程自然是可以比单线程有更高的性能上限,但是在今天的计算环境中,即使是单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化的方案,这些方案中多线程的技术照样是用不上的,所以单线程、多进程的集群不失为一个时髦的解决方案。

作者:灵剑

链接:https://www.zhihu.com/question/23162208/answer/142424042

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

缓存奔溃

参考:

Redis持久化

缓存降级

服务降级的目的,是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不重要的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是,Redis出现问题,不去数据库查询,而是直接返回默认值给用户。

使用缓存的合理性问题

参考:

Redis实战(一) 使用缓存合理性

三、消息队列

消息队列的使用场景

主要解决应用耦合,异步消息,流量削锋等问题

消息队列使用的四种场景介绍

消息的重发补偿解决思路

参考:

JMS消息传送机制

消息的幂等性解决思路

参考:

MQ之如何做到消息幂等

消息的堆积解决思路

参考:

Sun Java System Message Queue 3.7 UR1 管理指南

自己如何实现消息队列

参考:

自己动手实现消息队列之JMS

如何保证消息的有序性

参考:

消息队列的exclusive consumer功能是如何保证消息有序和防止脑裂的

API 使用简单,开发门槛低;

功能强大,预置了多种编解码功能,支持多种主流协议;

定制能力强,可以通过 ChannelHandler 对通信框架进行灵活的扩展;

性能高,通过与其它业界主流的 NIO 框架对比,Netty 的综合性能最优;

社区活跃,版本迭代周期短,发现的 BUG 可以被及时修复,同时,更多的新功能会被加入;

经历了大规模的商业应用考验,质量得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它完全满足不同行业的商用标准。

正是因为这些优点,Netty 逐渐成为 Java NIO 编程的首选框架。说说业务中,Netty 的使用场景[/h1]

有关“为何选择Netty”的11个疑问及解答

原生的 NIO 在 JDK 1.7 版本存在 epoll bug

它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK1.6版本的update18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该BUG发生概率降低了一些而已,它并没有被根本解决。该BUG以及与该BUG相关的问题单可以参见以下链接内容。

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6403933

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=2147719

异常堆栈如下:

java.lang.Thread.State: RUNNABLE

at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)

at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)

at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)

at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)

- locked<0x0000000750928190>(a sun.nio.ch.Util$2)

- locked<0x00000007509281a8>(a java.util.Collections$ UnmodifiableSet)

- locked<0x0000000750946098>(a sun.nio.ch.EPollSelectorImpl)

at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)

at net.spy.memcached.MemcachedConnection.handleIO(Memcached Connection.java:217)

at net.spy.memcached.MemcachedConnection.run(MemcachedConnection. java:836)

什么是TCP 粘包/拆包

参考:

TCP粘包,拆包及解决方法

TCP粘包/拆包的解决办法

参考:

TCP粘包,拆包及解决方法

Netty 线程模型

参考:

Netty4实战第十五章:选择正确的线程模型

说说 Netty 的零拷贝

参考:

理解Netty中的零拷贝(Zero-Copy)机制

Netty 内部执行流程

参考:

Netty:数据处理流程

Netty 重连实现

参考:

Netty Client 重连实现

[h1]<span list-paddingleft-2">

小:微服务体积小

独:能够独立的部署和运行。

轻:使用轻量级的通信机制和架构。

松:为服务之间是松耦合的。微服务与 SOA 的区别[/h1]

可以把微服务当做去除了ESB的SOA。ESB是SOA架构中的中心总线,设计图形应该是星形的,而微服务是去中心化的分布式软件架构。

参考:

SOA 与 微服务的区别

如何拆分服务

参考:

微服务架构(二): 如何把应用分解成多个服务

微服务如何进行数据库管理

参考:

在微服务中如何管理数据

如何应对微服务的链式调用异常

参考:

踢开绊脚石:微服务难点之服务调用的解决方案

对于快速追踪与定位问题

参考:

微服务架构下,如何实现分布式跟踪?

微服务的安全

参考:

论微服务安全

二、分布式

谈谈业务中使用分布式的场景

一、解决java集群的session共享的解决方案:

1.客户端cookie加密。(一般用于内网中企业级的系统中,要求用户浏览器端的cookie不能禁用,禁用的话,该方案会失效)。

2.集群中,各个应用服务器提供了session复制的功能,tomcat和jboss都实现了这样的功能。特点:性能随着服务器增加急剧下降,容易引起广播风暴;session数据需要序列化,影响性能。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读