导图社区 java
java面试内容总结,包括springcloud、nginx集群及分发、springboot、集合、锁、JVM内存类型等。
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
JAVA面试·
JVM
内存模型
线程私有
栈
用于存储局部变量表,动态链接,方法出口。调用方法时执行入栈,方法返回市执行出栈
本地方法栈
native方法执行时使用
程序计数器
保存当前线程执行的字节码位置
线程共享
堆
存储对象的实例,几乎所有的对象实例都放在堆中,当堆没有空间会抛出OOM;根据对象存货周期不同,JVM把对象进行分代管理,并进行GC回收
对象分配方式
指针碰撞:假设内存是规整的,用一个指针标记已用和未用内存的临界点,配合TLBA本地线程分配缓存使用
空闲列表:已用和未用交织在一起,需要用一个列表记录哪些地方是空闲的
对象的结构
对象头
Mark Word(标记字段)
无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁,且锁升级的顺序是不可逆的 线程第一次获取锁获时锁的状态为偏向锁,如果下次还是这个线程获取锁,则锁的状态不变,否则会升级为CAS轻量级锁;如果还有线程竞争获取锁,如果线程获取到了轻量级锁没啥事了,如果没获取到会自旋,自旋期间获取到了锁没啥事,超过了10次还没获取到锁,锁就升级为重量级的锁,此时如果其他线程没获取到重量级锁,就会被阻塞等待唤起,此时效率就低了
Klass Pointer(类型指针)
对象指向它的类元数据的指针,JVM通过这个指针来确定对象是哪个类的实例
实例数据
数据信息和父类信息
对齐填充
JVM要求对象的起始地址必须是8字节的整数倍,填充数据不是必须存在的,仅仅是为了字节对齐
GC
有哪些收集器,对应算法
方法区
又称为非堆区,用于存储已被虚拟机加载的类信息,常量、静态变量
1.8用元空间替换方法区:因为永久代的方法区和堆使用连续的物理内存,如果动态加载很多class容易出现OOM,永久代空间有限(可以配置参数),1.8后元空间与堆内存不连续,直接使用物理内存,减少由于无法确定配置内存导致的OOM
锁
synchronized
每一个对象的对象头会关联一个Monitor对象
(1)EntryList队列 : 当多个线程同时访问一个Monitor对象时,这些线程会先被放进EntryList队列,此时这些线程处于Blocked状态;
(2)Owner :当一个线程获取到了这个Monitor对象时,Owner会指向这个线程,当线程释放掉了Monitor对象时,Owner会置为null;
(3)WaitSet队列 : 当线程调用wait方法时,当前线程会释放对象锁,同时该线程进入WaitSet队列。
Monitor对象还有一个计数器count的概念,这个count是属于Monitor对象的,而不属于某个获得了Monitor对象的线程,当Monitor对象被某个线程获取时,++count,当Monitor对象被某个线程释放时,--count。
无需手动释放锁
不可中断,除非异常或者正常退出
非公平锁
不可绑定条件唤醒
lock
属于JUC包,是api层面的锁
需要用户手工释放锁, lock() 和 unlock() 方法配合try catch 语句块使用
可中断: 1.设置超时方法 trylock(Long timeOut , TimeUtil util) 2.lockInterruptibly() 放在代码块中,调用interrupt()中断
可以绑定condition,用来实现分组唤醒需要唤醒的线程们
集合
HashMap
保存key-value形式的键值对数据
key-value可以是任何类型的数据,可以为null,会封装到HashMap$Node对象中
为了方便遍历,还会创建一个EntrySet集合,里面包Entry<K-V>
散列表是数组支持按照下标随机访问数据的特性,是数组的一种扩展(哈希冲突:某个数据散列后已存在)链表长度大于8且表空间到达64才会树化,哈希值相同且equals不相同,才会挂链表,否则会覆盖值
开放寻址:新增时找下一个空位,删除时打标记
链表:
为什么不用二叉树:如果顺序插入就会退化成单向链表,数据量大的时候会导致树太高
红黑树:
1. 每个节点不是红就是黑 2.不可能有连在一起的红色节点 3.根节点都是黑 4.每个红色节点的两个子节点都是黑色
初始大小16,扩容因子0.75,使用超过0.75就会扩容为2倍(如果知道数据量,设置好初始大小,减少扩容)
Hashtable 不能有null值,因为使用的是安全失败机制(fail-safe),这种机制会使你此次读到的数据不一定是最新的数据,如果get出来时null,再去contain(key),无法保证两次之间没有别的线程进行过修改,ConcurrentHashMap同理
快速失败(fail—fast)是java集合中的一种机制, 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
安全失败(fail-safe)遍历的是副本,所以容器内容的修改不影响遍历,迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的
通过Collections类对list、map、set 创建如使用Collections.synchronizedMap(Map)创建线程安全的map集合,创建出synchronizedMap之后,再操作map的时候,就会对方法上锁
CopyOnWriteArraySet
CopyOnWriteArrayList
ConcurrentHashMap
spring
三级缓存
一级放完整对象
二级放不完全对象
用来存放存在循环以来的对象,主要用于多次循环依赖的情况下,取到同一个对象,因为三级缓存中的lamda表达式可以多次执行出不同的对象
三级存lamda表达式,bean的创建工厂,如果需要AOP创建的就是代理对象,否则创建正常对象
bean的生命周期
bean的作用域
IOC
AOP
springboot
自动装配原理
nginx集群及分发
springcloud
注册与发现原理
网关配置