共计 2736 个字符,预计需要花费 7 分钟才能阅读完成。
jvm 类加载器及类加载程序
加载器
1)BootstrapClassLoader(启动类加载器)
负责加载 $JAVA_HOME 中 jre/lib/rt.jar 里所有的 class,加载 System.getProperty(“sun.boot.class.path”)所指定的门路或 jar。
2)ExtensionClassLoader(规范扩大类加载器)
负责加载 java 平台中扩大性能的一些 jar 包,包含 $JAVA_HOME 中 jre/lib/*.jar 或 -Djava.ext.dirs 指定目录下的 jar 包。载 System.getProperty(“java.ext.dirs”)所指定的门路或 jar。
3)AppClassLoader(零碎类加载器)
负责记录 classpath 中指定的 jar 包及目录中 class
4)CustomClassLoader(自定义加载器)
属于应用程序依据本身须要自定义的 ClassLoader,如 tomcat、jboss 都会依据 j2ee 标准自行实现
类加载器的程序
1)加载过程中会先查看类是否被已加载,查看程序是自底向上,从 Custom ClassLoader 到 BootStrap ClassLoader 逐层查看,只有某个 classloader 已加载就视为已加载此类,保障此类只所有 ClassLoader 加载一次。而加载的程序是自顶向下,也就是由下层来逐层尝试加载此类。
2)在加载类时,每个类加载器会将加载工作上交给其父,如果其父找不到,再由本人去加载。
3)Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为 null。
spi
spi 能带来的益处:
不须要改变源码就能够实现扩大,解耦。
实现扩大对原来的代码简直没有侵入性。
只须要增加配置就能够实现扩大,合乎开闭准则。
要害信息:ServiceLoader 能够获取扩大实现的类实例
写好接口及实现类;
在 resources 目录下新建 META-INF/services 目录,并且在这个目录下新建一个与上述接口的全限定名统一的文件,在这个文件中写入接口的实现类的全限定名:
https://www.cnblogs.com/jy107…
B+tree
二叉树、均衡二叉树
B 树结构
B 树特点:每个节点都存储了子节点的指针和本节点的键值及数据;准确查找 ok,范畴查找有较多的 io 操作,范畴越大,性能越低;
B+ 树结构
B+ 树特点 1. 非叶子节点只存储键值信息。2. 所有叶子节点之间都有一个双向链指针。(晋升插入操作效率)3. 数据记录都寄存在叶子节点中。
sql 优化
slow_query 配置 查看慢 sql 日志
最左匹配
explain 执行打算
binlog 主从同步提早
硬件问题晋升硬件
分库分表
- 针对数据库方面的拆分次要是联合分库分表来实现,即对于分库,则依据业务内聚性,拆分为几个绝对独立的子服务,各个子服务应用独立的数据库离开部署,则能够将写操作扩散到各个数据库,各个数据库的复制流量绝对较小,从而通过分而治之的办法来升高整体的提早
线程池 **
Java 线程池参数
corePoolSize 线程池外围线程大小
maximumPoolSize 线程池最大线程数量
keepAliveTime 闲暇线程存活工夫
Timeunit 闲暇线程存活工夫单位
workQueue 工作队列
①ArrayBlockingQueue
②LinkedBlockingQuene
③SynchronousQuene
④PriorityBlockingQueue
threadFactory 线程工厂
handler 回绝策略
jvm 调参加内存问题排查
volatile
1. 保障有序性
2. 保障可见性
3. 不保障原子性
场景:
1)对变量的写操作不依赖于以后值
2)该变量没有蕴含在具备其余变量的不变式中
保障对变量操作的原子性才可应用 volatile
gc
回收哪些内存
可达性剖析算法:每个对象都被对象的援用,root object
两种回收算法
标记删除法、标记整顿法
内存模型 minor gc 为年老代区域回收 majorgc 为老年代区域回收
常见垃圾回收器 CMS G1,jdk9 后默认从 CMS 切换到 G1
jvm 内存模型
线程隔离:程序计数器 (Program Counter Register)、虚拟机栈(VM Stack)、本地办法栈(Native Method Stack)
线程共享:堆 (Heap)、办法区(Method Area)
堆内存 是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,简直所有对象和数组都被调配到了堆内存中。
办法区 次要是用来寄存已被虚拟机加载的类相干信息,包含类信息、常量池 (字符串常量池以及所有根本类型都有其相应的常量池)、运行时常量池
程序计数器 记录各个线程执行的字节码的地址,例如,分支、循环、跳转、异样、线程复原等都依赖于计数器
虚拟机栈 是线程公有的内存空间,它和 Java 线程一起创立。
当创立一个线程时,会在虚拟机栈中申请一个线程栈,用来保留办法的局部变量、操作数栈、动静链接办法和返回地址等信息,并参加办法的调用和返回。
本地办法栈 跟虚拟机栈的性能相似,虚拟机栈用于治理 Java 办法的调用,而本地办法栈则用于治理本地办法的调用。
但本地办法并不是用 Java 实现的,而是由 C 语言实现的。
每一个办法的调用都随同着栈帧的入栈操作,办法的返回则是栈帧的出栈操作
单例
public class Singleton {
private volatile static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {// 1
if (instance == null) {// 2
instance = new Singleton();// 3}
}
}
return instance;
}
}
这里是次要是要了解为什么要应用 volatile 润饰变量才行,是因为:
volatile 变量规定:对一个变量的写操作后行产生于前面对这个变量的读操作,所以才不会呈现对象还在创立就被其余线程拿去应用的状况,其余线程都会失去一个创立好的对象
应用外部类实现提早加载
public class Singleton {private Singleton() {}
private static class Holder {private static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
// 外围类能间接拜访外部类(不论是否是动态的)的公有变量
return Holder.instance;
}
}