写点什么

java 架构师常见的基础面试题及答案(一),这个回答让我错失 offer

用户头像
极客good
关注
发布于: 刚刚

八、Servlet 的生命周期


主要分三个阶段:初始化——调用 init()方法,响应客户请求阶段——调用 service()方法,终止阶段——调用 destroy 方法。工作原理:客户发送一个请求,servlet 调用 service 方法对请求进行响应,即对请求方式进行匹配,选择调用 doGet、doPost 方法等,然后进入对于的方法中调用逻辑层的方法,实现对客户的响应。自定义的 servlet 必须首先 servlet 接口。


具体生命周期包括:装载 Servlet、服务器创建 Servlet 实例、服务器调用 Servlet 的 init()方法、客户请求到达服务器、服务器创建请求对象、服务创建相应对象、服务器激活 Servlet 的 service 方法,请求对象和响应对象作为 service()方法的参数、service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息、service()方法可能激活其他方法以处理请求,如 doGet(),doPost()


九、HTTP 报文包含内容


请求方法包括 GET,POST,HEAD,PUT,TRACE,OPTIONS,DELETE。请求头如:Host、User-Agent、Connection、Accept-Charset 等。请求头部的最后会有一个空行,表示请求头部结束,接下来为请求正文,这一行非常重要,必不可少。请求正文为可选部分,如 get 就没有。


十、Statement 与 PreparedStatement 的区别,什么是 SQL 注入,如何防止 SQL 注入


使用 PreparedStatement 可以提升代码的可读性和可维护性,可以尽最大可能提高性能。因为 Statement 每次执行一个 SQL 命令都会对其编译,但 PreparedStatement 则只编译一次。PreparedStatement 就类似于流水线生产。另一方面 PreparedStatement 可以极大提高安全性:它对传递过来的参数进行了强制参数类型转换,确保插入或查询数据时,与底层数据库格式匹配。


SQL 注入:就是通过将 sql 命令插入到 web 表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意 SQL 命令。如 sql 命令:select id from test where name=‘1’ or 1=1; drop table test,但用 PreparedStatement 就可以避免这种问题。


十一、redirect, forward 区别


redirect:服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。所以地址栏显示是新的 url。forward 是指服务器请求资源,直接访问目标地址 url,把响应的内容读取过来并再发送给浏览器,浏览器并不知道资源从哪里来,所以地址栏不变。


redirect 不能共享数据,forward 转发页面和转发到页面可以贡献 request 中的数据。redirect 用于注销,forward 用于登陆。forward 效率高于 redirect。


十二、关于 JAVA 内存模型,一个对象(两个属性,四个方法)实例化 100 次,现在内存中的存储状态,几个对象,几个属性,几个方法。


Java 新建的对象都放在堆里,如果实例化 100 次,堆中产生 100 个对象,一般对象与其属性和方法属于一个整体,但如果属性和方法是静态的,则属性和方法只在内存中存一份。


十三、谈谈 Hibernate 的理解,一级和二级缓存的作用,在项目中 Hibernate 都是怎么使用缓存的


一级缓存为 session 基本的缓存,是内置的不能卸载。一个 Session 做了一个查询操作,它会把这个结果放在一级缓存中,如果短时间内这个 session 又做了同一个操作,那么 hibernate 就直接从一级缓存中获取数据。


二级缓存是 SessionFactory 的缓存,分为内置缓存和外置缓存两类。即查询结果放在二级缓存中,如果同一个 sessionFactory 创建的某个 session 执行了相同的操作,hibernate 就会从二级缓存中获取结果。适合放在二级缓存中的数据包括:很少被修改的数据,不是很重要的数据,允许出现偶偶并发的数据,不会被并发访问的数据,参考数据。不适合放在二级缓存中的数据:经常被修改的数据,财务数据,绝对不允许出现并发,与其他应用共享的数据。


十四、反射讲一讲,主要是概念,都在哪需要反射机制,反射的性能,如何优化


能够分析类能力的程序称为反射。反射机制可以用来:在运行中分析类的能力,在运行中查看对象,如编写一个 toString 方法供所有类使用。实现通用的数据操作代码。利用 Method 对象,这个对象很像 C++的指针。


