java知识图谱
2020-07-31 13:55:26 4 举报
AI智能生成
java 开发涉及到的各种知识点
作者其他创作
大纲/内容
JVM优化
JIT优化
开启服务端模式
增加内联函数的可能性
提高编译的可能性
降低线程优先级
热度衰减于半衰周期
内存优化
将新对象预留在年轻代
让大对象进入老年代
设置对象进入年老代的年龄
稳定的Java堆
增大吞吐量提升系统性能
使用非占有的垃圾回收器
监控及工具
jps
jstat
jmap
jinfo
jhat
HSDIS
JConsole
VisualVM
JMC
经验值
常规优化
禁用System.gc
逃逸分析于标量替换
关闭偏向锁优化
指针压缩
getter方法优化
jdk检测工具
jps
jmap
jstat
jvisualvm
Synchronized原理
服务器
tomcat
config
优化
网络优化
非阻塞模式,Tomcat8已经取消了BIO
启用压缩,消耗CPU,减少网络传输大小
并发优化
底层优化
多实例
关闭shutdown端口
关闭AJP端口
取消访问日志
nginx
config
nginx.conf
hosts.conf
IIS
Lighttpd
垃圾回收
垃圾收集器
Serial GC 单线程,一般用于客户端
ParNew GC Serial GC 基础上增加了多线程机制
Parrallel Scavenge GC 吞吐量优先收集器
ParallelOld 老生代并行收集器的种,采用标记整理算法,jdk1.6引入
CMS 又称响应时间优先回收期,使用标记清理算法
垃圾清理算法
标记清理算法
复制算法
标记整理算法
分代收集算法
数据库
mysql
复合索引
InnoDb
存储限制 64TB
支持 行锁 表锁
支持外键
支持事务
优化
建立索引
减少I/O操作
消除磁盘排序
EXPLAIN执行计划
select_type
type
Extra
局限性
大数据优化
sql优化
查询缓存
读缓存,线程缓存,排序缓存
Innodb缓存
连接数
线程池有关参数
慢查询日志
主从复制
主从复制配置
主从复制配置
配置文件
配置内容
监控工具
innotop
lepus
oracle
sql server
pgs
类型
层级数据库(注册表)
关系型数据库
时序数据库
图数据库
key-value数据库
对象数据库
bigTable数据库
规范
表名规范
要用前缀(不使用无意义的前缀)
下划线分隔
全小写
临时表以tmp为前缀,日期为后缀
备份表以bak为前缀,日期为后缀
列名规范
一般不适用前缀
下划线分隔
全小写
存储相同数据的列名和列类型保持一致
主键设计
物理主键
int,bigint(效率高)
uuid(容量问题,防碰撞)
取消所有联合主键
数据量
单表500w行以内
表设计
冷热数据分离,减小表宽度
禁止建立预留字段
禁止在数据库中存储图片,文件等二进制数据
禁止使用线上数据库做压力测试
禁止从开发环境,测试环境直接连接生产环境数据库
字段设计
优先选择符合存储需要的最小的数据类型
避免使用text,blob类型
避免使用enum数据类型
尽可能把列定义为not null
使用timestamp或者datetime类型存储时间
金额相关类型数据必须使用decimal类型
开发规范
充分使用表已经存在的索引
禁止select *
禁止使用不包含字段列表的insert
避免使用子查询,可以把子查询优化join操作
join关联表不超过5个
减少同数据库的交互次数,使用in 或 or 代替
禁止使用order by rand() 进行随机排序
使用 union all 而不是 union
拆分复杂的大sql为多个小sql
数据库操作行为规范
超过100万行的批量写操作,要分批分次进行操作
禁止为程序使用的账号赋予super权限
索引
三星索引
索引类型
组合索引
全文索引
主键索引
唯一索引
普通索引
索引设计
限制每张表的索引数量不超过5个
索引列:where从句中的列
索引列顺序按照区分度从高到底,长度从小到大,使用频率从高到底
数据库连接池
durid
HikariCP
设计模式
创建型
1. Factory Method(工厂方法)
2. Abstract Factory(抽象工厂)
3. Builder(建造者)
4. Prototype(原型)
5. Singleton(单例)
2. Abstract Factory(抽象工厂)
3. Builder(建造者)
4. Prototype(原型)
5. Singleton(单例)
结构型
6. Adapter Class/Object(适配器)
7. Bridge(桥接)
8. Composite(组合)
9. Decorator(装饰)
10. Facade(外观)
11. Flyweight(享元)
12. Proxy(代理)
7. Bridge(桥接)
8. Composite(组合)
9. Decorator(装饰)
10. Facade(外观)
11. Flyweight(享元)
12. Proxy(代理)
行为型
13. Interpreter(解释器)
14. Template Method(模板方法)
15. Chain of Responsibility(责任链)
16. Command(命令)
17. Iterator(迭代器)
18. Mediator(中介者)
19. Memento(备忘录)
20. Observer(观察者)
21. State(状态)
22. Strategy(策略)
23. Visitor(访问者)
14. Template Method(模板方法)
15. Chain of Responsibility(责任链)
16. Command(命令)
17. Iterator(迭代器)
18. Mediator(中介者)
19. Memento(备忘录)
20. Observer(观察者)
21. State(状态)
22. Strategy(策略)
23. Visitor(访问者)
java基础
面向对象
面向过程
关注于一个功能实现的步骤,按步骤编程实现功能。
面向对象
关注于一个功能实现的行为,将一些行为封装为一个对象来统一调用。
构造器Constructor
构造器不允许被重写。
构造器不是方法,所有用于修饰方法特性的修饰符,都不能用来修饰构造器。
构造器是实例化对象过程中用来初始化这个对象用的。
hashCode
hashcode()方法是JDK根据对象的地址或者字符串的值计算出来的int类型的数值(哈希码值)
同一对象多次调用hashcode()方法,必须返回相同的数值
如果两个对象根据equals()方法比较是相等的,那么两个对象调用hashcode()方法返回的结果必须相等。
如果两个对象根据equals()方法比较是不相等的,那么两个对象调用hashcode()方法返回的结果不一定不相等。
四个基本特性
抽象
Java中抽象的概念最直接的应用就是抽象类和接口,从复杂的业务逻辑中,提炼出它的本质
抽象类
可以写非抽象的方法
接 口
只能有抽象方法
JDK1.8新特性:默认方法(子类不一定要实现)
JDK1.9新特性:私有方法(增强默认方法)
封装
封装将数据以及加在这些数据上的操作组织在一起,提供给可信的其他类或对象操作。
继承
继承就是从一般到特殊的过程。通过继承可以拥有现有类的所有功能,并在无需重修编写原来类的情况下对这些功能进行扩展。
重载
重载是指一个类中允许存在多个同名函数,而这些函数的参数不同
重写
重写是指子类重新定义父类的方法
多态
多态性是指允许不同类的对象对同一函数作出响应。即同一函数可以根据调用对象的不同而采用多种不同的行为方式。实现多态的两种方式:重写、重载。
访问控制符
private
同类可见
default
同包可见
protected
同包可见,子类可见
public
全局可见
数据类型
基本类型
自动装箱
将Integer a = 120; 编译为:Integer a = Integer.valueOf(120)
自动拆箱
将int e = a; 编译为:int e = a.intValue()
String
性能差别:StringBuilder > StringBuffer > String
StringBuffer
线程安全
StringBuilder
线程不安全
String对字符串的操作(修改、拼接)其实是在创建新的对象
集合
Collection
Collection下所有子类集合都用于存储Value
ArrayList
ArrayList是线程不安全的
ArrayList每次扩容50%
Vector
Vector是线程安全的
Vector每次扩容翻倍
LinkedList
LinkedList线程不安全(底层链表类型结构)
Set
Set集合存储无序的不可重复元素,允许一个null元素
HashSet
HashSet对象必须定义hashcode()方法
LinkedHashSet
LinkedHashSet具备HashSet的性能,但内部使用链表维护元素的顺序(插入顺序)
TreeSet
TreeSet底层使用树结构维护有序的元素
Map
Map下所有子类集合都用于存储Key-Value
HashMap
HashMap是线程不安全的,可以存储null值null键
HashTable
HashTable是线程安全的,不允许存储null值null键
HashTable因为是线程安全的,所以性能低于HashMap
泛型
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
泛型擦除
泛型擦除是指:在Java中使用泛型创建对象时,在编译期间,所有的泛型信息都会被擦除,编译后会变成原始类型
异常
IndexOutOfBoundsEecption
元素越界异常
ArrayIndexOutOfBoundsEecption
多个元素越界异常
ClassCastException
类型转换异常
NullPointerException
空指针异常,null对象的应用
RuntimeException
运行时异常
IOException
IO操作异常
ConnectException
连接失败异常
IO
BIO
BIO(同步阻塞IO):一个连接对应一个线程
当有客户端连接请求时,服务端需要启动一个线程进行处理,如果这个连接不做任何处理,会造成不必要的线程开销,可以通过线程池机制改善,从而实现伪异步IO
NIO
NIO(同步非阻塞IO):N个连接对应一个线程
客户端所有的连接请求都会注册到多路复用器上,服务端通过一个多路复用器来处理所有请求。
AIO
AIO(异步非阻塞IO):NIO的2.0版本,引入了异步通道的概念,可以实现异步调用
序列化
序列化是指将对象的状态信息转换为可以存储或传输的形式的过程
序列化
将对象的状态保存为字节数组
反序列化
将字节数组反序列化为对象
多线程
实现方式
继承Thread类
实现Runnable接口
通过Callable接口
线程状态
new
新建线程
Runnable
可运行状态(执行start()方法,CPU决定是否运行)
Blocking
阻塞状态(线程被阻塞于锁)
Waiting
等待、计时等待(等待某些条件成熟)
Stop
终止状态(线程运行结束)
线程操作
sleep
sleep()是线程Thread的方法
sleep()不会释放对象锁
sleep()可以在任何地方调用
wait
wait()是Object对象的方法
wait()会释放对象锁
wait()方法之可以在同步方法或同步块中使用
notify
notify() 唤醒一个线程(谨慎使用),具体唤醒哪个线程,由CPU决定
notifyAll
notifyAll() 所有在对象O上wait的线程全部唤醒(应用较多)
线程停止
1、run方法代码执行完成
2、线程运行时抛出一个未捕获的异常,跳出线程
3、通过标志位跳出线程
4、interrupt() 向需要中断的线程发送停止指令;isInterrupted() 线程检查自己的中断标志位;Thread.interrupted() 将中断标志位复位为false;
不安全方式
Stop() 立刻停止线程,但不会释放线程运行所应用的资源
Suspend() 立刻挂起线程,但不会释放线程运行锁应用的资源,容易造成死锁
volatile
在多个线程之间,访问同一个被volatile修饰的对象时,所有线程共享这个对象的值
但是volatile不是线程安全的(多个线程同时修改这个变量时,最终结果不一定是最后修改的那个值;可以保证线程的可见性,不可以保证操作的原子性)
synchronized
可以修饰方法或代码块以同步的方式执行(同一时间只会有一个线程执行)
加锁,放到静态方法上是类锁,放到非静态方法上是对象锁
类锁与实例锁本质上是两把锁,类锁锁的是每一个类的class对象
代码块执行完或线程抛出异常时结束线程
修饰的锁其他线程在等待获取锁的阶段,会一直阻塞等待直到得到锁为止(不可中断锁)
无法判断锁的状态
synchronized是非公平锁
lock
Lock是一个接口
Lock必须显示调用释放锁的方法:unlock()
Lock有多种方式可以获取锁,不一定一直阻塞等待(可中断锁)
Lock可以判断锁状态
Lock可以设置为公平锁
公平锁
公平锁,先对锁发出获取请求的一定先获得锁。非公平锁则反之(性能更高)ReentrantLock(boolean)可选择公平锁或非公平锁,默认使用非公平锁。
锁的可重入
synchronized隐式支持锁的重入
ReentrantLock的lock()支持锁的重入
排它锁
同一时刻只有一个线程获取锁
读写锁
同一时刻运行多个读线程访问,但是只允许一个写线程,写锁会阻塞所有锁(ReentrantReadWriteLock)
Condition
Condition接口与Lock配合,来实现等待通知机制
线程安全
当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的
死锁
当一个锁未被释放,其他线程无法获取锁的时候,程序产生死锁情况
线程thread1先获取锁locka,然后在同步块里嵌套竞争锁lockb。而线程thread2先获取锁lockb,然后在同步块里嵌套竞争锁locka
Lock.unlock()方法的错误使用,导致死锁
线程池
用于管理线程的一个工具。
线程池的作用?限制系统中执行线程的数量;降低资源的消耗、提高响应速度、提高线程的可管理性。
常见线程池
Executors.newSingleThreadExecutor:单个线程的线程池;
Executors.newFixedThreadExecutor:固定线程数量的线程池;
Executors.newCacheThreadExecutor:可缓存线程;
Executors.newScheduledThreadPool:创建一个定长线程池,支持定时和周期性的执行线程;
常用的并发工具类
闭锁:CountDownLatch
CountDownLatch 闭锁允许一个线程或多个线程等待特定情况,同步完成线程中其他任务。
栅栏:CyclicBarrier
CyclicBarrier和CountDownLatch都可以协同多个线程,让指定数量的线程等待期他所有的线程都满足某些条件之后才继续执行。CyclicBarrier可以重复使用(reset)
构造方法CyclicBarrier(int, Runnable) 所有线程达到屏障后,执行Runnable
信号量:Semaphore
用来控制同时访问特定资源的线程数量
交换者:Exchanger
Exchanger 交换者用于在两个线程之间传输数据,被调用后等待另一个线程达到交换点,然后相互交互数据
常用的并发容器
ConcurrentHashMap:JDK1.7实现:分段锁;JDK1.8实现:元素(key)锁+链表+红黑树
SkipList:跳表自动随机维护一套索引,用于高效的索引List中的有序数据
ConcurrentSkipListMap:TreeMap的并发实现
ConcurrentSkipListSet:TreeSet的并发实现
ConcurrentLinkedQueue:LinkedList的并发实现
CopyOnWriteArrayList:写时复制,在添加元素是,复制一个新的容器,在新容器中新增元素;读数据都在Old容器中操作,进行读写分离。数据一致性较弱,适合读多写少的场景
CopyOnWriteArraySet:同上
JVM
JVM内存区域
堆(永久区)
栈(方法区)
程序计数器
本地内存
这块内存不受java堆大小限制,但受本机总内存的限制
MaxDirectMemorySize 配置本地内存大小
使用NIO,这块区域会被频繁使用
通讯协议
TCP
三次握手(一问->一答->一问)
建立连接
四次挥手
断开连接
0 条评论
下一页