进军2022年:java研发岗mybatis一级缓存和二级缓存

进军2022年:java研发岗mybatis一级缓存和二级缓存_第1张图片

一级缓存:Mybatis对缓存提供支持,但是在没有配置的默认情形下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。二级缓存:MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。

1.一级缓存的作用域是SqlSession范围的,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。

进军2022年:java研发岗mybatis一级缓存和二级缓存_第2张图片

2.mybatis是支持普通SQL查询、存储过程和高级映射的优秀持久层框架。它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索,使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs映射成数据库中的记录。看到这里的都是妥妥的铁粉无疑了,底下是我的个人微信找到我的可是有大把源码,学习路线啥的,多的我就不透露,1253431195看大家自己的积极性了啊~

进军2022年:java研发岗mybatis一级缓存和二级缓存_第3张图片

3.MyBatis的缺点:编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此;SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库;框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

进军2022年:java研发岗mybatis一级缓存和二级缓存_第4张图片
Java语言区别于其他计算机语言的最大特点就是面向对象性,也被称为与平台无关的编程语言,java能实现这样的特点,就是因为JVM虚拟机的作用,因此关于JVM的知识点都是需要大家掌握的。下面整理了10道JVM面试题,是在java面试中考察几率最大的题目,一起来学习吧。

1.什么情况下会发生栈内存溢出?

  • 栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。局部变量表又包含基本数据类型,对象引用类型;
  • 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常,方法递归调用产生这种结果;
  • 如果Java虚拟机栈可以动态扩展,并且扩展的动作已经尝试过,但是无法申请到足够的内存去完成扩展,或者在新建立线程的时候没有足够的内存去创建对应的虚拟机栈,那么Java虚拟机将抛出一个OutOfMemory异常;
  • 参数-Xss 去调整JVM栈的大小。

2、介绍JVM内存模型

JVM内存结构如下:

进军2022年:java研发岗mybatis一级缓存和二级缓存_第5张图片

  • 程序计数器:当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有。
  • Java虚拟栈:存放基本数据类型、对象的引用、方法出口等,线程私有。
  • Native方法栈:和虚拟栈相似,只不过它服务于Native方法,线程私有。
  • Java堆:java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的地方,线程共享。
  • 方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。(即永久带),回收目标主要是常量池的回收和类型的卸载,各线程共享。

3.JVM内存新生代中为什么要分为Eden和Survivor?

  • 如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC.老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多,所以需要分为Eden和Survivor;
  • Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代;
  • 设置两个Survivor区最大的好处就是解决了碎片化,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生)。在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

4.JVM的永久代中会发生垃圾回收吗?

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)。

5.什么是类加载器,类加载器有哪些?

实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。主要有以下四种类加载器:

  • 启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被java程序直接引用;
  • 扩展类加载器(extensions class loader):它用来加载java的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载java类;
  • 系统类加载器(system class loader):它根据java应用的类路径(CLASSPATH)来加载Java类。一般来说,Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它;
  • 用户自定义类加载器,通过继承 java.lang.ClassLoader类的方式实现。

阿里巴巴编码规范 基础技能认证 考题分析(考题+答案)_链接:https://pan.baidu.com/s/1CTGGf4IM-mDKU4FO82yAMw
提取码:r7y9

你可能感兴趣的:(java,spring,spring,boot,架构,spring,cloud)