01.静态内部类不会随着外部类的加载和初始化而初始化,它在被实际使用的时候才会单独的加载和初始化,因此可以用为单例创建实例。
02.classloader可以加载类路径下的资源文件
03.类初始化的过程:
03.1被加载的类会被初始化。
03.2存在main方法的类,被实例化的类,被实例化的父类,都会被加载。
03.3<clinit>()方法的执行:
03.3.1<clinit>()由静态变量显示赋值代码和静态代码块组成
03.3.2类静态变量显示赋值代码块和静态代码块从上到下顺序执行
03.3.3<clinit>()方法只执行一次
04.实例初始化的过程:
04.1 执行<init>()方法,<init>()方法对应类的构造器,因此有存在多个的可能。
04.2 <init>()方法由:非静态变量的显示赋值、非静态代码块、对应构造器代码块组成。
04.3 非静态变量显示赋值代码和非静态代码块从上到下顺序执行,对应的构造器代码最后执行。
04.4 每次创建对象,调用对应的构造器,执行的就是对应的<init>()方法。
04.5 <init>()方法的首行是super()或者super(实参列表),即对应父类的<init>方法。
05.哪些方法不会被重写
final方法,静态方法,private等子类中不可见的方法。
06.对象的多态性:
06.1 子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码。
06.2 非静态方法默认的调用对象是this
06.3 this对象在构造器或者说<init>()方法中就是正在创建的对象。
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 <pid> -o THREAD,tid,time #找到cpu占用高的线程id即tid,-m显示所用线程,-p进程使用cpu时间,-o用户自定义的格式
- 上一把获得的线程id,转换为16进制小写
- jstack <pid> | grep <tid> -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,BlockingQueue<Runnable>workQueue);
- workQueue是给线程池提交任务存放的地方。
原文:https://www.cnblogs.com/luohaonan/p/12656646.html