目录
目录
1、JVM内存模型
虚拟机栈:存放变量等基础数据类型
本地方法栈:Native 方法服务
程序计数器:当前线程所执行的字节码的行号指示器
堆:对象和数组
方法区:static、classes 被JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
栈、本地方法栈、程序计数器是线程私有,方法结束即消失
堆和方法区是共享等待GC
2、垃圾回收机制
标记清除--碎片化
拷贝 --浪费一半空间
标记压缩--效率低
回收的是堆区,分为Yong区(年轻代)和Old区(老年代)
三种方式:标记整理、拷贝、压缩
实际是 yong区又分为S0\S1\E ,比例默认为1:1:8
新生成的对象存放于E区,当E区满了触发一次回收,未清除的放进S0,S0和S1交替进行,
当一个对象被GC6次还在,会被放进Old区,Old存放大于6次的对象和大的数据。
Old区满了会进行Full GC,伴随着Yong GC,服务会停止,专门进行标记整理内存。
年轻代和年老代比例 1:2
年轻代大了,会导致年老代小,导致每次GC的实际变长
年轻代小了,会导致年老代大,会导致频繁GC,引发FullGC。
调优方式:本着减少fullGC的次数,去观察程序运行高峰年老代 所占内存,预留1/3增加空间,去调整比例。
GC如何判断对象可以被回收:通过可达性分析,从GC Roots开始向下找,这条链被称为引用链,不在这个链上的就认为可以被回收。但不是马上回收,而是标记,等待虚拟机再次去验证是否覆盖Finalizer方法,如果未覆盖,则再次进行可达性分析,不可达即回收。
GC Roots有哪些:虚拟机栈中引用的对象,方法区静态变量、常量引用的对象、native方法引用的对象。
3、mysql存储引擎
存储引擎:不同数据文件在磁盘存储的不同形式。
InnoDB:支持事务、外键、支持表锁和行锁
叶子节点直接存放数据。每次读取16KB的数据
myisam:存放地址。是原生存储引擎。支持自适应hash
memory:使用hash索引,
hash:hash表不支持范围查询。memory:使用hash索引,myisam自适应hash。
树:
二叉树、红黑树、B+树
B+树:是一个多叉树、节点有序、每个节点可以多条记录。
1、mysql索引一般有3-4层就足以支持千万级别表的查询。
2、创建索引的字段越短越好,因为可以存储更多数据量,在长度不变的情况下。
3、能使用代理主键使用代理主键,能自增尽可能自增,不自增会增加索引的维护成本。
4、聚簇索引:数据跟索引是否是聚集存储的,inner db 的主键索引是聚簇索引
key 主键——>唯一键——>6字节的rowid
int占4个字节,
非聚簇索引:myisam; innodb的二级索引(辅助索引、普通索引)
基数:每列的不重复值,基数/总行数 越接近1越应该加索引。
聚簇索引:真实存在数据的
聚集索引:一般是主键索引,没有主键就是非空唯一索引,再不然就是row_id
二级索引: 聚集索引以外的都是二级索引
索引有什么负面影响?
1、索引越多,占的空间越大
2、更改添加索引数据的时候,维护这个索引树,导致添加修改数据时会慢!除了查询外的性能变慢
4、docker
dockerfile:自动化脚本,用来创建镜像
镜像:包含你所部署的应用程序以及它所关联的所有库
容器:镜像的实体,可以理解为一个进行
5、事务
@Transactional 可以作用在接口、类、类方法,@Transactional注解的方法都是被外部其余类调用才有效,故只能是public
- 作用于接口:不推荐这种使用方法,因为一旦标注在Interface上并且配置了Spring AOP 使用CGLib动态代理,将会导致@Transactional注解失效
- Spring默认使用的是jdk自带的基于接口的代理,而没有使用基于类的CGLIB代理。
propagation 代表事务的传播行为,所谓事务传播,就是被调用者的事务与调用者的事务之间的关系。默认值为 Propagation.REQUIRED。
同一个类中,方法A(无事务注解)调用方法B(有),此时事务不生效。方法B不会回滚。
如果方法A和方法B都有事务注解,会合并为一个事务执行。