面試就业题库(三) 就业面试题目
yuyutoo 2024-10-26 16:08 3 浏览 0 评论
文章目录
1. java基础(1)
5.0 多线程系列
5.0.1 自定义线程类
5.0.2 线程的生命周期(状态)
5.0.3 线程池的实现原理?四种线程池?重要参数及原理?任务拒接策略有哪几种?
5.0.4 线程池的执行流程
5.1 java内存模型系列
5.1.0 内存分配
5.1.1 堆里面的内存分配
5.1.2 垃圾回收算法解释说明
1 标记-清除算法
2 复制算法
3 标记-整理算法
4 分代收集算法:
5.1.3 垃圾回收器说明
1. CMS收集器
2. G1收集器
5.2 JDK8新特性(大家查下看下)
2. javaweb(1)
2.1 javaweb三大组件: Servlet, Filter, Listener
2.2 Servlet特点,线程是否安全
2.3 Filter过滤器作用是什么, 后面学习的springmvc有什么关系, 和springmvc的拦截器的区别?
2.4 Listener的分类, 作用是什么,后期那些框架里面用到了监听器?
2.5 Cookie 和 Session 区别以及使用场景?
3. ssm+springboot+springCloud(1.5)
4. 企业开发的项目: 技术说明(1.5)
5. 面试总结(3,4)
1. java基础(1)
5.0 多线程系列
5.0.1 自定义线程类
1 继承Thread
2 实现Runnable接口(实现多个线程共享同一个资源)
3 实现Callable接口(实现执行完线程后,拿到返回值)
Thread和Runnable接口实现自定义线程类, 区别.
相同点: 都可以开启多线程,实现功能.
不同点:
Thread 不能共享资源.
Runnable 共享资源.
场景: 多线程上传(下载)文件, 多线程实现卖票.
分析: 文件(比如:一个大的文件, 5G)就是一个资源,可以初始化5个线程共享一个文件
票(比如: 10000张票)就是一个资源,可以初始化100个线程共享10000票
实现: 通过 Runnable 接口,自定义线程类,去共享资源.
实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果;
1.Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛;
2.Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞!
{Thread.Runnable接口} 和 Callable实现自定义线程类, 区别.
5.0.2 线程的生命周期(状态)
Thread对象共有6种状态:NEW(新建),RUNNABLE(运行),BLOCKED(阻塞),WAITING(等待),TIMED_WAITING(有时间的等待),TERMINATED(终止);状态转换又如图:
也有一种说法,我认为也可以:
线程只有”就绪”、”阻塞”、”运行”三种状态(新建[NEW]”和”终止[TERMINATED]”状态的线程并不是线程,只是代表一个线程对象还存在):
RUNNABLE,对应”就绪”和”运行”两种状态,也就是说处于就绪和运行状态的线程在java.lang.Thread中都表现为”RUNNABLE”
BLOCKED,对应”阻塞”状态,此线程需要获得某个锁才能继续执行,而这个锁目前被其他线程持有,所以进入了被动的等待状态,直到抢到了那个锁,才会再次进入”就绪”状态
WAITING,对应”阻塞”状态,代表此线程正处于无限期的主动等待中,直到有人唤醒它,它才会再次进入就绪状态
TIMED_WAITING,对应”阻塞”状态,代表此线程正处于有限期的主动等待中,要么有人唤醒它,要么等待够了一定时间之后,才会再次进入就绪状态
一个线程连着调用start两次会出现什么情况?
不能, 如果调用两次,报非法的状态异常.
5.0.3 线程池的实现原理?四种线程池?重要参数及原理?任务拒接策略有哪几种?
自定义线程池,常见的方式
线程池顶层接口: Executor
线程池:
线程池内部维护了一个线程列表,我们使用线程池只需要定义好任务,然后提交给线程池,而不用关心该任务是如何 执行、被哪个线程执行,以及什么时候执行.jdk1.5引入Executor线程池框架Executor线程池框架,有以下四种实现
任务调度框架:
- Spring Task框架(用的多),corn 时间表达式
- Quratz框架,corn 时间表达式
比如: 无效订单在30分钟后(从订单创建到持续30分钟结束,订单的付款状态),自动清除
5.0.4 线程池的执行流程
handler拒绝策略:
有四种:
第一种AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满
第二种DisCardPolicy:不执行新任务,也不抛出异常
第三种DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行
第四种CallerRunsPolicy:直接调用execute来执行当前任务
5.1 java内存模型系列
5.1.0 内存分配
- 区别:
- jdk8之后没有永久代, 被元数据替代了
- jdk8之后, 常量池,以及class类新存储在元数据存储, jdk8之前在方法区存储.
5.1.1 堆里面的内存分配
新生代GC(Minor GC):指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快(需要有效率的垃圾回收算法: 复制清除算法)。
老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC经常会伴随至少一次的Minor GC(并非绝对),Major GC的速度一般会比Minor GC的慢10倍以上。
新生代—老年代保存对象的过程
当我们新new对象以后,存在eden区(新生代)
当eden区空间不足时,采用Minor GC垃圾回收器清理空间
会将没有清理对象(存活对象)移动到s1区
当s1区空间不足时,采用Minor GC垃圾回收器清理空间
会将没有清理对象(存活对象)移动到s2区
当s2空间不足时,采用Minor GC垃圾回收器清理空间
说明当前存活的对象已经是经常使用的对象.
将新生代里面经常使用的对象移动到老年代
当老年代空间不足时,采用Major GC/Full GC进行回收不使用的对象,清理空间
5.1.2 垃圾回收算法解释说明
新生代空间:
存储新new对象, 垃圾回收器频繁在新生代进行垃圾回收,需要垃圾回收执行效率要高.
通常采用标记-清除算法
老年代空间
存储大的对象(通常指的大的数组对象)以及存活时间久的对象,不需要频繁的进行垃圾回收.对执行回收效率没有要求.
通常采用:标记-整理算法(在G1垃圾回收器里面用的比较多)
1 标记-清除算法
分为两步:
先从堆内存中判断已经不再使用的对象,进行标记
将标记的对象使用垃圾回收器进行清理
算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它是最基础的收集算法,效率也很高,但是会带来两个明显的问题:
效率问题
空间问题(标记清除后会产生大量不连续的碎片)
2 复制算法
为了解决效率问题,“复制”收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。
优点: 执行效率高
3 标记-整理算法
分为3步:
先从堆内存中判断已经不再使用的对象,进行标记
将存活的对象进行移动,放在一起
将标记的对象一一清除
缺点: 执行效率低
优点: 堆内存空间是连续的
根据老年代的特点特出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一段移动,然后直接清理掉端边界以外的内存。
4 分代收集算法:
针对不同的堆内存空间的划分采用具体的算法
新生代: eden区, s1区,s2区
老年代: 存放存活时间久的和大的数组对象
当前虚拟机的垃圾手机都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。
比如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。
5.1.3 垃圾回收器说明
1. CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它而非常符合在注重用户体验的应用上使用。
CMS(Concurrent Mark Sweep)收集器是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。
从名字中的Mark Sweep这两个词可以看出,CMS收集器是一种 “标记-清除”算法实现的,它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤:
初始标记: 暂停所有的其他线程,并记录下直接与root相连的对象,速度很快 ;
并发标记: 同时开启GC和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以GC线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。
重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短
并发清除: 开启用户线程,同时GC线程开始对为标记的区域做清扫。
从它的名字就可以看出它是一款优秀的垃圾收集器,主要优点:并发收集、低停顿。但是它有下面三个明显的缺点:
对CPU资源敏感;
无法处理浮动垃圾;
它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。
2. G1收集器
G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.
被视为JDK1.7中HotSpot虚拟机的一个重要进化特征。它具备一下特点:
并行与并发:G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿时间。部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。
分代收集:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。
空间整合:与CMS的“标记–清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。
可预测的停顿:这是G1相对于CMS的另一个大优势,降低停顿时间是G1 和 CMS 共同的关注点,但G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内。
G1收集器的运作大致分为以下几个步骤:
初始标记
并发标记
最终标记
筛选回收
G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的Region(这也就是它的名字Garbage-First的由来)。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了GF收集器在有限时间内可以尽可能高的收集效率(把内存化整为零)。
总结:
堆内存细化4块空间:
新生代: eden, s1,s2
老年代: Generation
不同的空间采用的算法
不同的垃圾回收算法特点
CMS和G1垃圾回收器的区别
5.2 JDK8新特性(大家查下看下)
Stream流
lambda表达式
接口改变
新的日期api
等等其余6个
2. javaweb(1)
2.1 javaweb三大组件: Servlet, Filter, Listener
Servlet作用: 接收请求和响应数据到客户端.
Filter作用: 拦截请求和响应.场景: 处理全局的中文乱码问题,权限校验,加载配置文件等操作
实现拦截资源: 静态资源(html, css, js, 图片等等)和动态资源(后台与客户端交互的类,比如: controller)都会拦截
配置拦截路径: 1. /资源名称 2. /* 拦截所有资源 3. .扩展名, 比如: .html,
Listener作用: 监听对象状态的改变,以及加载配置文件.
2.2 Servlet特点,线程是否安全
2.3 Filter过滤器作用是什么, 后面学习的springmvc有什么关系, 和springmvc的拦截器的区别?
自定义过滤器: 实现Filter接口,
有个方法doFilter(req, response): 拦截请求和响应,放行: Filterchain对象放行方法
SpringMVC大量用到了过滤器,
比如: CharacterEncodingFilter, 处理乱码问题,以及加载springmvc的配置文件.
过滤器和springmvc的拦截器有关系有什么区别?
过滤器是web是三大组件之一,基于web开发环境(web项目).
springmvc的拦截器和过滤器没有关系,拦截器实现基于代理(默认jdk动态代理)方式实现的.
2.4 Listener的分类, 作用是什么,后期那些框架里面用到了监听器?
自定义一个监听器: 实现Listener接口
监听器:分为三大类,八个监听器.
监听器: 在spring框架里面,springmvc框架里面使用,springboot框架里面.
*比如: spring框架,使用ContextLoaderListener在web服务器启动时,读取spring配置文件,初始化bean对象,装配到spring容器中(ConCurrentHashMap)
2.5 Cookie 和 Session 区别以及使用场景?
3. ssm+springboot+springCloud(1.5)
4. 企业开发的项目: 技术说明(1.5)
5. 面试总结(3,4)
相关推荐
- 史上最全的浏览器兼容性问题和解决方案
-
微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...
-
- 平面设计基础知识_平面设计基础知识实验收获与总结
-
CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...
-
2025-02-21 16:01 yuyutoo
- 写作排版简单三步就行-工具篇_作文排版模板
-
和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...
- 写一个2048的游戏_2048小游戏功能实现
-
1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...
- 今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……
-
最近的天气暖和得让很多小伙伴们喊“热”!!! 昨天的气温到底升得有多高呢?你家有没有榜上有名?...
- CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式
-
之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...
- 你的自我界限够强大吗?_你的自我界限够强大吗英文
-
我的结果:A、该设立新的界限...
- 行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?
-
行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...
-
- 让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
-
去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...
-
2025-02-21 16:00 yuyutoo
- 今年国家综合性消防救援队伍计划招录消防员15000名
-
记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...
- 一起盘点最新 Chrome v133 的5大主流特性 ?
-
1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...
- 竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使
-
style="text-align:center;"data-mce-style="text-align:...
- 学物理能做什么?_学物理能做什么 卢昌海
-
作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...
-
- 你不知道的关于这只眯眼兔的6个小秘密
-
在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...
-
2025-02-21 16:00 yuyutoo
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)