八大基本数据类型
flot short double int long byt boolean char
string线程不安全
stringbuffer线程安全
stringbuilder线程不安全
String被final修饰不能被改变
string a = "1"; 直接赋值不会浪费空间
string a = new string("1");会开辟两块堆空间,其中一块会被垃圾回收,而且不能都进入常量池。
引用类型与基本类型
引用类型就是Interger Boolean等,可以为null值,提供了。valueOf(),praseInt等方法。
Integer a = 0;但是int a 不能等于null;这个就是我们常说的装箱拆箱的
final:被final修饰的类不能被继承,方法不能被重写,变量只初始化一次;常与static连用,一旦给static final赋值就不能改变可以通过类名访问
fianlly:与try catch连用,像在进行io流操作的时候需要在finally中关闭流,try catch中有return关键字,finally中的方法在return之前执行。但是有一种特殊情况不会执行finally里的 system.exit()
finalize:手动垃圾回收,建议不使用,因为有很大的不可预测性
error:系统出现不可恢复的错误
exception:分为可检查与不可检查两种;可检查就是说需要捕获或者抛出异常;不可检查就像我们经常遇到的空指针异常。
throws throw trycatch
throws是方法中可能会抛出异常的声明
throw主动抛出的异常
程序计数器:是指当前线程所执行字节码的行号指示器。分支、异常处理、线程恢复都需要依赖这个
堆:线程共享,是比较大的一个内存空间。主要存放对象实例以及数组
栈:线程私有。每个方法在执行的同时会创建一个栈帧用于存储局部变量表。每个方法从开始执行到完成,都相对象入栈到出栈的过程。局部变量表主要存放基本数据类型,对象引用类型
本地方法栈:与虚拟机栈类似。为虚拟机提供Navicat服务
方法区:线程共享。类信息,常量,静态变量
运行时常量池:用于存放编译时生成的字面量和符号引用。
垃圾回收:
标记-清除
会存在内存碎片,
复制
将内存分为两块,每次只用一块,将存活的对象复制到另一块内存中。
标记-整理
将存活的对象移到另一端,将标记可回收的对象移动到另一端
分代算法:
年轻代:一个eden区两个S区,比例时8:1:1。
当eden区满了,会将存活的对象放进s0中,清空eden;当s0和eden都满了,会将s0和eden存活的对象放入到s1,并清空s0和eden,这是s0和s1调换,保持s1时空;当eden s1 s0都满了会将存活的对象放入老年代,当老年代满了会触发full gc
CMS收集器基于标记清除算法
过程
初始标记
重新标记
并发标记
并发清除
优点:低停顿,并发收集
缺点:cpu资源敏感、产生大量碎片空间提前fullGC、无法处理浮动垃圾
G1收集器整理上看是基友标记-整理算法,实际上是复制算法
初始标记
并发标记
最终标记
筛选回收
优点:低停顿、高吞吐量、并行与并发
多线程:
实现Runnable、callable接口
二者区别是有无返回值
获取当前线程的方法thread.currcentThread
还可以继承其他的类
继承Threa类
不能继承其他的类
start()是实现真正上意义的多线程而run()只是thread中的一个普通方法
yeild()线程让步
wait()线程等待
notify()随机唤醒某个线程
notifyAll()唤醒全部线程
sleep()线程睡眠个固定时长
线程状态:
new
running
lock pool
time wait
wait
结束
类的加载
加载
将java文件编译成.class文件
验证
是否符合java语法规范
准备
将变量初始化
解析
将接口名字,变量名等指定到内存地址
初始化
将变量值赋值
卸载
被JVM回收,
类加载器:
bootstrop
extension
application
双亲委派
当一个类被加载的时候他会先从bootstrop的类加载器下找jre/lib/rt.jar;如果没找到又回到extension中找jre/lib/ext,如果还没找到再去application指定的classpath中找
servlet生命周期
创建servlet实例,调用init方法和destroy方法,servlet实例保存在内存中,调用它的service方法,为接收到请求服务
mybatis
1.读取核心配置文件mybatis-config.xml并返回InputStream流对象。
2.根据InputStream流对象解析出Configuration对象,然后创建SqlSessionFactory工厂对象
3.根据一系列属性从SqlSessionFactory工厂中创建SqlSession
4.从SqlSession中调用Executor执行数据库操作&&通过解析生成具体SQL指令
5.通过TypeHandler(数据库与java类型转换)对执行结果进行二次封装
6.提交与事务处理
redis能做什么?
1.缓存
2.数据库
3.订阅pub/sub
4.排序
5.去重
6.hash存储
7.消息队列
redis分布式锁:
先用sentx来争抢锁,在加expier;可以通过set指令吧sentx和expire合成一条指令
查找固定开头的key
scan指令无阻赛的取出key
使用redis做异步队列
rpush生产消息,lpop消费消息,blpop阻塞知道消息到来
pub/sub缺点:会丢失消息
延时队列的时候使用soredset
缓存哨兵,高可用,slave自动提升为master
cluster,扩展性,内存不足,使用cluster进行分片存储
redis缓存
雪崩:同一时间缓存大量失效
解决:过期策略和内存淘汰机制;失效时间错开;加锁;备份缓存
穿透:模拟用户请求数据库不存在的数据
解决:互斥锁排队;接口限流、熔断、降级;布隆过滤器bloomfilter(快速判断一个key是否存在,不存在就返回)
击穿:货物爆款,在大并发的情况下突然失效,直接访问数据库
解决:将一些比较火的商品设置为永久不过期的,加互斥锁
redis持久化:RDB和AOF同时使用,
AOF保证数据不会丢失,作为数据恢复的第一选择
RDB做不同程度的冷备份
https://www.jianshu.com/nb/6137390