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。
复制算法(新生代算法)
【解决了标记清除算法的内存碎片问题】当这块内存需要垃圾回收时,会将此区域还活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情况,只需要按序分配即可。此方法实现简单,运行高效。
标记-整理算法(老年代回收算法)
复制算法 在对象存活率较高时 会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用复制算法。针对老年代的特点,提出了一种称之为"标记-整理"算法。标记过程仍与"标记-清除"中标记的过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界(除存活对象)以外的内存。
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对象,用来封装类在方法区类的对象
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)