反射性能优化方法主要为设置不用做安全检查。


十五、谈谈 Hibernate 与 Ibatis 的区别,哪个性能会更高一些


Ibatis 相当较为简单,容易上手,Hibernate 比较复杂,门槛较高。如果系统需要处理数据量很大,性能要求很高,需要执行高度优化的 sql 语句才能达到性能要求,则此时 Ibatis 会比较好。


对不同数据库支持方面 Hibernate 较好,因为 Ibatis 需要修改的字段较多。另外 Hibernate 现已成为主流的 o/r Mapping 框架,开发效率高。


十六、对 Spring 的理解,项目中都用什么?怎么用的?对 IOC、和 AOP 的理解及实现原理


十七、线程同步,并发操作怎么控制


线程同步不一定就是同时,而是协同步骤,或协同步调。线程同步就是多个线程在逻辑上互有因果关系,所以要对其执行顺序进行协调。


线程并发是指同一时间间隔内,多个线程同时执行。如果线程在时间上能够区分,那么就可以上线程休眠指定的时间来进行同步,可用 sleep()方法完成。如果线程在时间上不能区分,但在逻辑顺序上可以区分的话,那么可用 jion()方法来完成,一个先执行完,然后执行另一个。如果线程设计较为复杂,那么就只有通过 wait(),notify()方法来完成了


十八、描述 struts 的工作流程。


简略过程就是 web 应用启动,接收用户请求并进行匹配,返回用户请求信息。


1. 在 web 应用启动时,加载并初始化 ActionServlet,ActionServlet 从 struct-config.xml 文件中读取配置信息,把它们存放到各个配置对象中。


2. 当 ActionServlet 接收到一个客户请求时,首先检索和用户请求相配的 ActionMapping 实例,如果不存在,返回用户请求路径无效信息。


3. 如 ActionForm 实例不存在,则创建一个 ActionForm 对象,把客户提交的表单数据保存到 ActionForm 对象中。


4. 根据配置信息决定是否需要表单验证。如果需要验证,就调用 ActionForm 的 Validate()方法。如果 Valiedate()方法返回 null 或返回一个不包含 ActionMessage 的 ActionErrors 对象,则表示表单验证成功。


5. ActionServlet 更加 ActionMapping 实例包含的映射信息决定请请求转发给哪个 Action。如果相应的 Action 实例不存在,则先创建这个实例,然后调用 Action 的 execute()方法。


6. Action 的 execute()方法返回一个 ActionForward 对象,ActionServlet 再把客户请求转发给 ActionForward 对象指向的 JSP 组建。


7. ActionForward 对象指向的 jsp 组件生成的动态网页,返回给客户。


十九、Tomcat 的 session 处理,如果让你实现一个 tomcatserver,如何实现 session 机制


当一个 session 开始时,Servlet 容器会创建一个 HttpSession 对象,在某些情况下把这些 HttpSession 对象从内存中转移到文件系统中或数据库中。需要访问的时候将它们载入到内存中。这样的好处就是节省内存,当 web 服务器产生故障时,还可以从文件系统或数据库中恢复 Session 的数据。管理 session 有两个类:1)StandardManager,这是一个默认的类,当 tomcat 启动或重载时将会 session 对象保存到指定文件中。2)PersistentManager,管理方式更加灵活,具有容错能力,可以及时把 Session 备份到 Session Store 中,可以控制内存中 Session 的数量。


二十、关于 Cache(Ehcache,Memcac


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


hed)


Memcache:分布式内存对象缓存系统,占用其他机子的内存。很多互联网,负载均衡三台(以三台为例)web 服务器可以共享一台 Memcache 的资源。传递的信息以键值对的形式存储。传递的数据要实现序列化。


Oscache:页面级缓存(网上强调最多的东西),占用本机的内存资源。可 以选择缓存到硬盘,如存取到硬盘重启服务也可重新获得上次持久化的资源,而如果缓存到内存就不行。一般没必要缓存到硬盘,因为 I/O 操作也是比较耗资源,和从数据库取往往优势很小。Oscache 存取数据的作用域分为 application 和 session 两种。


