Java中级面试题-1

1.Redis的有哪些模式?Redis的击穿、雪崩和穿透,redis主从原理

Redis基础++

2.Servlet是什么东西?

server applet 运行在服务端的小程序

狭义指一个servlet接口,广义指实现servlet接口的Java程序,sun公司提供一门开发动态web资源的技术

生命周期
Servlet的生命周期
1.加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet
2.创建:通过调用Servlet的构造函数来创建一个Servlet实例
3.初始化:通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已经被创建,但在向客户端提供服务之前调用。
4.处理客户请求:Servlet创建后就可以处理请求,当有新的客户端请求时,Web容器都会创建一个新的线程来处理该请求。接着调用Servlet的
Service()方法来响应客户端请求(Service方***根据请求的method属性来调用doGet()和doPost())
5.卸载:容器在卸载Servlet之前需要调用destroy()方法,让Servlet释放其占用的资源。
1.创建 init方法只执行一次 说明一个Servlet在内存中只存在一个对象,Servlet是单例的
2.提供服务:创建一个请求Request对象,处理客户端请求 创建一个Response响应对象,响应客户端请求
执行service方法,传递请求和响应对象作为参数,执行多次 
       * 每次访问Servlet时,Service方法都会被调用一次。
3.销毁:destroy 只执行一次。 只有服务器正常关闭时,才会执行destroy方法。
Servlet的体系结构

Servlet – 接口
|
GenericServlet – 抽象类
|
HttpServlet – 抽象类

HttpServlet:对http协议的一种封装,简化操作

	1. 定义类继承HttpServlet
	2. 复写doGet/doPost方法

3.MQ怎么知道消息被指定的消费者消费?怎么使不同的生产者生产的消息被不同的消费者消费?mq中一条消息出现了异常,怎么处理

1.MQ怎么知道消息被指定的消费者消费?

消息一旦被消费者接收,队列中的消息就会被删除。

RabbitMQ有一个ACK机制。当消费者获取消息后,会向RabbitMQ发送回执ACK,告知消息已经被接收。不过这种回执ACK分两种情况:

  • 自动ACK:消息一旦被接收,消费者自动发送ACK
  • 手动ACK:消息接收后,不会发送ACK,需要手动调用
2.怎么使不同的生产者生产的消息被不同的消费者消费

订阅模型-定向Direct:routing key(路由key)

Exchange(交换机),接收生产者的消息,然后把消息递交给 与routing key完全匹配的队列

连接对象Connection获得通道对象

queueBind()指定队列名,交换机名,routing key

    // 绑定队列到交换机,同时指定需要订阅的routing key。订阅 insert、update、delete
    channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "insert");
    channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "update");
    channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "delete");

订阅模型-通配符Topic

与定向模式相似,Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符

#:匹配一个或多个词

*:匹配不多不少恰好1个词

    // 绑定队列到交换机,同时指定需要订阅的routing key。订阅 insert、update、delete
    channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "item.*");
3.mq中一条消息出现了异常,怎么处理

事务消息,好难

4.GC算法都有哪些?他们之间的区别是什么?各自的适用场景?

各自原理适用场景
引用计数法引用成功一次对象计数器+1,失败-1,为0时回收
标记-清楚法根节点开始标记引用对象,未被标记的对象是垃圾对象,回收老年代
标记-压缩法先从根节点标记的引用对象,后将标记对象和未被标记对象压缩到内存一段,清楚垃圾老年代
复制算法内存一分为二,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。年轻代

四种垃圾收集器

串行垃圾收集器

单线程垃圾回收

并行垃圾收集器

多线程垃圾回收

CMS垃圾收集器

并发,标记-清除算法,针对老年代垃圾回收,通过参数-XX:+UseConcMarkSweepGC进行设置

G1垃圾收集器
  1. 第一步,开启G1垃圾收集器 -XX:+UseG1GC
  2. 第二步,设置堆的最大内存 -Xmx1024m
  3. 第三步,设置最大的停顿时间

三种模式 Young GC、Mixed GC、Full GC

最大的区别在于它取消了年轻代、老年代的物理 划分,取而代之的是将堆划分为若干个区域(Region)

在G1中,有一种特殊的区域,叫Humongous区域。存储巨型对象

5.mysql对哪些建立索引?调优

所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如b+/b-二叉树的算法和哈希算法

哈希算法是通过建立特征值,然后根据特征值来快速查找。
mysql默认的就是二叉树算法,建立索引的字段,比如扫描20行就能得到未使用前扫描了2^20行的结果。

创建索引 create index indexName on table_name(column_name)

修改表结构添加索引 alter table table_name add index indexName(column_name)

删除索引 drop index indexName on table_name

1、表的主键、外键必须有索引; 
2、数据量超过300的表应该有索引; 
3、经常与其他表进行连接的表,在连接字段上应该建立索引; 
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 
5、索引应该建在选择性高的字段上; 
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
8、频繁进行数据操作的表,不要建立太多的索引; 
9、删除无用的索引,避免对执行计划造成负面影响;

优化

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

Explain select * from blog where false;

6.知道哪些锁?公平锁和非公平锁区别?可重入锁是什么?我说是sychronized里还有个synchronized

7.为什么JVM要分为堆、方法区等?原理是什么?

1.方便JVM去调用和进行内存管理

堆,栈,方法区等都有自己特有的内存管理方式,都有自己合适存储的内容

不同的存储结构效率是不一样的,使用价值也不一样。编译原理

2.方便共享通信

堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)

这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。

堆Heap:储存new出来的东西,每个new出来的东西都有地址值bai,java中不允许直接访问堆内存的du对象,只能通过引用访问。还有字符串常量池,非对象的String普通字符串存储在常量池中

在JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现,他们最大区别是:元空间并不在JVM中,而是使用本地内存。

http://i2.51cto.com/images/blog/201808/21/b116170771ecb3117ae7fead03fcaa0d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

栈Stack:方法运行环境,存放方法的局部变量

栈是运行时的单位,而堆是存储的单位

栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

8.jvm调优调的哪些参数?我说初始堆大小和最大堆大小一样,问这样有什么好处?在哪里写这些参数

jvm的运行参数
  • 标准参数 -help -version
  • -X参数 -Xint -Xcomp
  • -XX参数 -XX:newSize -XX:+UseSerialGC 经常使用

-Xms和-Xmx参数

-Xms与-Xmx分别是设置jvm的堆内存的初始大小和最大大小。
-Xms512m:等价于-XX:InitialHeapSize 设置jvm初始堆内存512M
-Xmx2048m:等价于-XX:MaxHeapSize,设置jvm最大堆内存2048
[root@node01 test]# java ‐Xms512m ‐Xmx2048m TestJVM

9.引入第三方登录时,怎么使得你自己的token和第三方的token关联起来?

Cookie

cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。

Session

服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了.

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。

Token

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

OAuth2.0授权码模式
第三方登录实现原理
  • 1.获得授权码
  • 2.通过授权码那令牌
  • 3.通过令牌拿资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子津

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值