面试准备#20200407

01.静态内部类不会随着外部类的加载和初始化而初始化,它在被实际使用的时候才会单独的加载和初始化,因此可以用为单例创建实例。
02.classloader可以加载类路径下的资源文件
03.类初始化的过程:
    03.1被加载的类会被初始化。
    03.2存在main方法的类,被实例化的类,被实例化的父类,都会被加载。
    03.3()方法的执行:
        03.3.1()由静态变量显示赋值代码和静态代码块组成
        03.3.2类静态变量显示赋值代码块和静态代码块从上到下顺序执行
        03.3.3()方法只执行一次
04.实例初始化的过程:
    04.1 执行()方法,()方法对应类的构造器,因此有存在多个的可能。
    04.2 ()方法由:非静态变量的显示赋值、非静态代码块、对应构造器代码块组成。
    04.3 非静态变量显示赋值代码和非静态代码块从上到下顺序执行,对应的构造器代码最后执行。
    04.4 每次创建对象,调用对应的构造器,执行的就是对应的()方法。
    04.5 ()方法的首行是super()或者super(实参列表),即对应父类的方法。
05.哪些方法不会被重写
    final方法,静态方法,private等子类中不可见的方法。
06.对象的多态性:
    06.1 子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码。
    06.2 非静态方法默认的调用对象是this
    06.3 this对象在构造器或者说()方法中就是正在创建的对象。
07.spring事务属性:
    07.1 propagation:用来设置事务的传播行为
        事务的传播行为:一个方法运行在了一个开启了事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务
        -Propagation.REQUIRED:默认值,使用原来的事务
        -Propagation.REQUIRES_NEW:将原来的事务挂起,开启一个新的事务
    07.2 isolation:用来设置事务的隔离级别
        -Isolation.REPEATABLE_READ:可重复读,MySQL默认的隔离级别
        -Isolation.READ_COMMITTED:读已提交,Oracle默认的隔离级别,开发时通常使用的隔离级别
08.springmvc乱码解决:
    post请求:设置CharacterEncodingFilter的encoding/forceEncoding
    get请求: 设置tomcat,server.xml Connector标签中加URIEncoding="UTF-8"  
09.springmvc的工作流程:(P10)
10.MyBatis中当实体类中的属性名和表中的字段名不一样怎么办?
    - 写sql语句时候起别名
    - 在MyBatis全局配置文件中打开mapUnderscoreToCamelCase=true
    - 在Mapper映射文件中使用resultMap来自定义映射规则
11.centos6中常用的服务类命令:
    - service 服务名 start|stop|restart|reload|status
    - chkconfig --list | grep xxx
    - chkconfig --level 5 服务名 on
12.centos7中常用的服务类命令:
    - systemctl start|restart|stop|reload|status 服务名.service
    - systemctl list-unit-files | grep firewalld
    - systemctl enable service_name
    - systemctl disable service_name
13.git工作流(P13)
14.redis持久化的方式:
    - rdb,(Redis DataBase)快照,节省磁盘空间,会丢失大量数据,个版本不兼容。
    - aof,(Append Of File)日志,比较占用空间,丢失数据较小。
15.mysql何时适合建立索引:
    适合建立索引的字段:频繁查询的字段、查询关联的字段、组合索引的性价比高、排序字段、分组字段
    不适建立索引的字段,表记录太少,经常增删改查的表,过滤条件不好的字段(性别)。
16.jvm垃圾回收机制:
    - yong区,minor GC;old区,full GC;Perm区 几乎不发生GC;
    - 四大算法:复制(年轻代)、标记清除(老年代)、标记压缩(老年代)、标记清除压缩
    - GC发生在堆里面
17.消息队列在项目中的使用:
    - 分布式系统高并发使用消息队列异步处理
    - 各模块解耦
18.volatile:
    - Java虚拟机提供的轻量级的同步机制(保证可见性、不保证原子性、禁止指令重排序)
        - 可见性:一个线程修改了主内存中的共享变量,其他线程立即可以获知到最新的共享变量值
        - 不保证原子性:使用AtomicInteger
        - 禁止指令重排序:(语句之间不存在数据依赖关系,指令就有可能进行重排序)
    - 单例中使用volatile禁止DCL的指令重排序:
