又是一年七月份,想必很多的秋招的内推已经开始了,小编这里分享几道面试中常见的面试题,希望可以帮助到孩子们(虽然小编也很年轻,还是个孩子)。
首先浏览器会进行dns的解析,将www.baidu.com转换为对应的ip地址。之后通过这个ip找到从客户端到服务器端的路径,客户端浏览器发起一个http请求,然后通过传输层TCP协议封装数据包后到达网络层。网络层的ARP协议可以将IP地址转化为MAC地址,当客户端浏览器和服务器端不在同一个局域网中时,数据包需要多次的转发才能到达服务器端。在中转过程中,需要根据下一跳(交换机)的Mac地址来寻找下一次跳转的目标。有了Mac地址之后,就通过数据链路层的交换机进行数据包的转发工作,再有物理层的中继器、集线器进行传输信号的放大。至此,客户端浏览器发送数据到此结束。
服务器端接收到数据包后,由下至上层层传递,拆解数据包,直到应用层。应用层查找到客户端浏览器需要的资源后,返回相应报文(具体的响应报文可以通过抓包工具抓一个看一下)。请求成功后,服务器端会返回客户端所需要的HTML,浏览器就可以进行页面的渲染了。
1)dns解析过程
当客户端发起请求后,首先需要解析这个域名所对应的IP地址。
首先,计算机会首先查看本地的硬盘的hosts文件,如果文件中存在与该域名对应的规则,则直接使用host文件中的IP地址。
其次,如果在hosts文件中没有找到对应的IP地址,则会发起一个请求至本地的dns服务器(如果是首次并不知道本地DNS服务器所对应的Mac地址,只需要发给网关,网关会发送给本地的DNS服务器。一般本地的DNS服务器都是由接入商提供的)。
当dns请求到达本地DNS服务器后,它会查询本地的缓存是否有该域名对应的IP地址,如果存在则返回对应的IP,否则发送DNS请求至顶级DNS服务器查询。本地DNS服务器得到返回的对应关系后,会将对应关系缓存在本地,以便加快后面的查询速度。
2)tomcat:参数配置或调优等
首先要了解jdk8(目前很多互联网公司依然在用jdk 1.8作为开发环境和生产环境)下面Tomcat的运行模式,BIO、NIO、NIO2(jdk7中新加入)、APR。其中BIO是Tomcat7及以前的默认启动方式,效率非常低,没有经过任何的请求,每一个线程只能处理一个请求。当应用的访问量较大时,服务器端的线程数很多,浪费了很多资源。在Java 1.4后通过了java.nio包,NIO是一种全新的I/O模式,提供了非阻塞方式的I/O操作,性能大大提高,在Linux环境下的Tomcat 8中的默认启动方式。APR的全称为Apache Protable Runtime,是从操作系统层面来解决I/O问题,性能有会有较大幅度的提高,Windows环境下Tomcat 8的默认启动方式。在Tomcat启动时,可以通过日志查看Tomcat使用哪种方式进行启动,可以修改conf文件夹下的server.xml文件进行修改。
默认Tomcat启动没有使用线程池,可以通过配置线程池来提高性能。同样是修改conf文件夹下的server.xml文件对<Executor>节点进行配置。
对连接器<Connector>进行优化,默认的Tomcat配置,最大线程数仅仅为200个,当并发量超过这个数量后,连接将被等待甚至超时丢弃。可以参考Tomcat的官网信息(https://tomcat.apache.org/tomcat-8.0-doc/config/http.html),对<Connector>标签的配置进行扩展。
现在在生产环境中大多使用Nginx+Tomcat的方式,所以在Tomcat中的AJP协议并不会使用到,可以禁用AJP连接器。
调优JVM参数,JVM的参数在生产环境来说对于程序的性能有着至关重要的作用。新生代、老年代的大小都会影响到GC的频率,进而影响程序的性能。具体的调优可以单独深入学习JVM的知识。
推荐一篇博客,很详细的讲解了调优的参数和方法:https://blog.csdn.net/zs742946530/article/details/82346707
3)tomcat与内部容器的关系:tomcat如何把http请求转给controller?tomcat、内部服务与jvm的关系?jvm常用命令与调优
4)springmvc:介绍、aop+ioc,拦截器,过滤器,请求分发,如何找到controller中对应的方法,映射的数据结构是什么?
5)数据库框架:mybatis框架介绍,如何实现mapper.xml查询数据库(没有实现类如何能执行),mysql数据库多种引擎对比
6)数据库优化:如何进行优化?为什么要分库分表?数据库索引结构?联合索引什么时候能用到索引?什么时候用不到索引及为什么?间隙锁?
7)数据库分表:用户购买产品生成订单,如何对10亿个订单进行分表?怎么获取客户的所有订单?如何获取产品的所有订单?
1)并发包下面有哪些工具或类?
通常说的并发包为java.util.concurrent包及其子包,它里面提供了Java中的并发基础工具类。
a)、
2)哪些数据结构是同步的,哪些不支持?wait与sleep?
3)synchronized与ReentrantLock,什么是自旋锁,自旋锁有哪些特性?
4)ThreadPoolExecutor的几个参数?默认队列是有界还是无界?
开始线程池为空,从开始添加线程→线程数太多→慢慢减少线程数的过程中几个参数的变化过程?
1)双亲委派
当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。
采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object 对象。
2)在项目中写个a.b.String.java类,String.java类中有个方法main,执行main方法时会有问题么?
在项目中写一个a.b.String.java的类,String.java类中有一个main方法,执行时不会出现问题。根据双亲委派模式来看,在a.b.String类加载时,会首先交给父类类加载器,由于系统中并不存在全类名为"a.b.String.java"的类,父类类加载器都无法加载,最后由应用程序类加载器进行加载,可以正常执行main方法中的程序。执行结果如下所示
3)在项目中写个java.lang.String.java类,String.java类中有个方法main,执行main方法时会有什么问题?
在项目中写一个java.lang.String.java类,双亲委派时,在启动类加载器的时候回发现系统已经加载了系统下面的java.lang.String类,已经存在了,尝试执行main方法时,发现系统的String方法中并没有main方法,出现错误。并不会执行自己定义的java.lang.String。也保证了系统只会加载一个String类。执行结果如下所示
小编会进行持续的更新啊。哈哈,希望大家能早日找到自己心仪的工作哦。