zoukankan      html  css  js  c++  java
  • JAVA知识点在整理(可供面试参考)

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


  • 相关阅读:
    面对缓存,有哪些问题需要思考?
    .NET 文件格式相关开源项目
    (转)谈谈用ASP.NET开发的大型网站有哪些架构方式(成本)
    (转)基于微软平台IIS/ASP.NET开发的大型网站有哪些?
    sql查询优化策略
    初入linux系统
    Npoi操作Excel
    List GroupBy真实用法,Reflection(反射)用法,Enum用法,正则,搜索下拉布局
    3.2.2.4 文本匹配锚点
    3.2.2.3 单个表达式匹配多字符
  • 原文地址:https://www.cnblogs.com/lvgo/p/13275824.html
Copyright © 2011-2022 走看看