lvgo

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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的反射机制允许我们不重新编译代码,因为它的对象都是动态生成的。


posted on 2018-10-02 10:12  星尘的一个朋友  阅读(57)  评论(0编辑  收藏  举报