EhCache:Hibernate 缓存,DAO 缓存,安全性凭证缓存(Acegi),Web 缓存,应用持久化和分布式缓存。EhCache 在默认情况下,即在用户未提供自身配置文件 ehcache.xml 或 ehcache-failsafe.xml 时,EhCache 会依据其自身 Jar 存档包含的 ehcache-failsafe.xml 文件所定制的策略来管理缓存。如果用户在 classpath 下提供了 ehcache.xml 或 ehcache-failsafe.xml 文件,那么 EhCache 将会应用这个文件。如果两个文件同时提供,那么 EhCache 会使用 ehcache.xml 文件的配置。


二一、sql 的优化相关问题


1. 对查询优化,避免全表扫描


2. 尽量避免 where 子句中对段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。


3. 尽量避免 where 子句中出现!=或<>,否则将导致引擎放弃使用索引而进行全表扫描。


4. 尽量避免 where 子句中出现 or 来连接条件。


5. 慎用 in 和 not in,否则导致全表扫描


6. where 中不要用函数操作。


7. Update 语句,如果只更改 1、2 个字段,不要 Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志。


8. 对于多张大数据量(这里几百条就算大了)的表 JOIN,要先分页再 JOIN,否则逻辑读会很高,性能很差。


9. 尽可能的使用 varchar/nvarchar 代替 char/nchar,节省空间,提高查询效率


10. select count(*) from table;这样不带任何条件的 count 会引起全表扫描,并且没有任何业务意义,是一定要杜绝的。


二二、oracle 中 rownum 与 rowid 的理解,一千条记录我查 200 到 300 的记录怎么查?


二三、如何分析 ORACLE 的执行计划?


二四、 DB 中索引原理,种类,使用索引的好处和问题是什么?


原理:因为检索磁盘比对数据,需要大量的时间和 IO,所以就需要构造某列的数据的 btree、hash 值、位图索引。一般的索引能快速的查找比对,而索引的值记录了磁盘的位置,直接读取数据库字段对应位置的内容。


索引好处:加快数据检索速度、加速表与表之间的连接特别是实现数据的参考完整性方面有特别的意义、减少查询中分组和排序的时间,使用优化隐藏器,提高系统性能。


缺点:创建和维护索引需要时间,索引需要占用物理空间,当对表中的数据惊醒增删改时所有也需要动态维护。


二五、JVM 垃圾回收实现原理。垃圾回收的线程优先级。


JVM 的堆空间中主要分为年轻代、年老代和永久代。年轻代和年老代是存储动态产生的对象。永久代主要是存储 java 类信息,包括解析得到的方法属性、字段等等。永久代基本不参与垃圾回收。年轻代分为一个 eden 区和两个相同的 survior 区。刚开始创建的对象都放置在 eden 区。这样主要是为了将生命周期短的对象尽量留在年轻代中。当 eden 区申请不到空间时,进行 minorGC,把存活的对象拷贝到 survior。年老代主要存放生命周期比较长的对象,如缓存对象。具体 JVM 垃圾回收过程如下:


1、对象在 Eden 区完成内存分配。2、当 Eden 区满了,在创建对象就会申请不到空间,则触发 minorGC,进行 young(eden 区和 1survivor 区的垃圾回收)。3、在 minorGC 时,Eden 不能被回收的对象呗放入到空的 survior(即 Eden 肯定被清空),另一个 survivor 里不能被 GC 回收的地想也会被放入到这个 survivor,始终保证一个 survivor 是空的。4、当完成第三步的时候、如果发现 survivor 满了,则这些对象呗 copy 到 old 区,或者 survivor 并没有满,但有些对象已经足够 old 了,也被放入到 old 区。当 old 区北放满之后,进行 fullGC。


二六、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。


JVM 内存可以分为堆内存和非堆内存,堆内存给开发人员用的,非堆内存给 JVM 本身用的,用来存放类型信息,即使 GC 时也不会释放空间。


堆内存设置:


-Xms 初始堆内存,默认物理内存 1/64,也是最小分配堆内存,当空余堆内存小于 40%时,会增加到-Xms 的最大限制。


-Xmx 最大堆内存分配,默认物理内存 1/4,当空余堆内存大于 70%时,会减小打-Xms 的最小限制。


非堆内存设置:


