| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Java面试题二 -> 正文阅读 |
|
[大数据]Java面试题二 |
1、Redis如果缓存空间满了怎么处理? ? ? ? ? 答:Redis中有对应的淘汰机制,用于处理缓存空间不够的情况,我们只需要进行合理的配置就可以了。 一般我们在将数据缓存到redis中的时候就可以设置缓存的过期时间,以免缓存中的数据一直增长。但是我们还是要考虑特殊情况,就是当缓存已经满了的时候,但是我们设置的过期时间还未到,这时如不对缓存空间进行处理,就会发生内存溢出的情况。redis中专门有用于这种情况的淘汰机制。 ? ? ? ? 1、lru 淘汰被最早访问的数据--以链表的形式,最早访问的数据放在链表头,最新访问的数据放在链表尾部,当内存不够的时候,优先删除链表头部的数据。 ? ? ? ? 2、lfu 淘汰访问评率最低的数据--如何确保访问量不受新老数据的影响?--redis为每一个新数据设置了一个时间戳和计数器,只有当计数器到达一定的值,或者过了一定时间,这个新数据才会和其他老数据进行比较。并且计数器的是是随着时间推移,如果没有访问的话计数器会逐渐衰减。 ? ? ? ? 3、随机淘汰--随机抽取一部分数据删除,一般不用 2、servlet的生命周期? ? ? ? ? 答:初始化:加载servlet类,并调用init() ? ? ? ? ? ? ? ?使用阶段:调用service()方法, ? ? ? ? ????????结束阶段:调用destory()方法,此时servlet将等待jvm的垃圾回收 3、类在jvm中的生命周期? ? ? ? ? 答:加载:jvm加载字节码文件 ? ? ? ? ????????连接:分为三个步骤 ? ? ? ? ? ? ? ? ????????验证:检验字节码文件加载的类是否符合jvm对类的规范。 ? ? ? ? ? ? ? ? ????????准备:为静态变量,静态方法在方法区中划分静态区,并给静态变量赋初始值,整型为0,字符型为null,布尔型为false ? ? ? ? ? ? ? ? ????????解析:将符号引用转化为直接引用,就是将地址值赋值为对应的引用对象 ? ? ? ? 初始化:将类中的变量进行初始化赋值,此时的赋值是将类中定义的量赋值给变量 ? ? ? ????????? 使用:定义对象,进行使用 ? ? ? ? ????????卸载:在该类没有任何引用后jvm对其进行垃圾回收 4、如何对搜索进行优化? ? ? ? ? 答:默认此时的搜索是通过遍历来得到数据结果的 ????????????????1、可以参考elasticSearch中对数据进行的操作,建立一个类,采用倒排索引的方法将所有数据存放到其中,在进行搜的时候通过这个类来查询。 ? ? ? ? ? ? ? ? 2、也可以吧数据做成二叉树的形式,查询的时候,重二叉树中找数据也会快一点 5、hashmap和hashtable的区别? ? ? ? ? 答:1、hashMap是线程不安全的,hashtable是线程安全的 ? ? ? ? ? ? ? ? 2、hashmap中key,value可以为null,hashtable中不行 ? ? ? ? ? ? ? ? 3、hashmap和hashtable继承的父类是不同的,且hashtable继承的父类以及是淘汰的 6、线程的生命周期? ? ? ? ? 答:新生--就绪--运行--(阻塞)--死亡 7、线程的状态有那些,以及是如何达到这个状态的? ? ? ? ? 答:就绪:调用start()方法时,线程就进入线程池等待cpu的调用 ? ? ? ? ? ? ? ?运行:cpu给对应线程分配时间片 ? ? ? ? ? ? ? ? 阻塞:阻塞也可以说是等待状态 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 有限期等待状态:sleep(timeout)? wait(timeout) join(timeout) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?无限期等待:wait()? join() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? wait()如果不定义时间,会一直处于等待状态,直到有另一个线程通过notify()/notifyAll()方法将其唤醒。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? join()如果不设置过期时间,就会一直执行wait(0)的方法,直到该线程死亡。 ? ? ? ? ? ? ? ? 死亡:线程结束会自动死亡 8、wait()和sleep()方法的区别: ? ? ? ? 答:wait()是Object的方法。sleep()是Thread类的方法 ????????调用wait()方法时,线程会释放cpu资源,直到被notify方法唤醒,sleep()方法在调用的时候不会释放资源,要等到睡眠时间结束继续执行 9、线程池的特点? ? ? ? ? 答:我们一般用ThreadPoolExcuter来创建线程池 ? ? ? ? ? ? ? ?在线程使用不多的情况下,默认使用的是核心线程,任务量提高了,核心线程不够用了,就会逐渐拓展到最大线程数,如果任务量还在提高,线程已经满载运行了,等待队列也满了。此时就会触发拒绝策略,就是不继续接收任务。当任务量减小的时候,除核心线程外,其余的线程会在等待一段时间,后死亡。 10、如何处理数据库返回的结果集? ? ? ? ? 答:这里解释的是springboot,mybatisplus的情况 ? ? ? ? ? ? ? ?首先要创建一个和访问结果中的类型相同的类和一个对应的dao类,然后使访问数据库的类继承mybatisplus中的ServiceImpl类,并将ServiceImpl的泛型设置为<dao类,类名>。ServiceImpl中有通过id或者通过过滤器得到结果集的方法,得到的结果集就是之前建立的类的集合。 11、spring的核心模块有那些? ? ? ? ? 答:iop容器模块 ? ? ? ? ? ? ? ? aop模块 ? ? ? ? ? ? ? ? 数据库模块 ? ? ? ? ? ? ? ? web引用模块 ? ? ? ? ? ? ? ? 测试模块 12、Redis缓存穿透,缓存击穿,缓存雪崩分别是什么意思以及解决思路 ? ? ? ? 答:缓存穿透:访问数据库中不存在的数据,正常情况下如果查询数据库没有的数据,返回null是不会吧结果放到缓存中,这就导致每次查询都会去访问一次数据库。 ? ? ? ? 解决办法:1、使用布隆过滤器? 2、缓存返回的null数据 ? ? ? ? ? ? ? ? 缓存击穿:访问数据库中存在的一条数据,并且这个访问的并发量很大,缓存击穿就出现在redis中这个数据的key过期的时候,大量的并发同时访问数据库,造成服务器的崩溃。 ? ? ? ? 解决办法:采用互斥锁,即当value值为空的时候不是我们去访问数据库,而是通过redis自带的setnex? (set if not exit)来加载对应的key,value。当返回结果为true时,表示数据库中对应的数据已经缓存到redis上了,大并发的数据此时就访问的就是redis中的数据了 ? ? ? ? ? ? ? ? 缓存雪崩:不同数据访问,并发量很大,如果redis中key在同一时刻过期,也会造成大量数据直接访问数据库, ? ? ? ? 解决办法:1、分散缓存过期的时间 2、可以设置热点数据永不过期 提前说明一下,这是我面试的问题都是我在网上找的答案,结合自己的话说了一下理解,不一定是正确的,主要作为我个人的总结。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:46:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |