阿里Java后端面经【记录牛客】(下)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 阿里Java后端面经【记录牛客】(下)

8、什么是http无状态连接


无连接

无连接并不是指不连接,客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到WWW服务器面向的是Internet中成干上万个用户,且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率。

无状态

服务器不保留与客户交易时的任何状态。这就大大减轻了服务器记忆负担,从而保持较快的响应速度。HTTP是一种面向对象的协议。允许传送任意类型的数据对象。它通过数据类型和长度来标识所传送的数据内容和大小,并允许对数据进行压缩传送。当用户在一个HTML文档中定义了一个超文本链后,浏览器将通过TCP/IP协议与指定的服务器建立连接


9、sessionID是在哪里生成的?保存在哪里?


sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。tomcat生成的sessionid叫做 jsessionid。


session在访问tomcat服务器HttpServletRequest的getSession(true)的时候创建,tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;


session存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也可以持久化到file,数据库,memcache,redis等。


客户端只保存sessionid到cookie中,而不会保存session,session销毁只能通过invalidate或超时,关掉浏览器并不会关闭session。


10 、说一下动态规划和贪心算法区别

11、动规和贪心有什么相似的地方

12、springboot的start包原理

13、有自己写过一些相关的切面吗?


14、项目的分层思想(我说MVC,面试官:行行行,不用说了,因为分层不是那么简单的吗,你没经历过那就不问了)

15、有没有一些线上相关的排查JVM相关配置参数的经验,GC相关的,full GC相关的


1.利用top命令确定是哪一个线程占用内存过高导致的

2.若是自己的Java程序线程则利用thread命令:查看某一个线程的详情,确定是业务线程还是GC垃圾回收的线程

3.jmap -histo 进程号 :打印jvm中所有的对象,查看哪一个对象占用比较大;并且查看日志是否有outofMemary产生

4.利用jinfo工具就可以修改参数产生快照即dump文件并下载到windows环境中

5.visualvm工具打开进行分析并结合jmap 命令打印的对象定位到出问题的代码块

6.结合分析结果和代码,定位问题出现的原因


16、说一下GC

17、哪些算垃圾

18、引用计数什么情况下有问题,举个例子


引用计数法记录着每一个对象被其它对象所持有的引用数。如果一个对象的引用计数为零,那么该对象就变成了所谓的不可达对象,亦即可以被回收的

1.只靠强引用计数方式,会存在循环引用的问题,导致对象永远无法被释放,弱引用就是专门用来解决循环引用问题的

2.若 A 强引用了 B,那 B 引用 A 时就需使用弱引用,当判断是否为无用对象时仅考虑强引用计数是否为 0,不关心弱引用计数的数量

3.这样就解决了循环引用导致对象无法释放的问题,但这会引发野指针问题:当 B 要通过弱指针访问 A 时,A 可能已经被销毁了,那指向 A 的这个弱指针就变成野指针了。在这种情况下,就表示 A 确实已经不存在了,需要进行重新创建等其他操作


19、JVM怎么分代?为什么要分代?


给堆内存分代是为了提高对象内存分配和垃圾回收的效率。如果堆内存没有区域划分,所有的新创建的对象和生命周期很长的对象放在一起,随着程序的执行,堆内存需要频繁进行垃圾收集,而每次回收都要遍历所有的对象,遍历这些对象所花费的时间代价是巨大的,会严重影响我们的GC效率

Java虚拟机将堆内存划分为新生代、老年代和永久代

新生代:新生成的对象优先存放在新生代,回收效率很高

老年代:新生代年龄达到15以后,进入老年代,开始进行fullgc

永久代【元空间】:存储类信息,常量,静态变量,一般不会进行垃圾回收


20、年轻代GC用什么算法,老年代用什么算法


Minor GC 又称为新生代GC 指的是发生在新生代的垃圾回收操作(包括Eden区和Survivor区)。当JVM无法为一个新的对象分配空间时候,会触发Minor GC。因为新生代中大多数对象的生命周期都很短,因此Minor GC(采用复制算法)非常频繁,虽然它会触发stop-the-world,但是回收速度也比较快。


Major GC清理老年代,出现Major GC通常会出现至少一次Minor GC即大多数Major GC是由Minor GC触发的


Full GC是针对整个堆空间包括新生代、老年代、元空间GC,Full GC不等于Major GC,也不等于Minor GC+Major GC。


复制算法(新生代算法)

【解决了标记清除算法的内存碎片问题】当这块内存需要垃圾回收时,会将此区域还活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情况,只需要按序分配即可。此方法实现简单,运行高效。

12b19427edee43ed9afa39b46cb457d1.png

标记-整理算法(老年代回收算法)