19.JMM(java内存模型-可见性-原子性-有序性):  
    - java memory model是一种抽象的概念,并不真实存在,描述了一组规则和规范,它定义了程序中各个变量的访问方式。
    - 线程解锁前,必须把共享变量的值刷新回主内存
    - 线程加锁前,必须读取主内存的最新值到自己的工作内存
    - 加锁解锁是同一把锁
20.cas compareAndSet
    - 比较并交换,是一条cpu并发原语,如果期望值没有被修改,就进行修改。
    - 底层原理自旋锁+UnSafe类,
        - unsafe类,可以想C的指针一样直接操作内存,unsafe类级别都是native方法来实现的。
        - 自旋锁do{}while(!compareAndSwapInt())
    -缺点:
        - 循环时间长,开销很大。
        - 只能保证一个共享变量的原子操作。
        - 引来aba问题
21.atomicInteger的aba问题:
    -通过AtomicStampedReference类来解决aba问题
22.原子引用AutomicReference
23.ArrayList是线程不安全的。
    - 底层是Object[]数组默认大小是10。
    - 通过Arrays.copyOf完成扩容。
    - 多线程添加会报java.util.ConcurrentModificationException
    - 解决方案
        - 用Vector类,但Vector加锁了,有性能问题。
        - 用Collections.synchronizedList()包装一下ArrayList
        - 用CopyOnWriteArrayList类
    - 线程不安全,异常导致原因:多个线程同时进行修改。
24.CopyOnWriteArrayList类原理:
    - 每次写,都copy一份,向新copy的里面写,写完把之前的引用指向最新的copy。
    - ReentarantLock
25.HashSet是线程不安全的:
    - HashSet底层是HashMap
    - HashSet底层只用HashMap的k,v都是Object常量。
26.HashMap是线程不安全的:
    - 使用ConcurrentHashMap
    - 使用Collections.synchronizedMap()方法包装
27.公平锁:
    - new ReentrantLock(true)
    - 先来后到,排队拿锁,
28.非公平锁:
    - new ReentrantLock()
    - synchronized也是非公平锁
    - 允许插队拿锁,而不是按照申请锁的顺序来
    - 非公平锁比较粗鲁,上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁的那种方式。
29.可重入锁(递归锁):
    - 在同一线程外层方法获取锁的时候,在进入内层方法的时候会自动获取锁。
    - synchronized
    - ReentarantLock
30.常用linux命令
    - top ,uptime
    - vmstat -n 2 3 每两秒采样一次,工采样3次。
    - mpstat -P ALL 2 #查看所有cpu核信息
    - pidstat -u 1 -p 进程号 #每个进程使用cpu的用量分解信息
    - free,free -m
    - df -h,
    - iostat -xdk 23
    - ifstat 1
31.cpu占用过高问题定位:
    - top 查看cpu占用,看看是啥命令导致的
    - jps 或者 ps -ef | grep 进一步定位问题
    - ps -mp -o THREAD,tid,time #找到cpu占用高的线程id即tid,-m显示所用线程,-p进程使用cpu时间,-o用户自定义的格式
    - 上一把获得的线程id,转换为16进制小写
    - jstack | grep -A60
32.springboot调优:
    - java -server -Xms1024m -Xmx1024m -XX:+UseG1GC -jar xxx.jar
33.线程池
    - Executors.newXxxThreadPool();
        - FixedThreadPool && SingleThreadPool:允许的请求队列长度Integer.MAX_VALUE,可能导致大量请求堆积,从而导致OOM。
        - CachedThreadPool && ScheduledThreadPool:允许创建的线程数量为Integer.MAX_VALUE,可能导致大量线程的创建,从而导致OOM。
    - ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnint timeUnit,BlockingQueueworkQueue);
        - workQueue是给线程池提交任务存放的地方。
34.spring过滤器和拦截器
    - 过滤器组要针对的是请求和响应的通用处理,比如检查是否登录,字符编码转换
    - 拦截器主要对业务方法的执行进行拦截,比如检查是否有权限,对方法返回值进行脱敏
35.git回退版本:
    - 改变当前版本Head指针的指向提交id
    - git log 确定要回退的提交的id
    - git reset --hard 1094a
36.maven冲突解决:
    - 某个组件下通过节点的节点来排出

你可能感兴趣的:(面试准备#20200407)