1.JVM的结构,JVM原理
1.1 虚拟机的结构:
- 类加载子系统
- 运行时数据区(内存空间)
- 执行引擎
- 本地方法接口a
其中内存空间又分为:
- 堆
- 方法区
- JVM栈
- 本地方法栈
- 程序计数器
1.2 虚拟机原理:
一次编译,到处运行.是通过java代码编译之后生成.class文件.之后在虚拟机上进行解释,变成当前虚拟机所在系统环境能够识别的机器码然后再去运行,不同的机器上只需要安装不同的虚拟机即可实现对.class文件的先解释再运行.
2.ClassLoader加载机制,加载原理
2.1 先把.class文件加载到内存,然后校验,解析,初始化.最后才能变成虚拟机可以使用的Java类型.
2.2 java中一共有三种加载器
- Bootstrap Classloader 加载存放在lib目录下的类,或者设置虚拟机参数指定路径的类,是c 写的,我们看不到具体的内容.
- Extension CLassLoader 在ext目录下的类,或者系统变量设置的类.
- App ClassLoader 加载我们自己写的类.一般情况下,程序中默认的加载器就是这个
3.双亲委托加载模型的好处
除了顶层的Bootstrap加载器外,其他的类加载器都应该有自己的父类加载器.实现使用的组合关系.
当一个类加载器收到了加载类的请求之后,会向他的父类加载器加载,每个类加载都是这样.然后最终传到Bootstrap加载器中.只有这个过程没有返回所需的类时,子类加载器才会尝试自己去加载.这种加载方式的好处是在任何加载环境都是同一个类,因为不同的类加载器加载同一个class,结果是两个独立的类,如果不用这种方式的话,我们的类就哪里都是,并且会很乱.
这个问题首先是因为虚拟机中不同的类加载器对同一个class文件去加载类,得到的类是相互独立的.在类型判断返回结果为false;
然后双亲委托加载是除了Bootstrap之外,不管哪一个类加载器,都应该有父类加载器.这样的话,可以保证我们的加载出来的类是在一个环境中加载出来的.不然的你加载一个我加载一个.就乱套了.
4.LinkedHashMap和TreeMap源码,这两个的实现分别是什么?有什么区别?
LinkedHashMap = 数组 双向链表…赋予了map有序的能力.
TreeMap 基于红黑树实现了SortMap
5.ThreadPool实现?
int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue
核心线程数,最大线程数,阻塞队列.
6.几种锁的实现,如何避免死锁?
可重入锁,可中断锁,读写锁,公平锁,非公平锁
可重入锁: synchronize 和 lock 都是可重入锁 可终端所: lock是,synchronize不是 公平锁: lock可以设置 非公平锁: synchronize
悲观锁和乐观锁.
HashTable ConcurrentHashMap
synchronize lock
如何避免死锁.
加锁顺序 加锁超时,当尝试获取锁的时候,通过设置超时时间,放弃获取目标锁的请求,并释放自己占有的锁. 避免同一个线程获取多个锁
7.多线程辅助类
lock,CountDownLatch,Exchanger
8.ArrayCopy什么时候使用?
ArrayList扩容,输出,克隆.会调用Array.Copy()方法
9.MySQL的事务隔离级别
读未提交,读已提交,重复读,串行化
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
(默认)可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
10.分布式应用场景
分布式首要解决的问题是高可用(近乎100%可用,99.99%)!
高并发(百万并发),高性能(毫秒级响应)
并发量大,容错率低.
11.分布式事务
理解记忆,常看 16
事务4个特性,CRID 原子性,一致性,隔离性,持久性.
基于分布式初衷,在数据的可用性和一致性有所取舍.
分段提交(CAP定理):
- 事务协调器需要所有涉及事务的数据库进行预提交,并反馈是否可以提交
- 事务协调区需要所有涉及事务的数据库进行提交.
优缺点:
优点:尽可能保持了数据的一致性,应用于对数据一致性要求较高的系统.
缺点:牺牲了分布式高可用特性.增加了系统复杂度,不适合高并发场景.
BASE理论:
可用和一致有所取舍,根据自身业务特点,使用合理方式,使事务达到一致性.
消息事务,支付回调视作事务.
12.分段提交的实现
就位确认.魔兽,剑网3. 一阶段,二阶段.
13.redis常用数据结构
String,List,set,hash,zset(sort set 有序集合)
14.如何实现分布式缓存
分布式缓存架构基础
分布式缓存一致性Hash算法理解
基于redis分布式缓存实现(新浪微博案例)
需要解决的问题:
- 实现高可用为前提,还要具有一定的扩展性(根据不同时期,继续增大缓存的可用性,双11,鹿晗介绍他的女朋友)
- 数据分片,均匀分布在多个实例中.(解决分布缓存的最优情况)
- 读写分离,尽量减小缓存穿透增加DB压力.(增加容错率,避免雪崩)
- 数据的一致性.
redis集群.
通过key做一致性哈希,实现key对应redis结点的分布。
一致性哈希的实现:
l hash值计算:通过支持MD5与MurmurHash两种计算方式,默认是采用MurmurHash,高效的hash计算。
l 一致性的实现:通过java的TreeMap来模拟环状结构,实现均匀分布
15.分布式集群的好处
高可用.
16.heap 和 stack 的区别
首先,在数据结构上来讲,两者属于完全不同的两种数据结构.
堆是一个完全二叉树,并且堆中的每个节点,要么总是不大于父节点,要么总是不小于父节点 栈又叫堆栈,是一种只允许从一端对数据进行操作的线性表.
在虚拟机内存上来讲堆是存储对象实例的地方,栈是我们执行对象行为的地方.
17.什么是Spring IOC
Spring Ioc 是指Spring对应用中的类实例化进行管理,使我们的程序 代码间进行解耦,同时让我们更多的去关注我们的代码逻辑,不需要我们 自己去管理对象的创建,需要使用的时候通过依赖注入到我们所需要使用 的类中即可.
那为什么不直接用工厂模式呢,工厂模式也可以管理实例的初始化
因为IOC是通过反射机制来实现的。当我们的需求出现变动时,工厂模式会需要进行相应的变化。但是IOC的反射机制允许我们不重新编译代码,因为它的对象都是动态生成的。