间接性踌躇满志,持续性混吃等死。把内容写出来,每天完成一点。

267 阅读5分钟

1.JVM内存模型,GC机制和原理?

程序计数器:是一块小的内存空间。用来存储程序走到哪了(执行字节码的行号指示器)。线程私有,每个线程拥有自己的程序计数器。如果是执行java文件,此时记录的是执行字节码指令的地址,如果是native方法,计数器的值为空。这里是唯一不会出现OOM的地区。
Java虚拟机栈:里面由一个个栈帧组成,栈帧的内部结构包含:局部变量表,动态链接,方法出口,操作栈
堆区:堆里面是javaGC的主要地区,用来存储Java对象。里面分为:新生代(Eden区,S0,S1区占有大小8:1:1)(堆的1/3)mintorGC,老年代FullGC(堆的2/3)。新生代对象被创建放到Eden区,Eden满了之后,经过minotorGC(线程底层会从方法区里找到所有的静态变量,从栈中找到所有的局部变量,从GCROOT出发,找到所有引用对象,对引用的所有对象打上非垃圾的标签。最后复制到survior区,清空Edean区)之后,放到S0区,对象每经历1次,分代年龄+1(存储在对象头中,下图),当Eden又满了之后,再次触发mintorGC,这次对新生代的Eden,和S0都进行GCroot根找所有引用对象,最后复制非垃圾对象到S1,清除所有Eden和S0的区域,分代年龄+1。
full gc:

  • 1.当对象分代年龄为15后,会把对象放到老年代。
  • 2.对象动态年龄判断:还有如果一批对象总大小大于survivor区的50%,此时大于等于这批对象年龄最大值的对象,就可以直接进入老年代了。
  • 3.MinorGC之后存活的对象,survivor放不下,可会放到老年代。
  • 4.老年代空间分配担保机制:年轻代每次mintorGC之前都会计算老年代剩余可用空间,如果小于年轻代里现有所有对象之和(包括垃圾对象)就会看一个-xx:handerPromotionFailure,如果有就看看老年代可用内存大小是否大于之前每次mintorGC进入老年代对象的平均大小,如果大于就尝试冒险进行MintorGC,如果不大于就进行一次FullGC)(静态变量,Bean对象,线程池,缓存的对象一般都会到老年代)当老年代也满了最后会执行FullGC,FullGC会对整个堆进行GC。这两种GC会停止用户现线程,STW(STOP THE WORLD)

为什么Stop The World?不stw可能存在找到非垃圾对象,继续执行最后释放,又变成了垃圾对象,无限循环,会触发很复杂的业务逻辑。

2.GC分为哪两种?,MinorGC和FullGC有什么区别?什么时候会触发FullGC,分别采用什么算法?
第一第二问略, MinorGC(使用复制算法)会在Eden满的时候触发 触发FullGC (使用标记清除或标记整理算法)有三种情况: 1)老年代空间不足
2)System.gc()
3)方法区空间不足
4)由Eden,From Space,向To Space区复制时,对象大小大于To Space的可用空间,把对象转移到老年代,且老年代可用空间也小于该对象大小。
5)当执行MintorGC之前会比老年代剩余空间是否比年轻代里所有的对象大,如果小于,会比较是否比之前mintorGC的平均进入老年代的内存大,如果小就会触发FullGC。

3.JVM里有几种classLoader,为什么会有多种?
启动类加载器:加载/java_home/lib下的类。无法被java程序直接引用。
扩展类加载器:负责加载/java_home/lib/ext目录中的。或者被java.ext.dirs系统变量所指定路径中的所有类库。开发者可以直接使用。
应用程序类加载器:负责加载自己写的类,默认的类加载器
类加载器的关系:依赖于双亲委派原则(碰到需要加载的类时能让父加载器加载就父加载器加载,父加载器不能加载再自己上)

4.什么是双亲委派原则?
上面说了
5.介绍一些运作过程,双亲委派模型的好处,什么情况下我们需要破坏双亲委派模型。
这样每个类都由一个加载器加载,避免重复加载,避免java核心api被篡改。
6.常见的JVM调优方法有哪些?可以具体到哪个参数,调成什么?
7.HashMap内部的数据结构是什么?底层是怎么实现的?
8.HashMap有什么并发问题,有可能还会拓展到ConcurrentHashMap
9.了解LinkedHashMap的应用吗? 10.红黑树的实现原理和应用场景?
11.为什么需要线程池?创建线程池的方式有哪些?
12.线程的生命周期,什么时候会出现进程僵死。
13.什么是线程安全,如何实现线程安全。
14.线程池几个重要参数,如何合理配置线程池的大小?
15.分析线程池的实现原理和线程的调度过程?
16.ThreadLocal,volatile的实现原理和场景?
17.ThreadLocal什么时候会出西安OOM的情况?为什么?
18.volatile,sychnorized区别,sychnorized锁粒度,模拟死锁场景,原子性,可见性。
19spring有哪些优势?
20.有没有读过Spring的源码?有没有进行解析和再次封装?
21.SpringBoot比Spring做了哪些改进?Spring5比Spring4做了哪些改进
22.你有写过分布式的业务吗?分布式存储?你觉得分布式的话会遇到哪些问题?
23.你了解几种消息中间件产品?各产品的优缺点介绍
24.消息中间件如何保证消息的一致性和如何进行消息的重试机制?
25.Redis为什么快?redis采用多线程会有哪些问题?
26.Redis分布式锁操作的原子性,Redis内部是如何实现的?
27.SpringCloud对比下Dubbo什么场景下该使用SpringCloud?
28.锁机制介绍:行锁,表锁,共享锁,排他锁。
29.乐观锁的业务场景和实现方式;
30.分布式事务的理解,常见的解决方案有哪些,什么是俩个阶段提交,三阶段提交?