Java开发面试题:Java中的异常分为什么?解释ARP协议。什么情况下对象直接被分配到老年代?java中一个对象的结构有哪些?mysql的主键生成策略有哪些?springboot如何使用/开启事务?

Java中的异常分为什么?

在这里插入图片描述
以下回答背熟,大概用时1min。

Java中的异常的定义是一种程序运行过程中出现的意外情况,导致程序无法正常执行,都继承自Throwable类。其中又分为Error和Exception。 Error表示的是JVM内部的错误,程序不能处理的。
Exception指的是程序本身的异常,又分为非受检异常(RuntimeException)和受检异常(IOException)。受检是指编译器对这种异常的检查,要求程序员必须在代码中显式地处理这种异常,否则会编译错误。所以非受检异常编译器不强制要求处理,受检异常编译器强制要求处理。

解释一下ARP协议

以下回答背熟,大概用时1min。

ARP是一种网络协议,用于将IP地址映射到MAC地址。
当源设备需要发送数据包给目标设备时,源设备首先查询自己的ARP缓存,看是否已经有目标设备的IP地址和对应的MAC地址的映射。如果缓存中不存在映射关系,源设备就会发送一个ARP请求广播报文到局域网中,请求目标设备回应自己的MAC地址。目标设备收到请求后,会将自己的MAC地址回应给源设备。源设备收到回应后,将目标设备的IP地址和MAC地址映射关系存储在ARP缓存中,以便以后的通信使用。

什么情况下对象直接被分配到老年代?

  • 大对象:如果要分配的对象大小超过了虚拟机所设定的阈值,则该对象会被直接分配到老年代。

  • 长期存活的对象:如果对象经过多次垃圾回收后仍然存活并且没有被回收,那么它会被直接分配到老年代。

  • 空间分配担保:如果新生代的Eden空间不足以存放所有存货的对象,而且已经经过了新生代的垃圾收集的条件,那么将会通过一种机制将存活的对象提前转移到老年代,从而避免OutOfMemoryError发生。

java中一个对象的结构有哪些?

在Java中,一个对象的结构主要包括以下几个部分:
对象头(Object Header):存储对象的元数据,包括哈希码、GC标记信息、锁状态等。
实例数据(Instance Data):存储对象的实例变量(非静态变量)的值。
对齐填充(Alignment Padding):由于虚拟机对内存的分配是以8字节为单位的,为了保证对象的起始地址是8字节的倍数,可能需要填充一些字节。

mysql的主键生成策略有哪些?

在MySQL中,主键的生成策略可以使用以下几种方式:

  • 自增整数:使用AUTO_INCREMENT属性,数据库自动为每个插入的行生成一个唯一的整数值,可用于作为主键。
  • UUID:通过数据库函数或应用程序生成一个全局唯一的标识符作为主键。
  • 哈希值:使用某种哈希算法(如MD5、SHA1)将主键生成为固定长度的字符串或数字。
  • 组合键:由多个列组合而成的主键,保证这些列的组合是唯一的。
  • 序列:mysql8.0中引入了序列功能,类似oracle数据库中的序列生成器。

springboot如何使用/开启事务?

第一种方法是通过注解来使用事务。

首先,在配置类或者Spring Boot的启动类上添加@EnableTransactionManagement注解,启用事务管理。其次,在需要开启事务的方法上,添加@Transactional注解,即可将该方法放在一个事务内执行。

第二种是使用编程式事务管理。
首先确保在配置文件配置好数据源和事务管理器。然后自写一个TransactionTemplate类,在该类doSomethingInTransaction()方法中,重写doInTransaction()方法实现具体事务管理逻辑。

为什么使用JWT而不使用session?

  • 无状态和可扩展性:JWT是无状态的,所有的认证信息都被编码在令牌中。相比于Session基于服务器存储的方式,JWT令牌不需要在服务器上存储任何状态信息,服务器可以很容易地进行水平扩展,适用于分布式系统。

  • 跨域支持:由于JWT令牌是以明文形式传递,因此易于在前后端分离的架构中进行跨域请求,不受同源策略的限制。

  • 轻量和性能优势:JWT令牌是一串基于Base64编码的字符串,在大小和传输上相较于Session更轻量级。与Session相比,JWT不需要频繁的与数据库进行交互验证,减少了网络传输和服务器的负担。

ThreadLocal的原理是什么?

ThreadLocal的实现原理是通过在每个线程中创建一个独立的变量副本来实现的。当一个线程访问ThreadLocal变量时,它实际上访问的是自己的变量副本。这样就避免了多个线程之间的数据竞争问题。

tomcat支持的默认并发数是多少?

150

新生代为什么要用两个survivor区/为什么要采用复制算法?

避免内存碎片:复制算法采用连续的内存空间来存储对象,这样可以避免内存碎片的产生。在新生代的Eden区中,所有的对象都被紧凑地分配,而不会产生大的空洞。当进行复制时,存活对象会被复制到另一个连续的Survivor区中,原来的区域可以整理并使用,避免了内存碎片的问题。

高效的回收方式:复制算法的清理操作相对简单且效率高。每次垃圾回收时,只需要扫描Eden区和一个Survivor区,将存活对象复制到另一个Survivor区中,然后清理掉原来的区域。复制算法具有线性的时间复杂度和低延迟,适合于新生代中对象的特点。
尽管复制算法需要额外的空间来存储对象的副本,但由于新生代中的对象通常较小,内存分配速度较快,因此这种额外的空间开销可以接受。同时,复制算法可以实现高效的内存回收,减少了垃圾回收的时间和成本,对于新生代中的对象生命周期较短的场景具有优势。

static修饰的变量储存在哪?final修饰的变量储存在哪?static final修饰的变量储存在哪?

static修饰的变量储存在类的静态存储区域,该变量在类加载的过程中被初始化,并且在整个程序运行过程中只有一份拷贝。无论类被实例化多少次,static修饰的变量都只有一份。
final修饰的变量储存在栈区或者堆区,具体取决于该变量的类型和所在的上下文。基本类型的final变量通常储存在栈区,而引用类型的final变量则储存在堆区。final变量在声明时进行初始化后,其值不能再被修改。
static final修饰的变量储存在类的静态存储区域,和static修饰的变量一样,只有一份拷贝,在类加载时被初始化。同时,final修饰的变量不能再被修改。static final变量通常用作常量,命名时通常采用全大写字母的命名规范,表示其值固定不变。

创建一个对象时是先创建它的属性还是先创建它的方法?是先创建它的父类还是它的子类?

先属性后方法。先父类后子类。

如何通过优化接口来增大tomcat并发量?

使用异步请求:可以使用Servlet 3.0提供的异步请求处理机制来优化接口。通过将一些耗时的操作设置为异步任务,可以释放Tomcat线程池的资源,提高并发处理能力。

减少锁的使用:在接口设计中,应尽量减少对共享资源的锁使用,避免造成线程的等待和阻塞。可以通过细粒度的锁设计、使用非阻塞算法等方式来提高并发性能。

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸡鸭扣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值