
面试
文章平均质量分 94
程序猿进阶
要做就做第一,就算结果不是第一,也会是一个好成绩。 加油!我的未来不是梦。
展开
-
Java面试——Spring
【1】用户发送请求至前端控制器。原创 2024-08-30 05:30:00 · 1946 阅读 · 59 评论 -
Java面试——Tomcat
优质博文:IT_BLOG_CN中最顶层的容器是,代表着整个服务器,从上图中可以看出,一个可以包含至少一个,用于具体提供服务。主要包含两个部分:和。从上图中可以看出的心脏就是这两个组件,他们的作用如下:【1】用于处理连接相关的事情,并提供与和 相关的转化;【2】用于封装和管理,以及具体处理请求;一个中只有一个,一个可以包含多个,一个 只有一个,但是可以有多个,这是因为一个服务可以有多个连接,如同时提供和链接,也可以提供向相同协议不同端口的连接,示意图如下(、、下边会说到):多个和一个就形成了一个,有了就原创 2024-07-31 10:26:15 · 6060 阅读 · 63 评论 -
Java 面试——Zookeeper
无论是服务端还是客户端,一旦一个 Watcher被触发,Zookeeper都会将其从相应的存储中移除。这样的设计有效的减轻了服务端的压力,不然对于更新非常频繁的节点,服务端会不断的向客户端发送事件通知,无论对于网络还是服务端的压力都非常大。原创 2024-07-26 13:37:02 · 1288 阅读 · 68 评论 -
Java面试——开源框架知识
如 ServiceA.methodA的事务级别为 PROPAGATION_REQUIRED,ServiceB.methodB 的事务级别为 PROPAGATION_REQUIRES_NEW,那么当执行到ServiceB.methodB 的时候,ServiceA.methodA 所在的事务就会挂起,ServiceB.methodB 会起一个新的事务,等待ServiceB.methodB 的事务完成以后,A才继续执行。在OOP设计中,它们导致了大量代码的重复,不利于模块的重用。它们共享相同的地址空间。原创 2024-07-22 10:35:15 · 1134 阅读 · 98 评论 -
Java面试——Linux
因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;在实际应用中,可以依据自己的实际需求选择不同的。服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的。攻击,主要是用来攻击页面的,模拟多个用户不停的对你的页面进行访问,从而使你的系统资源消耗殆尽。服务商的防攻击的服务就可以,机房一般有空余流量,我们一般是买服务,毕竟攻击不会是持续长时间。原创 2024-07-17 05:00:00 · 1215 阅读 · 77 评论 -
面试经验之谈
通常面试时从电话面试开始的。接下来可能有一两轮共享桌面远程面试,面试官通过桌面共享软件远程考查应聘者的编程和调试能力。如果应聘者足够优秀,那么公司将邀请他到公司去接受现场面试。一般一轮面试都有3个环节。首先是行为面试环节,面试官在这一环节对照简历询问应聘者的项目经验和掌握的技能。接下来就是技术面试,这个是面试的重头戏。在这一环节里,面试官除了关注应聘者的编程能力和技术功底,还会注意考查他的沟通能力和学习能力。在面试的最后,通常面试官会留几分钟时间让应聘者问几个他感兴趣的问题。。原创 2024-07-11 05:30:00 · 1728 阅读 · 90 评论 -
禁止使用存储过程
存储过程是指为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户可通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行。存储过程在数据库技术中属于一种服务端编程方式,是一组预编译的SQL语句集,常用于对数据库进行操作、控制和管理。存储过程通常包括流程控制语句、数据操作语句、变量的定义和赋值、条件判断语句等,可以在执行过程中接受参数输入,并返回查询结果。原创 2024-07-11 05:30:00 · 4750 阅读 · 110 评论 -
CPU 100%问题排查总结
如果是Full GC次数过多,那么通过 jstack得到的线程信息会是类似于VM Thread之类的线程,而如果是代码中有比较耗时的计算,那么我们得到的就是一个线程的具体堆栈信息[如下]。如果程序中有大量的线程,并且这些线程没有得到适当的管理和控制,可能会导致线程竞争和频繁的上下文切换,从而导致CPU占用率高。如果程序中有大量的计算任务,尤其是在循环中进行复杂的计算操作,可能会导致CPU占用率高。如果程序中存在不合理的资源使用,例如频繁的IO操作或内存泄漏,可能会导致CPU占用率高。原创 2024-06-02 19:02:45 · 1944 阅读 · 94 评论 -
Java面试——专业技能
JDK5 中增加了并发库,为 Java 线程的管理和使用提供了强大的便利性。java.util.current 包中提供了对线程的优化和管理的各项操作,该包提供了线程的运行,线程池的创建,线程声明周期的控制。【1】创建一个可缓存线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则创建新线程。【2】创建一个定长线程池,可以控制最大线程并发数,超出的线程会在队列中等待。【3】创建一个定长线程池,支持定时及周期性任务执行。【4】原创 2024-06-01 14:56:59 · 1619 阅读 · 54 评论 -
Java面试——MyBatis
【1】Hibernate 是一个标准的 ORM 框架,面向对象开发,不需要写 SQL语句,维护数据表关系比较复杂,SQL 语句自动生成,对 SQL语句优化,修改比较困难。SqlSession 是 Mybatis 最重要的构建之一,可以简单的认为 Mybatis一系列的配置目的是生成类似 JDBC 生成的Connection 对象的 SqlSession 对象,这样才能与数据库开启“沟通”,通过 SqlSession 可以实现增删改查。而 ${} 主要用于 SQL拼接的时候,有很大的 SQL注入隐患。原创 2024-05-11 05:00:00 · 1857 阅读 · 106 评论 -
Java面试——SQL 语句题
【11】按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩:这里要注意 where 和 on 的区别:on 条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左(右)边表中的记录。【15】查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩:思路就是先查询一条数据,然后与表中的数据比较相同的成绩,且科目号不相同的数据行,如果大于1则返回当前行即可。【1】查询"01"课程比"02"课程成绩高的学生的信息及课程分数:当对一张表中的一列数据比较时,应当将一张表拆分为两张表;原创 2024-03-16 05:00:00 · 2846 阅读 · 55 评论 -
Java面试——Netty
一个数据或者事件可能会被多个 Handler 处理,在这个过程中,数据或者事件经流 ChannelPipeline,由 ChannelHandler 处理。在这个处理过程中,一个 ChannelHandler 接收数据后处理完成后交给下一个 ChannelHandler,或者什么都不做直接交给下一个 ChannelHandler。原创 2024-03-09 05:00:00 · 1984 阅读 · 80 评论 -
Java面试——Redis
如果一个 master出现了脑裂,跟其他 slave丢了连接,那么上面这两个配置可以去确保说,如果不能继续给指定数量的 slave发送数据,而且 slave超过10秒没有给自己 ack消息,那么就直接拒绝客户端的写请求,这样脑裂活的旧 master就不会接受 client的新数据,也就避免了数据丢失,上面配置确保了,如果跟任何一个 slave丢了连接,在 10秒后发现没有 slave给自己 ack,那么就拒绝新的写请求,因此脑裂场景下,最多丢失 10秒的数据。如果没有分区,你最多只能使用一台机器的内存。原创 2024-03-03 05:00:00 · 1810 阅读 · 105 评论 -
Java面试——锁
在并发环境中,每个线程在获取锁时会先查看此锁维护的队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照 FIFO 的规则从队列中取到自己。指多个线程获取锁的顺序并不是按照申请锁的顺序,上来就尝试占有锁,如果尝试失败,就再采用类似公平锁的方式获取锁。【4】不适合计算密集型任务:如果任务主要是计算密集型的,使用自旋锁可能会导致性能下降,因为自旋锁会占用CPU资源,而在计算密集型任务中,减少锁的使用可能是更优的选择。类型来得到公平锁或非公平锁,默认是。原创 2024-02-26 05:00:00 · 6204 阅读 · 79 评论 -
Java面试——多线程
一、什么是线程线程是指程序在运行的过程中,能够执行程序代码的一个执行单元。Java语言中,线程有四种状态:运行、就绪、挂起、结束二、线程与进程的区别进程是指一段正在执行的程序。而线程有时也被称为轻量级进程,它是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段、堆空间)及一些进程级的文件(列如:打开的文件),但是各个线程拥有自己的栈空间。在操作系统级别上,程序的执行都是以进程为单位的,而每个进程中通常都会有多个线程互不影响地并发执行。三、为什么要使用原创 2021-04-18 14:10:40 · 2186 阅读 · 19 评论 -
网站故障案例总结
一、写日志引发故障【故障现象】:应用服务集群发布后不久就出现多台服务器相继报警,硬盘可用空间低于警戒值,并且很快有服务器宕机。登录在线上服务器,发现 log 文件夹里面的文件迅速增加,不断消耗磁盘空间。【原因分析】:这是一个普通的应用服务器集群,不需要存储数据,因此服务器使用的是一块 100GB 的小硬盘,安装完操作系统、Web 服务器、Java 虚拟机、应用程序后,空闲空间就剩几十GB,正常情况下这些磁盘的空间足够,但是该应用的开发人员将 log输出的 level全局配置为 Debug。这样一次简单原创 2021-04-21 23:06:11 · 1180 阅读 · 20 评论 -
订单付款倒计时实现方案
当使用 12306 抢票成功后,就会进入付款界面,这个时候就会出现一个订单倒计时,下面我们就对付款倒计时的功能实现,进行深入学习和介绍,界面展示如下:如何实现付款及时呢,首先用户下单后,存储用户的下单时间。下面介绍四种系统自动取消订单的方案:一、DelayQueue 延时无界阻塞队列我们的第一反应是用 数据库轮序+任务调度 来实现此功能。但这种高效率的延迟任务用任务调度(定时器)实现就得不偿失。而且对系统也是一种压力且数据库消耗极大。因此我们使用 Java 延迟队列 DelayQueue ..原创 2021-04-20 12:42:32 · 4785 阅读 · 2 评论 -
Java面试——写一个生产者与消费者
【1】我们可以将生产者和消费者需要的方法写在公共类中package com.yintong.concurrent;import java.util.LinkedList;public class Concurrentcomm { //常量 private static int MAX_VALUE = 10; //可以理解为缓存 LinkedList<String> linkedList = new LinkedList<>();原创 2021-04-18 14:12:18 · 1338 阅读 · 0 评论 -
Java面试——阻塞队列
一、阻塞队列【1】首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下图所示:二、架构分析【1】阻塞队列的架构图:阻塞队列与 List 具有很多类似之处,对比着学习会更加容易一些。【2】阻塞队列重点子类说明: ■ ArrayBlockingQueue:由数组结构组成的有界阻塞队列。 ■ LinkedBlockingQueue:由链表结构组成的有界(大小默认值为 Integer.MAX_VALUE <21亿左右,相当于无界>)阻塞队列。 ■ ......原创 2021-04-18 14:13:23 · 1208 阅读 · 49 评论 -
Java面试——Redis
一、Redis 为什么那么快【1】完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中。【2】数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的。【3】采用单线程,避免不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。【4】使用多路IO复用模型,非阻塞IO。利用epoll可以同时监察多个流的 IO事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或原创 2021-04-18 22:27:28 · 1216 阅读 · 2 评论 -
Java面试——缓存
一、什么是缓存【1】缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存中查询数据,有则直接执行,不存在时从磁盘中获取。由于缓存的数据比磁盘快的多,所以缓存的作用就是帮助硬件更快的运行。【2】缓存往往使用的是RAM(断电既掉的非永久存储),所以在用完后还是会把文件送到硬盘等存储器中永久存储。电脑中最大缓存就是内存条,硬盘上也有16M或者32M的缓存。【3】高速缓存是用来协调CPU与主存之间存取速度的差异而设置的。一般CPU工作速度高,但内存的工作速度相对较低,为了解决这原创 2021-04-18 14:00:34 · 1108 阅读 · 0 评论 -
Java面试——RPC
一、RPC 服务的原理【1】Socket 套接字:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个链接的一端称为 Socket。可以实现不同计算机之间的通信,是网络编程接口的具体实现。Socket 套接字是客户端/服务端网络结构程序的基本组成部分。【2】RPC 的调用过程:实现透明的远程过程调用的重点是创建客户存根(client stub),存根(stub)就像代理(agent)模式里的代理。在生成代理代码后,代理的代码就能与远程服务端通信了,通信的过程都是由 RPC 框架实现,而调用者就像原创 2021-04-17 20:39:55 · 2783 阅读 · 13 评论 -
Java面试——Nginx
一、为什么 Nginx可以采用异步非阻塞的方式来处理看看一个请求的完整过程:请求过来,要建立连接,然后再接收数据,接收数据后,再发送数据。具体到系统底层,就是读写事件,而当读写事件没有准备好时,必然不可操作,如果不用非阻塞的方式来调用,那就得阻塞调用了,事件没有准备好,那就只能等了,等事件准备好了,你再继续吧。阻塞调用会进入内核等待,cpu就会让出去给别人用了,对单线程的worker来说,显然不合适,当网络事件越多时,大家都在等待呢,cpu空闲下来没人用,cpu利用率自然上不去了,更别谈高并发了原创 2021-04-17 20:29:53 · 3996 阅读 · 18 评论 -
Java面试——搜索
一、Elasticsearch了解多少ElasticSearch 是一个基于 Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web接口。Elasticsearch 是用 Java开发的,并作为 Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组原创 2021-04-17 20:26:25 · 1047 阅读 · 7 评论 -
Java面试——消息队列
一、消息队列的使用场景☞ 以下介绍消息队列在实际应用常用的使用场景。异步处理、应用解耦、流量削锋和消息通讯四个场景。【1】异步处理:场景说明:用户注册后,需要发注册邮件和注册短信。引入消息队列后架构如下:用户的响应时间=注册信息写入数据库的时间,例如50毫秒。发注册邮箱、发注册短信写入消息队列后,直接返回客户端,因写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。按照传统的做法①、串行方式,将注册信息写入数据库成功后,发注册邮件,再发送注册短信,以上三个成功后,返回客户端.原创 2021-04-17 15:45:25 · 3806 阅读 · 48 评论 -
Java面试——数据库
一、数据库隔离级别【1】Read Uncommitted(读取未提交内容):出现脏读,也就是可能读取到其他会话中未提交事务修改的数据。【2】Read Committed(读取已提交内容):不可重复读,只能读取到已经提交的数据。Oracle 等数据库默认的隔离级别。【3】Repeatable Read(可重复读):出现幻读。在同一个事务内的查询都和事务开始时刻一致。InnoDB默认级别。【4】Serializable(串行读):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。My原创 2021-04-16 23:40:57 · 15454 阅读 · 14 评论 -
Java面试——JVM知识
一、什么情况下会发生栈内存溢出【1】线程请求的栈深度大于虚拟机所允许的深度,将抛出 StackOverflowError 异常。递归的调用一个简单的方法,不断累积就会抛出 StackOverflowError 异常。【2】如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出 OutOfMemoryError 异常。无限循环的创建线程,并对每个线程增加内存。则会抛出 OutOfMemoryError 异常。【注意】:在多线程的情况下,给每个线程的栈分配的内存越大,越容易产生内存溢出异常。操作系统为原创 2021-04-11 23:34:48 · 1682 阅读 · 77 评论 -
Java面试——Java基础
一、JAVA中的几种基本数据类型Java语言中一共提供了8种原始的数据类型(byte,short,int,long,float,double,char,boolean),这些数据类型不是对象,而是 Java语言中不同于类的特殊类型,这些基本类型的数据变量在声明之后就会立刻在栈上被分配内存空间。除了这8种基本的数据类型外,其他类型都是引用类型(例如类、接口、数组等),引用类型类似于C++中的引用或指针的概念,它以特殊的方式指向对象实体,此类变量在声明时不会被分配内存空间,只是存储了一个内存地址而已。.原创 2021-04-06 23:39:25 · 1902 阅读 · 2 评论 -
HashMap 与 ConcurrentHashMap 底层实现
一、HashMap 底层源码JDK7 版本(数组+链表)我们存放的 hashMap 都会封装成一个节点对象 Entry(key,value),然后将此节点对象存放到一个数组中,存放前首先需要确定存放的数组下标:① 通过 hash(key) 算法得到 key 的 hashcode,并通过 hashcode的高16位和低16位进行异或操作(如果两个相应bit位相同,则结果为0,否则为1)得到32位的 int值,首先将高16位无符号右移16位与低十六位做异或运算。如果不这样做,而是直接做&运算(相原创 2021-03-30 22:50:52 · 10658 阅读 · 48 评论 -
Java面试——Spring Boot
Java面试——Spring Boot一、谈谈你对 SpringBoot 的理解简单说说我的理解:Java是一个静态语言,相比动态语言,它相对笨重,体现在我们搭建 SSM 框架写一个 Helloword 的时候相当复杂,需要写一大堆的配置。还有在导入 jar包依赖的时候版本号问题,令人头疼。但是,我们有 Spring呀,真的是 Java 开发人员的福音。SpringBoot 就是为解决这些问题而生的。让我们写一个 Helloword 跟动态语言一样简单。版本控制也通过 SpringBoot 与 Mav原创 2021-02-06 21:56:01 · 2940 阅读 · 5 评论 -
Java面试——TCP与HTTP
Java面试——TCP与HTTP一、Session 和 Cookie 的区别【1】Cookie 保存在客户端,未设置存储时间的 Cookie,关闭浏览器会话 Cookie 就会被删除;设置了存储时间的 Cookie 保存在用户设备的磁盘中直到过期,同时 Cookie 在客户端所以可以伪造,不是十分安全,敏感数据不易保存。Session 保存在服务器端,存储在 IIS 的进程开辟的内存中,而 Session 过多会消耗服务器资源,所以尽量少使用 Session。【2】Session 是服务器用来跟踪原创 2021-02-03 23:53:42 · 1248 阅读 · 41 评论 -
Java面试——架构设计与分布式
ava面试——架构设计与分布式一、用 Java 自己实现一个 LRULRU(Least Recently Used:最近最少使用):简单的说,就是保证基本的 Cache容量,如果超过容量则必须丢掉最不常用的缓存数据,再添加最新的缓存。每次读取缓存都会改变缓存的使用时间,将缓存的存在时间重新刷新。其实,就是清理缓冲的一种策略。我们可以通过双向链表的数据结构实现 LRU Cache,链表头(head)保存最新获取和存储的数据值,链表尾(tail)既为最不常使用的值,当需要清理时,清理链表的 tail 即原创 2021-02-03 00:02:11 · 1191 阅读 · 1 评论 -
Java面试——微服务
Java面试——微服务一、什么是微服务就目前而言,对于微服务业界并没有一个统一的,标准的定义。但通常而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分一组小的服务,每个服务运行在其独立的自己的进程中,服务之间相互协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API),每个服务都围绕着具体的业务进行构建,并且能够被独立的构建在生产环境、类生产环境等。另外,应避免统一的、集中式的服务管理机制,对具体的一个服务而原创 2021-02-02 22:41:04 · 1366 阅读 · 2 评论