![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试
王佑辉
个人笔记,多谢指正,不喜勿喷
展开
-
【面试】基本数据类型的包装类缓存
(I)Ljava/lang/Integer 方法的描述符,该方法接受一个int类型的参数(由(I)表示)并返回一个java.lang.Integer类型的对象(由 (I)Ljava/lang/Integer;执行此指令时,JVM会从操作数栈顶部弹出一个int值(在这个例子中是10),将其作为参数调用java.lang.Integer.valueOf方法,并将返回的Integer对象推送到操作数栈的顶部。使用Boolean.TRUE和Boolean.FALSE时,得到的是缓存中的对象实例。原创 2024-06-23 20:15:35 · 578 阅读 · 0 评论 -
【面试】什么是字节码指令
1.字节码指令是JVM能够理解和执行的基本指令。2.它由一个字节长度的操作码(Opcode)以及跟随其后的零至多个代表操作所需参数的操作数(Operands)构成。原创 2024-06-10 20:36:26 · 401 阅读 · 0 评论 -
【面试】哪些类型对应有Class的对象?
1.虽然类型变量和泛型类型在运行时会被擦除(type erasure),但它们在某些上下文中(如反射API)仍然有与之关联的 Class 对象或 Type 对象(后者是 Class 的超接口,用于表示更广泛的类型,包括泛型类型)。虽然基本类型本身没有直接的 Class 对象,但你可以使用它们的包装类来获取与它们相关的 Class 对象,或者使用 .TYPE 字段(对于包装类提供的静态字段)来获取与基本类型对应的 Class 对象。1.与类类似,每个定义的接口也有一个与之关联的 Class 对象。原创 2024-06-09 13:37:59 · 328 阅读 · 0 评论 -
【java】JVM前端编译器的局限性
1.前端编译器的主要功能是将Java源代码(.java)文件编译成字节码文件(.class文件),以供加载器进行类型加载。4.AOT编译器的使用也有一些限制,如需要为每个不同硬件和操作系统编译对应的发行包,且降低了Java链接过程的动态性。3.不直接涉及将字节码转换为可在硬件上直接运行的机器码过程,这是由JIT编译器在运行期间负责的。1.前端编译器的主要任务是将符合Java语法规范的Java代码转换为符合JVM规范的字节码文件。1.前端编译器在编译时是静态的,即它根据源代码的内容生成固定的字节码文件。原创 2024-06-09 11:17:19 · 413 阅读 · 0 评论 -
【面试】Java的前端编译器和后端编译器
4.在Java的编译过程中,前端编译器和后端编译器协同工作,共同将Java源代码转换为可执行的机器码。1.代码优化:在生成目标代码之前,对代码进行一系列的优化操作,以提高程序的执行效率和性能。1.在Java的编译过程中,编译器通常被划分为前端编译器和后端编译器,各自负责不同的任务。2.前端编译器主要负责源代码的词法分析、语法分析和语义检查,确保代码的语法正确性和准确性。3.语义检查:在语法分析的基础上,进行更深层次的检查,如类型检查、变量声明检查等。3.输出的目标代码是机器码,可以直接在硬件上执行。原创 2024-06-01 11:07:42 · 448 阅读 · 0 评论 -
【面试】生成class文件的编译器有哪些?
4.对于特定的开发环境和需求,可以考虑使用IDE自带的编译器(Eclipse编译器和Intelli IDEA编译器),以获得更多的特定功能和集成开发环境的优势。3.选择编译器时,一般建议使用官方发布的Oracle JDK或OpenJDK中的默认编译器(javac)进行Java编译。2.IntelliJ IDEA编译器同样可以将Java源代码编译为字节码文件,并提供了强大的代码分析和智能重构功能。2.这些编译器都能够将Java源代码编译为可在JVM上执行的字节码文件,是实现Java跨平台特性的关键。原创 2024-06-01 09:27:24 · 292 阅读 · 0 评论 -
【面试】class文件里面是什么?
2.用于描述类的方法,包括方法名、参数类型、返回类型、访问修饰符以及方法的字节码。class 文件是 Java 平台无关性的关键,因为它们包含了可以在任何支持 JVM 的硬件和操作系统上运行的字节码。1. .class 文件是 Java 编译器编译 Java 源代码文件(.java 文件)后生成的字节码文件。2.这是一个固定值(0xCAFEBABE),用于确定文件是否是一个有效的 Java 类文件。1.这些索引指向常量池中的条目,分别表示类的全限定名、父类的全限定名以及该类实现的接口列表。原创 2024-05-30 21:58:31 · 313 阅读 · 0 评论 -
【面试】字节码文件是跨平台的吗?
2.字节码文件是Java源代码经过Java编译器(javac)编译后生成的中间代码文件,这些包含了Java虚拟机(JVM)指令,而不是特定于某个硬件平台或操作系统的机器码。6.只要安装了相应版本的JVM,就可以在任何支持JVM的操作系统上运行Java字节码文件,而无需重新编译源代码。3.由于JVM是跨平台的,它能够在任何支持JVM的操作系统上执行字节码文件。5.这就是Java语言“一次编写,到处运行”的跨平台特性的基础。1.字节码文件(.class文件)是跨平台的。原创 2024-05-30 21:30:27 · 296 阅读 · 0 评论 -
【面试】什么是Java虚拟机
2.JVM是Java平台无关性的关键,它允许Java程序在任何支持JVM的硬件和操作系统上运行,从而实现“一次编写,到处运行”(Write Once, Run Anywhere)的跨平台特性。3.Java虚拟机是Java程序运行的核心环境,它负责加载、执行和管理Java程序,并提供了跨平台、内存管理、类加载、执行引擎、线程管理、安全性和性能调优等功能。1.Java虚拟机(Java Virtual Machine,简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境。原创 2024-05-30 21:02:10 · 377 阅读 · 0 评论 -
【面试】介绍一下HotSpot虚拟机
2.HotSpot虚拟机占据绝对的市场地位,从jdk1.3到现如今jdk14都是Oracle JDK和OpenJDK中默认的虚拟机。2.该虚拟机来源于Strongtalk虚拟机,而Strongtalk虚拟机中的技术又来源于为支持Self语言设计的Self虚拟机。1.HotSpot虚拟机是一款由Oracle JDK和OpenJDK广泛使用的Java虚拟机(JVM)。(JIT)技术,将常用的部分代码编译为本地(原生)代码,从而提高Java程序的执行性能。等特点,成为了Java领域广泛使用的虚拟机之一。原创 2024-05-30 20:49:04 · 714 阅读 · 0 评论 -
【面试】Java虚拟机的生命周期
可以使用-X系列的JVM参数来配置JVM的内存大小、垃圾回收策略等。3.在JVM终止时,也可以通过设置System.exit()的参数来返回一个状态码,以指示程序是正常退出还是由于某种错误而退出。(Garbage Collection)来自动管理内存,释放不再使用的对象占用的空间。2.如果应用程序请求了外部资源(如文件、数据库连接等),JVM会协调这些资源的访问。5.在终止前,JVM会执行一些清理工作,如关闭打开的文件、数据库连接等。1.Java虚拟机(JVM)的生命周期通常指的是JVM实例从。原创 2024-05-29 22:16:21 · 809 阅读 · 0 评论 -
【面试】谈谈常见的Java虚拟机有哪些
2.特点:GraalVM是一个高性能的运行时环境,支持多种语言,包括Java、JavaScript、Ruby、Python、R等。2.特点:也采用了即时编译技术,通过将字节码编译为本地机器码来提高程序的执行性能。2.特点:Exact VM是一个编译器和解释器混合执行的Java虚拟机,曾在Solaris平台上发布,但后来被其他虚拟机所取代。(Just-In-Time Compilation, JIT)的技术,将字节码实时编译为本地机器码,从而提高程序的执行效率。1.开发商:Oracle公司。原创 2024-05-29 21:19:43 · 400 阅读 · 0 评论 -
【面试】谈谈你对jvm的认识
1.JVM(Java Virtual Machine)是运行所有Java程序的抽象计算机,是Java语言的运行环境。2.它屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在JVM上运行的目标代码(字节码),可以在多种平台上不加修改地运行。3.JVM包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。原创 2024-05-29 21:06:25 · 638 阅读 · 0 评论 -
【面试】什么是Java堆内存溢出?
1.数据库连接、文件句柄等外部资源没有及时关闭,这些资源将会被JVM的垃圾回收器视为有效对象而无法回收,引发内存泄露。3.如果大量使用这样的集合类,并且没有及时清理其中的对象,这些对象将一直存在于堆内存中,导致内存泄露。1.应用程序中创建了大量对象,并且这些对象在短时间内无法被垃圾回收器回收,导致堆内存空间耗尽。2.由于长生命周期的对象持有短生命周期对象的引用,导致短生命周期对象无法被垃圾回收器回收。4.调整JVM的堆内存设置,根据应用程序的需求分配足够的内存空间。原创 2024-05-28 21:52:05 · 908 阅读 · 0 评论 -
【面试】JDK和JVM是什么关系?
3.JDK包含了JRE(Java Runtime Environment),即Java运行环境,以及编译Java源代码的编译器(javac)和其他工具(如javadoc、jdb等)。4.开发人员在开发java应用程序时,需要安装jdk,因为它包含了编写和编译java程序所需的所有内容。4.只要系统安装了JVM,就可以运行Java程序,而无需考虑该程序是在哪种操作系统或硬件平台上编写的。的,因为它将字节码转换成机器码的工作是在运行时动态完成的,而不是在编译时。,JVM的目标是提供一个跨平台的。原创 2024-05-28 21:26:30 · 587 阅读 · 0 评论 -
【面试】Oracle JDK和Open JDK什么关系?
1.Oracle JDK包含了闭源组件,并根据二进制代码许可协议获得许可。在没有商业许可的情况下,2019年1月之后发布的Oracle Java SE 8的公开更新将无法用于商业或生产用途。1.Oracle JDK包含一些特定于Oracle的商业特性或优化,这些特性可能不包含在Open JDK中。1.Oracle JDK是由Oracle公司基于Open JDK源代码开发的商业版本。2.Open JDK是完全开源的,采用了GPL协议,意味着可以自由使用和修改。Oracle JDK统一和稳定。原创 2024-05-28 20:57:30 · 412 阅读 · 0 评论 -
【面试】虚拟机栈面试题
1. 如果只有一个线程才可以操作此数据,则是线程安全的2. 如果有多个线程操作此数据,则此数据是共享数据。不考虑同步机制的话,会存在线程安全问题。3. 在方法里定义的变量,且变量的生命周期仅限于该方法,则该变量是线程安全的4. 如果变量是作为参数传到方法里的,或者方法中定义的变量作为返回值,给到其它方法调用,这两种情况是线程不安全的。原创 2023-11-04 16:32:08 · 255 阅读 · 0 评论 -
【面试】pc寄存器题
4.由于cpu时间片轮限制,多线程在并发执行过程中,任何一个确定的时刻,一个处理器或多核处理器中的一个内核只会执行某个线程中的一条指令,导致经常中断和恢复,每个线程在创建后,都会产生各自的程序计数器和栈帧,程序计数器在各个线程之间互不影响。1.多线程是在特定的时间段内只会执行其中某一个线程的方法,cpu会不停地切换任务,导致任务经常中断和恢复。2.为了能准确地记录各个线程正在执行的当前字节码指令地址,所以为每一个线程分配一个pc寄存器。3.各个线程之间可以进行独立的计算,不会相互干扰。原创 2023-10-09 21:27:54 · 167 阅读 · 0 评论 -
【spring】spring依赖注入的方式
2.控制了对象的外部可见性,不被spring容器托管的对象无法自动注入。3.每个set方法单独注入一个对象,可以灵活控制,可以实现选择性注入。2.注入对象很多的情况下,构造器参数列表会很长,不灵活。1.如@Autowired、@Resource注解。3.对象初始化完成后,即可获得可使用的对象。2.可以确保注入前不依赖spring容器。4.被final修饰的属性,无法赋值。3.不能被检测出是否出现循环依赖。2.通过Setter方法注入。3.通过Field属性注入。1.日常开发中不常见。原创 2023-04-21 22:08:41 · 645 阅读 · 0 评论 -
【多线程】线程通信
17.Conditon中的await()对应Object的wait(),Condition中的signal()对应Object的notify(),Condition中的signalAll()对应Object的notifyAll()。13.await()、signal()、signalAll()是Condition接口中的方法,该接口是在Java 1.5中出现的,它用来替代传统的wait+notify实现线程间的协作,它的使用依赖于 Lock。8.这三个方法都是本地方法,并且被final修饰,无法被重写。原创 2023-03-29 21:45:00 · 374 阅读 · 0 评论 -
【多线程】synchronized和lock的区别
6.synchronized锁可重入、不可中断、不是公平锁;Lock锁可重入、可中断、可公平/不公平,并可以细分读写锁以提高效率。3.synchronized在代码执行完或出现异常时自动释放锁;Lock不会自动释放锁,需要在finally中显示释放锁。1.synchronized是Java关键字,在JVM层面实现加锁和解锁;Lock是一个接口,在代码层面实现加锁和解锁。5.synchronized无法得知是否获取锁成功;2.synchronized可以用在代码块上、方法上;Lock只能写在代码里。原创 2023-03-28 09:49:25 · 105 阅读 · 0 评论 -
【spring】@Transactional注解属性说明
1.该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚,与rollbackForClassName相反。1.该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚,与rollbackFor相反。1.该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。1. 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。2.事务隔离级别介绍。原创 2023-03-27 22:45:21 · 857 阅读 · 1 评论 -
【mysql】使用索引注意事项
5.索引中不会包含有null的值,组合索引如果某一列含有null值,这列对组合索引是无效的,索引列尽量不要让字段的默认值为null。4.如果select中某个字段不在索引中,可以将该列加入到组合索引中,避免二次回表查询。7.like 'value%'可以使用到索引,但like '%value%'会全表扫描。6.查询条件左右两侧类型不匹配会发生隐式转换,可能会导致索引失效。1.不在列上使用函数或运算,会导致索引失效而进行全表扫描。=、in等没有顺序的操作符,会导致索引失效。原创 2023-03-26 21:33:51 · 47 阅读 · 0 评论 -
【mysql】数据库三范式
3.第三范式:先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键)。例如存在一个部门信息表,其中每个部门有部门编号、部门名称、部门简介等信息,员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。2.第二范式:满足第一范式后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情。原创 2023-03-26 21:08:32 · 54 阅读 · 0 评论 -
【mysql】性能优化
3.show profiles工具使用,查看sql语句当前会话中sql资源消耗情况,io开销、cpu开销、内存开销等。2.读写分离设计,读多写少的场景中通过读写分离的方案,可以避免读写冲突导致的性能问题。4.热点数据可以引入更为高效的缓存数据库,例如redis、mongoDB等。2.sql执行计划分析,使用关键字explain查看当前sql的执行计划。1.修改my.cnf中默认配置,例如修改最大连接数。3.提高硬盘的读写速度,使用专用的固态硬盘。1.慢sql的定位与排查,慢查询日志分析。原创 2023-03-26 20:56:36 · 599 阅读 · 0 评论 -
【mysql】索引设计原则
在修改索引列的内容时,索引会进行更新甚至重构,索引列越多,更新重构时间越长。只保持需要的索引有利于查询即可,不需要建立多余列的索引。9.尽量扩展索引,不新建索引,例如a字段有索引,加a,b字段的索引时,可以修改原来a字段的索引为联合索引。4.使用短索引,对长字符串列进行索引,可以指定一个前缀长度,可以节省大量索引空间。8.不能有效区分数据的列不创建索引,例如性别,区分度太低,加了索引也没有多大作用。2.适合索引的列是在where子句中的列,或者连接子句中指定的列。7.更新频繁的字段不适合创建索引。原创 2023-03-26 20:40:40 · 297 阅读 · 0 评论 -
【mysql】mysql的各种索引
前缀索引可以建立的类型为char、varchar、binary、varbinary的列上,减少索引占用的存储空间,能提升索引查询效率,mysql无法使用前缀索引做order by和group by。如果存在主键,主键索引就是聚集索引,不存在主键,使用第一个唯一索引作为聚集索引,没有合适的唯一索引,innodb会生成一个rowid作为隐藏的聚集索引。1.主键索引:建立在主键上的索引,一张表只能有一个主键索引,索引列值不能为空,通常在创建表是一起创建。原创 2023-03-26 20:16:19 · 234 阅读 · 0 评论 -
【redis】redis缓存击穿
1.一个被高并发访问且缓存重建业务比较复杂的key过期了,会造成大量的请求访问数据库2.key失效,线程A获取key缓存未命中,去查数据库,拿到数据,构建缓存,构建时间长,还没来得及将数据写入到缓存中,线程B获取key缓存也未命中,去查数据库,拿到数据,构建缓存,构建时间长,缓存还未写入。大量的并发都会去查数据库,给数据库造成压力。原创 2023-03-25 15:55:36 · 296 阅读 · 0 评论 -
【redis】redis缓存雪崩
1.同一时间大量的key同时失效或者redis宕机,大量请求直接访问数据库。原创 2023-03-25 15:07:02 · 154 阅读 · 0 评论 -
【redis】redis缓存穿透
1.客户端请求的数据在数据库中没有,这样缓存永远不会生效,所有客户端请求都会访问数据库。原创 2023-03-25 14:44:16 · 468 阅读 · 0 评论 -
【redis】redis淘汰策略
4.volatile-lfu:会使用lfu算法筛选设置了过期时间的键值对删除(Least Frequently Used的缩写,即最不经常使用)3.volatile-lru:会使用lru算法筛选设置了过期时间的键值对删除(Least Recently Used的缩写,即最近最少使用)1.volatile-ttl:在筛选时,会针对设置了过期时间的键对值,根据过期时间的先后进行删除,越早过期的越先被删除。3.主动清理策略在redis4.0之前一共实现了6种内存淘汰策略,在4.0之后,增加了2种,总共8种。原创 2023-03-25 08:42:30 · 767 阅读 · 0 评论 -
【redis】key过期了为什么不释放内存
3.定时删除:由于惰性删除策略无法保证冷数据被及时删掉,redis会定期(默认每100ms)主动淘汰一批已过期的key,所以可能会出现部分key已经过期但还没有被清理的情况,导致内存没有释放。2.惰性删除:当读\写一个已经过期的key时,会触发惰性删除策略,判断key是否过期,如果过期了直接删除这个key。1.redis对过期的key的处理一般有惰性删除和定时删除两种策略。原创 2023-03-25 08:21:50 · 189 阅读 · 0 评论 -
【redis】redis单线程为什么能这么快
4.高效的存储结构:全局hash表、跳表、压缩列表、链表等。1.redis执行的命令是单线程执行的,没有线程切换开销。3.基于IO多路复用机制提升了redis的i/o利用率。2.redis命令执行是基于内存的。原创 2023-03-25 08:10:07 · 48 阅读 · 0 评论 -
【spring】spring事务的隔离级别
1.脏读2.不可重复读3. 幻读4.是并发事务产生的问题。原创 2023-03-21 21:28:18 · 992 阅读 · 1 评论 -
【spring】spring事务的传播行为
Transactional(propagation=Propagation.REQUIRES_NEW)适用内部事务和外部事务不存在业务关联的情况,例如日志。@Transactional(propagation=Propagation.MANDATORY)不常用。@Transactional(propagation=Propagation.NEVER)不常用。1.事务的传播特性是当一个事务方法被另一个事务方法调用时,这个事务方法该如何进行。required(默认)不用外部事务,开启新事务。原创 2023-03-19 22:57:13 · 124 阅读 · 0 评论 -
【spring】spring的aop是在哪里创建的动态代理
2.循环依赖的Bean在bean属性注入时存在的循环依赖的情况下,会为循环依赖的Bean通过MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition创建aop。1.正常的Bean会在bean的生命周期的初始化后,通过BeanPostProcessor.postProcessAfterInitailization创建aop的动态代理。原创 2023-03-19 22:01:07 · 124 阅读 · 0 评论 -
【spring】jdk动态代理和cglib动态代理的区别
6.性能上:在老版的jdk,jdk代理生成的类速度快,通过反射调用慢,cglib是jdk代理速度的10倍左右,jdk在版本每次升级都会有很大的性能提升,cglib停滞不前,jdk7 8的动态代理性能在1万次实验中比cglib要快20%左右。5.jdk动态代理如果目标类未实现接口则无法代理,cglib是通过继承的方式来动态代理,若目标类被final关键字修饰,则无法使用cglib做动态代理。1.jdk动态代理只提供实现接口的目标类代理,不支持没有实现接口的目标类的代理。3.从限制角度讨论区别。原创 2023-03-19 20:07:58 · 3603 阅读 · 2 评论 -
【spring】spring通知有哪些类型
7.spring5.2.7之前的执行顺序:前置->方法->后置->返回,前置->方法->后置->异常,spring5.2.7之后的执行顺序:前置->方法->返回->后置,前置->方法->异常->后置。6.环绕通知(around):通知包裹被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。3. 后置通知(after):在目标方法完成之后调用通知,不关心方法的输出是什么。2.前置通知(before):在目标方法被调用之前调用通知功能。1.spring切面有5种类型的通知。原创 2023-03-19 16:39:39 · 311 阅读 · 0 评论 -
【spring】aop的名词
3. 通知(advice):需要增加到业务方法中的公共代码,通知有很多类型分别可以在需要增加的业务方法不同位置进行执行(前置通知、后置通知、异常通知、返回通知、环绕通知)4.切点(pointcut):决定哪些方法需要增强、哪些不需要增强,结合切点表达式进行实现。6.织入(weaving):aop用的织入方式是动态代理,为目标对象创建动态代理的过程。5.目标对象(target object):增强的对象。2.连接点(join point):被增强的业务方法。1.切面(aspect):切面类,管理切点和通知。原创 2023-03-19 16:13:22 · 75 阅读 · 0 评论 -
【spring】aop是什么
2.用于将与业务无关,对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,该模块被命名为切面Aspect。1.全称是Aspect Oriented Programming,称为切面编程。3. 减少系统中的重复代码,降低了模块间的耦合度,提高了系统的可维护性。4.可用于权限认证、日志记录、事务处理等。原创 2023-03-19 15:53:22 · 36 阅读 · 0 评论