记录一下第一次面试

89 阅读6分钟

前言

本文章记录本人第一次面试的问题和收获,更偏向于个人笔记,如有问题,敬请指正。

谈谈你对Spring事务的理解

首先,Spring对事务是否支持其实取决于数据库的引擎是否支持,比如说MySQL的innodb引擎就支持事务,而MySQL的myisam引擎就不支持。

其次,Spring的事务有两种,一种是编程式事务,另一种是声明式事务,一般在项目中使用声明式事务居多。 比如一个方法中用到了删除或更新数据库数据的方法就可以加上@Transactional注解。

Spring框架中和事务管理最相关的有三个接口

  • PlatformTransactionManager:这是Spring中所有事务管理器的顶级接口。它定义了执行事务管理操作的标准方法,包括开始、提交和回滚事务等。不同的事务管理器(如DataSourceTransactionManager、JpaTransactionManager等)都实现了这个接口。
  • TransactionDefinition:这个接口定义了事务的属性,例如事务的传播行为、隔离级别、超时时间以及是否只读等。在进行事务管理时,通过TransactionDefinition可以明确指定事务的属性,确保事务行为符合业务需求。
  • TransactionStatus:这个接口代表了当前事务的状态。在使用编程式事务管理或者在事务方法中获取事务状态时,可以通过TransactionStatus对象来控制事务的执行,并且可以根据执行结果来决定是提交事务还是回滚事务。

[扩展]

  1. Spring事务的传播行为
  2. Spring事务什么情况下会失效

谈谈你对Spring IOC的理解

首先,Spring IOC 全称控制反转,顾名思义就是将创建对象等控制权交给IOC容器。在传统Java程序开发中每次创建对象都需要用new关键字来创建,这会导致对象之间耦合度较高,而这种设计思想可以让程序中的对象和对象之间松耦合,符合软件开发当中高内聚低耦合的思想。当我们需要使用某个类或方法时,只需要去IOC容器中获取即可。

谈一下MySQL中的锁

(这个问题感觉问的有点泛哈)

MySQL中的锁有很多种,

  • 按锁粒度分可以分为:行锁、表锁、页锁等
  • 按思想分可以分为:乐观锁和悲观锁
  • 按属性分可以分为:共享锁和排他锁

比如说 共享锁的话一个事务读取数据的时候其他事务也可以获得共享锁读数据,但是不能获得排他锁,而且不能对数据进行修改, 排他锁的话就只有一个事务可以对数据进行删除或修改,其他事务只能等待锁释放

说一下JVM的内存模型

JVM的内存模型中线程不共享的有程序计数器、Java虚拟机栈、本地方法栈,线程共享的有方法区、堆。

其中程序计数器记录当前程序执行的字节码地址,这块块区域不会出现内存溢出。

Java虚拟机栈和本地方法栈都是采用栈的数据结构保存方法调用中的基本数据,比如局部变量表、操作数栈以及帧数据。每一个方法的调用都会使用一个栈帧来保存。这块区域可能出现内存溢出。

堆中存放的是创建出来的对象,这块区域最容易出现内存溢出。

而对于方法区来说,在JDK6的时候他是存放在堆中的,叫做永久代,其中存放了字符串常量池和类的元信息;在JDK7的时候,字符串常量池被放到堆中, 而方法区还在堆中;在JDK8时,方法区从堆中移除,永久代就不存在了,方法区的名字叫做元空间,他是直接内存中的一块区域。

Git命令

当时问了什么和什么的区别,没太听清,反正我是不会,直接说平时一个人开发,除了add这些常用命令其他用的不多。

说一些Linux的常用命令

问这个可能是看到我简历上写了一下吧。

如何解决jar包冲突

项目中确实遇到过,但是每次就上网搜一下版本问题,没十分关注,乱七八糟的说了一堆,结果面试官说没用过Maven Helper吗?当时没啥印象,后面一搜,我idea插件都装上了。。。

如何定位OOM问题

知道内存溢出,但是不知道OOM是什么……

Java应用出现内存溢出(Out of Memory,OOM)问题,可以通过

  1. 日志和堆转储分析

    • 查看应用程序的日志文件,查找是否有内存溢出的异常信息。通常会有类似“java.lang.OutOfMemoryError”的报错信息。
    • 如果应用程序配置了生成堆转储文件(Heap Dump),可以分析堆转储文件,了解内存中的对象分布情况,找出内存占用较多的对象类型或者具体的对象实例。
  1. 监控工具分析

    • 使用监控工具(如阿里的Arthas等)对应用程序进行实时监控,查看内存使用情况、堆内存的对象分布情况、内存泄漏等信息。

服务器出现错误如何定位

这要是我没有自己部署过项目真是一点都编不出来。

可以通过一些Linux命令查看服务器的磁盘空间、CPU和内存是否存在溢出情况,其次可以看Java程序的日志文件以确定进一步问题,比如内存溢出等,还可以检查数据库,看看是否存在慢SQL或死锁等情况,另外可以检查Redis的内存等因素。

具体可看小峯写的文章:线上故障如何快速排查?来看这套技巧大全-阿里云开发者社区 (aliyun.com)

总结

除这些问题之外,还有每个面试都有的自我介绍,觉得自己性格是怎样的等等。

第一次面试,还是在没准备的情况下(我本来以为语音沟通只是简单了解一下情况先,因为我说了只是暑期实习,而且他也说了是线下面试),虽然回答的不好,但是收获还是挺多的。面试除了会问一些八股文之类的,更多还是会问项目开发中会遇到的问题,以及如何解决,所以对于没有部署过项目的同学建议还是弄一个云服务器试一下,为什么说弄不是买呢,因为阿里云有学生优惠。