文章目录 1。java基础(1)5。0多线程系列 5。0。1自定义线程类 5。0。2线程的生命周期(状态) 5。0。3线程池的实现原理?四种线程池?重要参数及原理?任务拒接策略有哪几种? 5。0。4线程池的执行流程 5。1java内存模型系列 5。1。0内存分配 5。1。1堆里面的内存分配 5。1。2垃圾回收算法解释说明 1标记清除算法 2复制算法 3标记整理算法 4分代收集算法: 5。1。3垃圾回收器说明 1。CMS收集器 2。G1收集器5。2JDK8新特性(大家查下看下) 2。javaweb(1) 2。1javaweb三大组件:Servlet,Filter,Listener 2。2Servlet特点,线程是否安全 2。3Filter过滤器作用是什么,后面学习的springmvc有什么关系,和springmvc的拦截器的区别? 2。4Listener的分类,作用是什么,后期那些框架里面用到了监听器? 2。5Cookie和Session区别以及使用场景? 3。ssmspringbootspringCloud(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(等待),TIMEDWAITING(有时间的等待),TERMINATED(终止);状态转换又如图: 也有一种说法,我认为也可以: 线程只有就绪、阻塞、运行三种状态(新建〔NEW〕和终止〔TERMINATED〕状态的线程并不是线程,只是代表一个线程对象还存在): RUNNABLE,对应就绪和运行两种状态,也就是说处于就绪和运行状态的线程在java。lang。Thread中都表现为RUNNABLE BLOCKED,对应阻塞状态,此线程需要获得某个锁才能继续执行,而这个锁目前被其他线程持有,所以进入了被动的等待状态,直到抢到了那个锁,才会再次进入就绪状态 WAITING,对应阻塞状态,代表此线程正处于无限期的主动等待中,直到有人唤醒它,它才会再次进入就绪状态 TIMEDWAITING,对应阻塞状态,代表此线程正处于有限期的主动等待中,要么有人唤醒它,要么等待够了一定时间之后,才会再次进入就绪状态 一个线程连着调用start两次会出现什么情况? 不能,如果调用两次,报非法的状态异常。 5。0。3线程池的实现原理?四种线程池?重要参数及原理?任务拒接策略有哪几种? 自定义线程池,常见的方式 线程池顶层接口:Executor 线程池: 线程池内部维护了一个线程列表,我们使用线程池只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行、被哪个线程执行,以及什么时候执行。jdk1。5引入Executor线程池框架Executor线程池框架,有以下四种实现 任务调度框架:SpringTask框架(用的多),corn时间表达式Quratz框架,corn时间表达式 比如:无效订单在30分钟后(从订单创建到持续30分钟结束,订单的付款状态),自动清除5。0。4线程池的执行流程 handler拒绝策略: 有四种: 第一种AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满 第二种DisCardPolicy:不执行新任务,也不抛出异常 第三种DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行 第四种CallerRunsPolicy:直接调用execute来执行当前任务5。1java内存模型系列5。1。0内存分配 区别:jdk8之后没有永久代,被元数据替代了jdk8之后,常量池,以及class类新存储在元数据存储,jdk8之前在方法区存储。5。1。1堆里面的内存分配 新生代GC(MinorGC):指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快(需要有效率的垃圾回收算法:复制清除算法)。 老年代GC(MajorGCFullGC):指发生在老年代的GC,出现了MajorGC经常会伴随至少一次的MinorGC(并非绝对),MajorGC的速度一般会比MinorGC的慢10倍以上。 新生代老年代保存对象的过程 当我们新new对象以后,存在eden区(新生代) 当eden区空间不足时,采用MinorGC垃圾回收器清理空间 会将没有清理对象(存活对象)移动到s1区 当s1区空间不足时,采用MinorGC垃圾回收器清理空间 会将没有清理对象(存活对象)移动到s2区 当s2空间不足时,采用MinorGC垃圾回收器清理空间 说明当前存活的对象已经是经常使用的对象。 将新生代里面经常使用的对象移动到老年代 当老年代空间不足时,采用MajorGCFullGC进行回收不使用的对象,清理空间5。1。2垃圾回收算法解释说明 新生代空间: 存储新new对象,垃圾回收器频繁在新生代进行垃圾回收,需要垃圾回收执行效率要高。 通常采用标记清除算法 老年代空间 存储大的对象(通常指的大的数组对象)以及存活时间久的对象,不需要频繁的进行垃圾回收。对执行回收效率没有要求。 通常采用:标记整理算法(在G1垃圾回收器里面用的比较多) 1标记清除算法 分为两步: 先从堆内存中判断已经不再使用的对象,进行标记 将标记的对象使用垃圾回收器进行清理 算法分为标记和清除阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它是最基础的收集算法,效率也很高,但是会带来两个明显的问题: 效率问题 空间问题(标记清除后会产生大量不连续的碎片) 2复制算法 为了解决效率问题,复制收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。 优点:执行效率高 3标记整理算法 分为3步: 先从堆内存中判断已经不再使用的对象,进行标记 将存活的对象进行移动,放在一起 将标记的对象一一清除 缺点:执行效率低 优点:堆内存空间是连续的 根据老年代的特点特出的一种标记算法,标记过程仍然与标记清除算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一段移动,然后直接清理掉端边界以外的内存。 4分代收集算法: 针对不同的堆内存空间的划分采用具体的算法 新生代:eden区,s1区,s2区 老年代:存放存活时间久的和大的数组对象 当前虚拟机的垃圾手机都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择标记清除或标记整理算法进行垃圾收集。 5。1。3垃圾回收器说明 1。CMS收集器 CMS(ConcurrentMarkSweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它而非常符合在注重用户体验的应用上使用。 CMS(ConcurrentMarkSweep)收集器是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。 从名字中的MarkSweep这两个词可以看出,CMS收集器是一种标记清除算法实现的,它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤: 初始标记:暂停所有的其他线程,并记录下直接与root相连的对象,速度很快; 并发标记:同时开启GC和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以GC线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。 重新标记:重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短 并发清除:开启用户线程,同时GC线程开始对为标记的区域做清扫。 从它的名字就可以看出它是一款优秀的垃圾收集器,主要优点:并发收集、低停顿。但是它有下面三个明显的缺点: 对CPU资源敏感; 无法处理浮动垃圾; 它使用的回收算法标记清除算法会导致收集结束时会有大量空间碎片产生。 2。G1收集器 G1(GarbageFirst)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器。以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。 被视为JDK1。7中HotSpot虚拟机的一个重要进化特征。它具备一下特点: 并行与并发:G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短StopTheWorld停顿时间。部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。 分代收集:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。 空间整合:与CMS的标记清理算法不同,G1从整体来看是基于标记整理算法实现的收集器;从局部上来看是基于复制算法实现的。 可预测的停顿:这是G1相对于CMS的另一个大优势,降低停顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内。 G1收集器的运作大致分为以下几个步骤: 初始标记 并发标记 最终标记 筛选回收 G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的Region(这也就是它的名字GarbageFirst的由来)。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了GF收集器在有限时间内可以尽可能高的收集效率(把内存化整为零)。 总结: 堆内存细化4块空间: 新生代:eden,s1,s2 老年代:Generation 不同的空间采用的算法 不同的垃圾回收算法特点 CMS和G1垃圾回收器的区别 5。2JDK8新特性(大家查下看下) Stream流 lambda表达式 接口改变 新的日期api 等等其余6个 2。javaweb(1) 2。1javaweb三大组件:Servlet,Filter,Listener Servlet作用:接收请求和响应数据到客户端。 Filter作用:拦截请求和响应。场景:处理全局的中文乱码问题,权限校验,加载配置文件等操作 实现拦截资源:静态资源(html,css,js,图片等等)和动态资源(后台与客户端交互的类,比如:controller)都会拦截 配置拦截路径:1。资源名称2。拦截所有资源3。。扩展名,比如:。html, Listener作用:监听对象状态的改变,以及加载配置文件。 2。2Servlet特点,线程是否安全 2。3Filter过滤器作用是什么,后面学习的springmvc有什么关系,和springmvc的拦截器的区别? 自定义过滤器:实现Filter接口, 有个方法doFilter(req,response):拦截请求和响应,放行:Filterchain对象放行方法 SpringMVC大量用到了过滤器, 比如:CharacterEncodingFilter,处理乱码问题,以及加载springmvc的配置文件。 过滤器和springmvc的拦截器有关系有什么区别? 过滤器是web是三大组件之一,基于web开发环境(web项目)。 springmvc的拦截器和过滤器没有关系,拦截器实现基于代理(默认jdk动态代理)方式实现的。 2。4Listener的分类,作用是什么,后期那些框架里面用到了监听器? 自定义一个监听器:实现Listener接口 监听器:分为三大类,八个监听器。 监听器:在spring框架里面,springmvc框架里面使用,springboot框架里面。 比如:spring框架,使用ContextLoaderListener在web服务器启动时,读取spring配置文件,初始化bean对象,装配到spring容器中(ConCurrentHashMap)2。5Cookie和Session区别以及使用场景?3。ssmspringbootspringCloud(1。5)4。企业开发的项目:技术说明(1。5)5。面试总结(3,4)