1. JVM的加载过程?

加载->链接(验证->准备->解析)->初始化->使用->卸载加载:将类的.class文件中的二进制字节码加载到内存中,将其放在运行时数据区的方法区, 然后在堆类创建一个java.lang.class对象,用来封装类在方法区内的数据结构,作为方法区类数据的访问入口. 链接:将java类的二进制代码合并到jvm的运行状态之中的过程. 验证:确保加载的信息符合jvm规范,没有安全问题. 准备:为类的静态变量分配内存,并赋初始值,这些内存将在方法区中分配. 解析:虚拟机常量池的符号引用替换为字节引用的过程. 初始化:初始化阶段是执行类构造器方法的过程.对类的变量进行赋值.

  1. JVM的内存模型?

方法区(线程共享):被所有方法线程共享的内存区域,用于存储被虚拟机加载的类信息,常量,静态变量等.堆(线程共享):被所有方法线程共享的一块内存区域,在虚拟机启动时创建,用于存放对象实例和数组.堆是垃圾收集器管理的主要区域. 如果在堆中没有内存可分配时,并且堆也无法扩展时,将会抛出OutOfMemoryError异常。 虚拟机栈:每个方法在执行时,会创建一个栈帧,存储了局部变量表,操作栈,动态链接,方法返回地址.每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈。 通常所说的栈,一般是指在虚拟机栈中的局部变量部分。局部变量所需内存在编译期间完成分配, 如果线程请求的栈深度大于虚拟机所允许的深度,则StackOverflowError。 如果虚拟机栈可以动态扩展,扩展到无法申请足够的内存,则OutOfMemoryError。 本地方法栈:和虚拟机栈类似,主要为虚拟机使用到的Native方法服务。也会抛出StackOverflowError 和OutOfMemoryError 程序计数器:程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.

  1. JVM的垃圾回收机制?
  2. JVM如何判定对象存活(垃圾回收算法)?
  3. 线程有那几种创建方式?

一种是继承Thread类,一种是实现Runnable接口. 一种是实现Callable接口. 使用Executor框架来创建线程池

  1. 线程池的基本配置项有哪几个?

最大线程数,核心线程数,最大空闲时间,缓存队列corePoolSize(核心线程数):表示常驻核心线程数量 maximumPoolSize(最大线程数):表示线程池中能同时执行的最大线程数量。这个值必须大于等于corePoolSize,如果这两个值相等,那就是固定大小的线程池 keepAliveTime(最大空闲时间):表示线程池中除常驻核心线程之外的其他线程的空闲时间,如果超过这个时间就会销毁。 queue(缓存队列):缓存队列,当请求的线程数大于corePoolSize的时候,线程会进入队列进行阻塞。当这个队列达到上限之后,线程池会创建新的线程,直到maximumPoolSize大小位置。 RejectedExcutionHandler(拒绝策略):当queue满了之后,并行活动的线程数大于maximunPoolSize的时候,线程池通过改策略处理请求。 其中RejectedExcutionHandler默认包含四种策略: AbortPolicy(默认) 丢弃这个任务并抛出 RejectedExecutionException异常 DiscardPolicy 丢弃掉这个任务,但是不抛出异常 DiscardOldestPolicy 抛弃掉在队列中等待最久的任务,然后把当前任务加入队列中 CallerRunsPolicy 调用任务的run()方法绕过线程池直接执行

  1. synchronized和Lock的区别?

synchronized修饰的代码在执行异常时,jdk会自动释放线程占有的锁,不需要程序员去控制释放锁Lock发生异常时,如果程序没有通过unLock()去释放锁,则很可能造成死锁现象,因此Lock一般都是在finally块中释放锁;

  1. 线程的生命周期?

创建(new)->(start)就绪(Runnable)->(run)运行(Running)->结束(Dead) 阻塞(wait,sleep,join,yield,synchronized)

  1. sleep和wait的区别?

sleep 不会释放锁 是线程Thread类的方法wait 会释放锁,进入等待池中 是Object类中的发法 wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程

  1. hashmap和hashtable和hashset的区别?

hashmap key,value可以为null 线程不安全hashtable key,value不可以为null 线程安全 hashset HashSet不是key value结构,仅仅是存储不重复的元素,相当于简化版的HashMap,只是包含HashMap中的key 线程不安全

  1. hashmap的底层结构?

hashmap底层是由数组,链表组成,java8增加了红黑树通过调用hashcode()的方法,获得hash值,通过获取hash值来计算下标值,确定元素在数组中存放的位置,当出现相同的hash值时,就产生了hash冲突的情况,这个时候调用equer方法 如果值相等,就替换,不相等,就存储在hash链表上,当链表长度大于等于8时,就会转成红黑树的结构.

  1. ArryList和hashmap的扩容机制?

ArryList: 底层是数组组成,如果创建的时候没有设置初始值,当调用add()方法时,会判断初始值是否为空,为空的话,会进行扩容,默认的扩容大小为10, 扩容通过grow()方法进行扩容,默认扩容至原来大小的1.5倍,然后创建新的数组,把旧数据数据复制到新数组中 hashmap: 底层是数组,链表,红黑树,如果创建的时候没有设置初始值,就会进行一次扩容,加载因子默认为0.75,默认初始数组长度是16. 每次put数据进去的时候,就会判断是否需要扩容,需要就调用resize()方法进行扩容.扩容的原理是将原有的长度扩大2倍,然后创建新的数组,把旧数据数据复制到新数组中.

  1. mq如何保证消息不丢失?