-XX:PermSize 非堆内存的初始值,默认物理内存的 1/64,也是最小非堆内存。


-XX:MaxPermSize 非堆内存最大值,默认物理内存的 1/4。


查看堆大小命令为 Runtime.getRuntime().maxMemory()。


二七、jvm 怎样通过参数调整内存大小


本地环境变量中 JVM 参数设置:


new 一个 JAVA_OPTS:


variable name: JAVA_OPTS


variable value: -Xms256M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M


eclipse 中参数设置:在缺省 VM 参数中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m


二八、进程与线程的区别


线程是进程的一个单元,也是进程内的可调度实体。区别就是:1、进程内的线程共享地址空间,进程则自己独立的地址空间。2、进程是资源分配和拥有的单位,同一个进程内的线程共享进程资源。3、线程是处理器调度的基本单位。4、两者均可并发执行。


二九、怎样避免死锁


1. 使用事务时,尽量缩短事务 idea 逻辑处理过程,及早提交或回滚事务


2. 设置死锁的超时参数为合理范围,如 3-10 分钟,若超过时间,自动放弃本次操作,避免进程悬挂。


3. 优化程序,检查并避免死锁现象出现。


4. 对所有的脚本和 sp 都要仔细测试。


5. 所有的 sp 都要有错误处理。


6. 一般不要修改 sql 事务的默认级别。不推荐强行加锁。


三十、垃圾回收算法使用的产品、场景


标记-清除算法:标记阶段,确定所有要回收的对象,并标记,清除阶段则将需要回收的对象清除。


复制算法:把内存分为大小相等的两块,每次使用其中的一块,当垃圾回收时,把存活的对象复制到另一块上,然后把这块内存整个清理掉。两块内存比是 8:1


标记整理算法:把存活的对象往内存的一端移动,然后直接回收边界以外的内存。标记-整理算法提高了内存的利用率,并且它适合在收集对象存活时间较长的老年代。


分代回收算法:根据对象的存活时间把内存分为新生代和老年代,根据各代对象的存活特点,每代采用不同的 GC 算法。新生代用标记-复制算法,老年代用标记-整理算法。


如何配置


三一、实际项目中 JVM 调优


1、JVM 启动参数:调整各代的内存比例和垃圾回收算法,提高吞吐量。


2、改进程序逻辑算法,提高性能


3、自定义封装线程池,解决用户响应时间长的问题。比如设置线程最小数量、最大数量


4、连接池


三二、jdk 并发包的集合介绍


Map 并发包,其实现为 ConcurrentHashMap,它实现了 ConcurrentMap 接口。put 方法为根据计算出的 hash 值去获取 segment 对象。找到 segment 对象后调用该对象的 put 方法完成操作。segment 中的 put 方法则是先加锁,之后判断数组大小,然后觉得是否扩充。然后得到 key 索要放置的位置。


List 并发包,客在高并发环境下使用 CopyOnWriteArrayList 代替 ArrayList。添加元素是利用数组的 copy 功能和加锁机制。并发情况下,CopyOnWriteArrayList 比 ArrayList 略快了些。


set 并发,CopyOnWriteSet 和 CopyOnWriteArrayList 底层实现差不多就是在添加元素时会进行唯一性判断,如果对象数组已经含有重复的元素,不进行增加处理。


queue 并发,并发类是 ArrayBlockingQueue,底层为数组,并对关键的方法入队、出队操作加入了锁队机制。


Atomic 系列类,比如 AtomicInteger 类,通过使用计数器操作时,一般为了避免线程安全问题,在方法上加锁操作。有了并发包下的原子系列类,我们就可以直接使用。


三三、线程之间的通信


主要包括互斥锁、条件变量、读写锁和线程信号灯。


互斥锁:以排他方式防止数据被并发修改。互斥锁两个状态 0 和 1。具体为申请锁、占用锁以防止数据被修改,此时默认阻塞等等,最后释放锁。


条件变量通信机制:原理,条件变量出现时,可以弥补互斥锁的缺陷,有些问题仅仅依靠互斥锁无法解决。但条件变量不能单独使用,必须配合互斥锁一起实现对资源的互斥访问。

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
java架构师常见的基础面试题及答案(一),这个回答让我错失offer