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