复制算法 在对象存活率较高时 会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用复制算法。针对老年代的特点,提出了一种称之为"标记-整理"算法。标记过程仍与"标记-清除"中标记的过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界(除存活对象)以外的内存。

fe9c7b011eec4ef8a178ac5434dcccd9.png

21、你知道什么是幂等吗?


HTTP 幂等方法,是指无论调用多少次都不会有不同结果的 HTTP 方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。

HTTP GET 方法,用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。

HTTP POST 方法是一个非幂等方法,因为调用多次,都将产生新的资源。

HTTP PUT 方法因为它直接把实体部分的数据替换到服务器的资源,我们多次调用它,只会产生一次影响,但是有相同结果的 HTTP 方法,所以满足幂等性。

HTTP DELETE 方法用于删除资源,会将资源删除。调用一次和多次对资源产生影响是相同的,所以也满足幂等性。


2.java类加载过程


(1)加载

首先通过一个类的全限定名来获取此类的二进制字节流;其次将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。总的来说就是查找并加载类的二进制数据。

(2)链接

验证:确保被加载类的正确性;

准备:为类的静态变量分配内存,并将其初始化为默认值;

解析:把类中的符号引用转换为直接引用;

(3)为类的静态变量赋予正确的初始值

3、类的初始化

(1)类什么时候才被初始化

1)创建类的实例,也就是new一个对象

2)访问某个类或接口的静态变量,或者对该静态变量赋值

3)调用类的静态方法

4)反射(Class.forName(“com.lyj.load”))

5)初始化一个类的子类(会首先初始化子类的父类)

6)JVM启动时标明的启动类,即文件名和类名相同的那个类

(2)类的初始化顺序

1)如果这个类还没有被加载和链接,那先进行加载和链接

2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)

3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。

4)总的来说,初始化顺序依次是:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器;

果有父类,则顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法

4、类的加载

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象


c3f7a6b5255f42178dcf45ec6e01e8d4.png


3.Java内存模型

4./

5.共享屏幕写个多线程

6.索引的数据结构(答:B+树,hash)

7.共享屏幕简单写个B+树

8.B+树改成hash共享屏幕写

9.redis数据结构

10.redis过期删除&内存淘汰


在缓存的内存淘汰策略中有FIFO、LRU、LFU三种,其中LRU和LFU是Redis在使用的。

LRU(Least Recently Used)表示最近最少使用,该算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”

LFU(Least Frequently Used)表示最不经常使用,它是根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。


惰性删除:当key被访问时检查该key的过期时间,若已过期则删除;已过期未被访问的数据仍保持在内存中,消耗内存资源;

定期删除:每隔一段时间,随机检查设置了过期的key并删除已过期的key;维护定时器消耗CPU资源;


在RDB持久化模式中我们可以使用save和bgsave命令进行数据持久化dump操作

在AOF持久化模式中使用rewriteaof和bgrewriteaof命令进行持久化操作


11.LRU


简单


12.缓存雪崩&缓存穿透是什么,如何解决

13.布隆过滤器怎么实现的

1.说一下项目(架构+部署+并发量)

2.说一下实习,实习期间学到了什么

3.类加载器,双亲委派机制

4.JVM的内存模型

5.线程的创建方式,线程池的原理及使用场景

6.保证线程安全的手段(锁机制)

7.Spring的核心(IOC+AOP)

8.面向对象编程的五大原则


1.开闭原则(the Open Closed Principle OCP)

2.替换原则 (the Liskov Substitution Principle LSP)

3.依赖原则 (the Dependency Inversion Principle DIP)

4.接口分离原则(the Interface Segregation Principle ISP)


9.平常用到的设计模式


10.算法题:验证二叉搜索树


简单

二面(8.9)


1.场景题:请求远程服务器,走的缓存的场景

2.Redis缓存淘汰策略,LRU和LFU的特点、区别

3.场景题:两个求和函数,分析他们的执行速度,提示缓存相关

4.算法题:数组中重复出现数下标之差小于k


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
20天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
55 3
|
21天前
|
小程序 前端开发 算法
|
1月前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
138 1
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
1月前
|
NoSQL 安全 Java
Java后端基础自测
Java后端基础自测
60 12
|
1月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
【10月更文挑战第8天】本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
37 5
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
21 1
|
1月前
|
算法 Java Linux
java制作海报五:java 后端整合 echarts 画出 折线图,项目放在linux上,echarts图上不显示中文,显示方框口口口
这篇文章介绍了如何在Java后端整合ECharts库来绘制折线图,并讨论了在Linux环境下ECharts图表中文显示问题。
39 1
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
107 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
509 1
|
1月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
31 0
下一篇
无影云桌面