生产者:当生产者发送消息到服务端,服务端接到消息后,告诉生产者收到消息的情况.服务端:服务端收到消息,会先通知生产者,然后再异步写入磁盘,这样也有风险,可以进行同步复制,复制成功后,通知生产者. 消费者:消费者收到消息后,会通知服务端是重发或者是消费掉.

  1. mq如何保证幂等性?

通过收到消息中的业务字段,去查询数据库,来保障数据的幂等性.

  1. redis如何实现数据的不丢失?

RDB:通过二进制的方式,保存在磁盘AOF:通过日志的方式,追加指令

  1. redis的基本数据类型?

string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)

  1. mysql的隔离级别有哪些?

已读未提交 脏读,不可重复读,幻读已读已提交 不可重复读,幻读 可重复读 幻读 可串行

  1. mysql的索引类型?

普通索引,主键索引,组合索引,空间索引,全文索引

  1. mysql如何优化sql?

大体思路,避免索引失效

  1. springBoot有哪些核心注解?

@springbootApplication@Configuration @ComponentScan

  1. springCloud有哪些组件?

eruka,fegin,gateway

  1. springBean的生命周期?

首先是bean对象的实例化,然后是属性赋值,通过population接口进行,然后通过aware接口来获取容器的内部方法,然后初始后bean对象,初始化之前有前置处理器,初始化后有后置处理器,然后执行,最后是销毁

  1. @Resource和@Autowired的区别?

@Autowired byTyep@Resource byName

  1. 谈谈volatile关键字?

volatile是Java虚拟机提供的一个轻量级的同步机制它有三大特性: 1).保证可见性 线程修改数据在本地内存中,加上volatile关键字,会将修改数据,同步到主内存中,其他线程访问的主内存中的数据是修改后的数据. 2).不保证原子性 线程A修改i的值,而线程b也修改了i的值,同步到主内存中去了,然后A再同步到主内存中去,导致主内存中的值被A线程的值覆盖. 3).禁止指令重排序

  1. redis缓存出现缓存击穿,缓存雪崩,缓存穿透该怎么办?

缓存击穿:缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。可以将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。 缓存雪崩:缓存大面积失效或者全部失效,请求直接访问数据库,导致数据库扛不住并发,而挂掉. 可以增加从机,在主机失效是,切换到丛机,防止缓存失效.设置缓存失效时间,最好不要设置在同一时间. 缓存穿透:所有的请求缓存中都查不到,请求全部落到了数据库中去查,数据库中也查不到. 每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。 然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。 使用布隆过滤器

  1. 讲一下mysql的引擎?
  2. InnoDB InnoDB支持事务,支持外键,支持行锁,写入数据时操作快,MySQL5.6版本以上才支持全文索引 默认索引是B+tree
  3. Myisam Myisam不支持事务。不支持外键,支持表锁,支持全文索引,读取数据快. 默认索引是B+tree
  4. Memory Memory所有的数据都保留在内存中,不需要进行磁盘的IO所以读取的速度很快,但是一旦关机的话表的结构会保留但是数据就会丢失,表支持Hash索引,因此查找速度很快.
  5. springboot启动过程?
  6. java为什么引入泛型?

泛型要实现的目标就是在编译的时候就能找出bugs,而不是在运行时才发现错误。在编译的时候就能找出问题能帮助我们节省大量的时间,因为在编译时bugs更容易找出(编译器帮我们找出)也更容易修复。重要的是泛型是属于编译期的概念。

  1. 将一下什么是压缩表,什么是跳跃表.

压缩列表:是有节点内容和节点长度组成,每个节点长度对应了节点内容,这样节约了空间跳跃表:链表多级索引的结构,就是跳跃表

  1. linux常用命令

1).xz压缩文件 xz -z filename2).xz解压文件 xz -d filename 3).tar格式:压缩 tar -cvf filename 4).tar格式:解压 tar -xvf filename 5)grep tail cat head sed 6) ls -lrt cd pwd

  1. spring事务失效的几种情况?
  2. 数据库的3大范式?

1.第一范式(确保每列保持原子性)第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。 2.第二范式(确保表中的每列都和主键相关) 第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。 3.第三范式(确保每列都和主键列直接相关,而不是间接相关) 第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

  1. java设计六大原则?
  2. 依赖倒置原则-Dependency Inversion Principle (DIP)
  3. 里氏替换原则-Liskov Substitution Principle (LSP)
  4. 接口分隔原则-Interface Segregation Principle (ISP)
  5. 单一职责原则-Single Responsibility Principle (SRP)
  6. 开闭原则-The Open-Closed Principle (OCP)
  7. 迪米特法则(最少知道原则-Demeter Principle(DP)
  8. restful和http区别
  9. rpc框架和http请求区别
  10. 对象何时分配在栈上: 逃逸分析,for循环内分配小对象
  11. update数据加锁的过程(走索引或者不走索引)
  12. controller是否线程安全:设计成一个无状态
  13. spring事务如何实现,如何开启和关闭,传播机制

40 包很大,想要加快启动速度,如何解决

  1. java是传值调用还是引用调用
  2. 间隙锁解决幻读

# 聊一聊悟空编辑器 #    JAVA面试问题总结_数组