计算机基础知识复习8.9

什么是零拷贝

是一种内存映射文件的方法,即将一个文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。就是内核缓冲区和应用缓冲区共享,从而减少了从读缓冲区到用户缓冲区的一次CPU拷贝

String StringBuilder StringBuffer使用

String是不可变的,StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,不过没有使用final和private关键字修饰。

String是线程安全的,stringbuffer加了锁是线程安全的,stringbuilder不是线程安全的

每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向String对象。StringBuffer每次都对自己本身进行操作,不会生成新的对象。

缓存和数据库一致性如何保证

针对先删除缓存再更新数据库的方案出现的缓存不一致问题:可以使用延迟双删,即删除缓存,更新数据库,睡眠一会再删除缓存

针对先更新数据库再删除缓存的方案出现的不一致,可以使用消息队列重试机制,即将删除缓存的操作加入到消息队列,由消费者来操作数据。使用canal中间件订阅mysqlBinLog来操作缓存,

Redis的RDB和AOF日志

如果Redis每次执行一条写操作命令时,就把该命令以追加的方式写入到一个文件里,然后重启Redis的时候,先去读区这个文件里的命令,并且执行它,相当于恢复缓存数据

AOF持久化功能默认不开启,需要修改redis.conf配置文件参数

appendonly yes
appendfilename "appendonly.aof"

Redis提供save和bgsave两个命令来生成RDB文件,区别在于是否在主线程里执行

执行save 命令就会在主线程生成RDB文件,由于和执行操作命令在同一线程,所以如果写入RDB文件的时间太长,会阻塞主线程

执行了bgsave命令,会创建一个子进程来生成RDB文件,这样可以避免主线程的阻塞。Redis快照时全量快照,每次执行快照,都是把内存中的所有数据都记录到磁盘中

HashSet TreeSet LinkedHashset区别

都能保证元素唯一,并且不是线程安全的。HashSet底层数据结构是哈希表基于HashMap实现,LinkedHashSet的底层数据结构是链表和哈希表,元素的插入和取出顺序满足fifo,TreeSet底层是红黑树,元素是有序的。

重载和重写区别

重载发生在同一个类中,方法名相同的情况下,参数类型,参数个数,顺序不同

重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写

mybatis一级缓存和二级缓存

一级缓存:sqlSession级别的缓存,缓存的数据只在sqlSession内有效

二级缓存:mapper级别的缓存,同一个nameSpace公用这一个缓存,所以对sqlSession是共享的,二级缓存需要手动开启

equals 和 == 的区别

对于基本数据类型来说,==比较的是值

对于引用数据类型来说,==比较的是对象的内存地址

JVM的堆栈分别都放了内容

堆内存是虚拟机所管理的内存中最大的一块,Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此时内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存

每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的java方法调用,是线程私有的。每个方法执行,就伴随着入栈,栈中保存着方法的局部变量,部分结果,并参与方法的调用和返回,执行结束后就会出栈

哪些可以作为GC Roots对象

虚拟机栈中引用的对象

方法区中类静态属性引用的对象

方法区中常量引用的对象

本地方法栈中JNI引用的对象

你可能感兴趣的:(计算机基础知识,java,开发语言,后端,笔记,jvm)