![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
文章平均质量分 62
maybe宸
在有限的时光里,多做有意义的事。
展开
-
重新理解spring IOC
一直以来自认为对于spring有一些自己的理解,但最近在写一个开源的缓存框架。开发starter时遇到一些瓶颈,查资料过程中发现一篇不错的文章,觉得讲的挺有道理,这里写点笔记记录一下。依赖注入dependency injection一直认为的spring依赖注入方式有3种,其实官方写的只有两种:DI exists in two major variants:Constructor-based dependency injectionandSetter-based dependency i...原创 2021-05-22 23:05:10 · 220 阅读 · 1 评论 -
mysql 事务一直running问题排查
遇到一个线上问题,应用执行sql报错,排查mysql:select * from information_schema.innodb_trx;select * from information_schema.INNODB_LOCKS;select * from information_schema.INNODB_LOCK_WAITS;select * from processlist;发现在trx表中存在一个事务trx_strated已经很长时间了,占用了很多表。怀疑是事务开启未commit原创 2020-08-05 17:01:47 · 3301 阅读 · 1 评论 -
JVM--GC及垃圾回收器
-XX:PrintGC。 打印简单GC日志 大对象直接进入老年代 -XX:MaxTenuringThreshold 设置晋升老年代的年龄。默认15,超过年龄的进入老年代 -XX:PretenureSizeThreshold 设置直接进入老年代的内存大小阀值。(只对DefNew和PreNew有效) -XX:+UseTLAB/-XX:-UseTLAB. +:使用TLAB线程内存区。加速对象分配。堆上分配内存会遇到并发分配问题。影响效率;使用TLAB使线程独立使用内存区域,加快内存分配。目前测试是默认开.原创 2020-08-03 16:47:03 · 160 阅读 · 2 评论 -
JVM--偏向锁
定义在对象的对象头信息里。所以它也最轻。当线程获取对象的偏向锁时,对象头的Mark word中会记录当前偏向的线程,所以mark word里存在线程信息,偏向方式是没有竞争时取消当前线程的同步操作。但又不能因为偏向失去锁的意义,所以竞争时,重新偏向其他线程。所以偏向锁在竞争少时能提高性能,竞争多时偏向锁多线程间切换,起不到偏向的作用。书本解释偏向锁mark word格式23位偏向锁线程|2位偏向锁时间戳|4位对象年龄|1(偏向锁固定位)|01(表示可偏向/未锁定)核心思...原创 2020-08-03 16:46:55 · 592 阅读 · 0 评论 -
JVM--轻量级锁
当出现频繁竞争时,对象的偏向锁失效,JVM会尝试获取对象的轻量级锁。轻量级锁实现是一个biasedObjectLocking对象,对象内部有一个biasedlock对象和被锁的对象内存地址指针。而biaedlock内部又是存在一个字段,用来备份被锁的对象的mark word。这时候被锁对象的对象头mark word 格式:ptr ...00 locked最后两位00表示对象持有轻量级锁...原创 2020-08-03 16:46:46 · 297 阅读 · 0 评论 -
JVM--类加载
步骤加载-连接-初始化其中连接又分为验证-准备-解析三步加载类接收:通过全限定名获取二进制数据流,即通过文件系统读入一个class后缀的文件或解析jar、zip包归档文件得到class文件。还有一些奇葩方法例如将二进制数据放入db通过db读取,或者通过http接收。 解析:解析类的二进制数据流为方法区内的数据结构 创建:创建Class类实例类加载器ClassLoader分类BootStrap ClassLoader启动类加载器,由C实现并且在java中没有对象...原创 2020-08-03 16:46:39 · 84 阅读 · 0 评论 -
JVM--hotspot虚拟机
内存布局分3个部分:1.对象头第一部分是对象自身运行数据Mark Word(hashcode、GC分代年龄、锁状态)。这是一个非固定数据结构,以便在极小的空间储存尽量多的信息。 另一部分是类型指针Class MetaData Adress,指向类的元数据,确定类型。 如果是数组还有一个array length记录数组长度。2.实例数据储存真正信息,即代码中定义的各种类型的字段,包括继承来的父类属性。3.对齐填充hotspot要求对象的起始地址必须是8字节...原创 2020-08-03 16:46:27 · 161 阅读 · 0 评论 -
Dockerfile
FROM <base Image> RUN <命令行命令> shell模式; RUN [‘可执行文件’] exec模式 CMD 同RUN,两者执行时机不同。RUN是在docker build时执行;CMD是在docker run时执行 多个CMD指令只有最后一个生效 CMD中指令会被docker run 命令行参数重指定要运行的程序覆盖 ENTRYPOINT 同CMD,但是不会被docker run 命令行参数执行应用程序所覆盖 多个ENTRYPOINT也仅最后一个...原创 2020-08-03 16:46:14 · 82 阅读 · 0 评论 -
Docker 指令
docker,应用容器引擎,可打包应用、依赖、环境等到一个轻量级可移植的容器中进行发布。 docker运行dockerFile构建的docker镜像,然后在docker里以容器的形式运行。所以当没有run了一个镜像,那么就会在docker里创建一个容器。我们可以通过start或者stop启动或停止容器的运行。当不需要了后,可以使用ps -a 查看所有容器,使用docker rm删除容器;如果连镜像都不需要了,可以使用docker rmi 删除镜像。 docker pull <imageName&.原创 2020-08-02 18:12:26 · 105 阅读 · 1 评论 -
JAVA 反射原理
jvm在启动时,会加载classPtah下的所有class文件为二进制流,读取到jvm中每个class文件在通过加载 连接 初始化后,会在jvm的元数据区存入对应的类的元数据。java反射利用的正是这一点,通过获取当前执行线程的lcassloader一般也就是app classloader然后通过这个类加载器获取到传入了全限定名的类的元数据。包括属性方法等信息,在运行期间可以实现动态调用方法。...原创 2020-08-02 18:12:19 · 121 阅读 · 0 评论 -
JAVA 注解原理
注解是一种特殊的接口元注解@Target 注解的作用目标。如字段、类、方法、注解等。ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上 ElementType.FIELD:允许作用在属性字段上 ElementType.METHOD:允许作用在方法上 ElementType.PARAMETER:允许作用在方法参数上 ElementType.CONSTRUCTOR:允许作用在构造器上 ElementType.LOCAL_VARIABLE:允许作用在本地局部..原创 2020-08-02 18:12:12 · 211 阅读 · 0 评论 -
Mysql—请求时序
请求−−>缓存−−>解析器−−>预处理器−−>查询优化器−−>将解析树生成执行计划−−>执行计划调用存储引擎API执行 −−>索引或查询数据表−−>响应数据缓存一个对英文大小写敏感的hash表。对sql做hash运算,精确匹配。 缓存命中,则不执行后续解析、预处理、优化。但在返回数据前会校验权限。sql解析器将sql解析按关键字解析成解析树,然后校验:是否存在错误的关键字 关键字顺序是否正确 引号是否匹配...原创 2020-08-02 18:12:01 · 209 阅读 · 0 评论 -
Mysql—线程状态
sleep,等待客户端发送新请求 query,正在执行查询或者正在发送结果到客户端 locked ,正在等待表锁,mysql服务器级别锁。Innodb的行锁属于存储引擎级别锁,不在此范围内 sorting result,正在对结果排序 还有其他状态不常见...原创 2020-08-02 18:11:54 · 86 阅读 · 0 评论 -
Mysql--索引基础
索引三星系统如果索引能够将数据相关的行放到一起,则获得一星。即索引将数据排序、区域集中、可以减少IO复杂度。 索引的数据顺序和查询的排列顺序一致。根据最左前缀原则,如果索引建立1,2,3;查询使用3,2,1;则不会使用到索引。所以索引建立要和查询排序一致。 索引中的列包含了查询中全部需要的列(即select 后面要查询的列),如Innodb根据一个普通索引查询主键值(select id from table where name = ‘wm’)。普通索引中保存了聚簇索引的值。而只查询聚簇索引值.原创 2020-08-02 18:11:48 · 85 阅读 · 0 评论 -
Mysql—前缀/后缀索引
前缀索引针对blob、text、很长的varchar字段,mysql不支持索引他们的全部长度。需建立前缀索引 前缀索引应该足够长,使前缀索引的选择性趋紧于索引整个列的选择性。 前缀索引又不能太长,降低索引的大小,减少空间占用。 Alter table tableName add key/index (column(X)). 缺点:无法应用于order by 和 group by,也无法做覆盖扫描。计算合适前缀长度方法:先计算比对整列统计数和前缀列统计数select coun..原创 2020-08-02 18:11:24 · 2535 阅读 · 0 评论 -
Mysql—库、表创建
创建数据库即在数据目录下创建一个子目录创建表即在子目录中创建一个.frm文件保存该表定义查看表定义show table status like ‘order’ 查询information_schema表优化表索引optimize table清除可变列varchar这类的列因为修改而占用的多余空间清除因为删除数据导致的页的碎片化...原创 2020-08-02 18:11:12 · 70 阅读 · 0 评论 -
DB设计—范式化和反范式化
范式化--schema设计趋向于符合三范式优点更少或者没有数据冗余 因为第1点,所以数据更新只更新一个字端。意味着更快的更新速度。 表体积更小 查询多数无需distinct去重缺点表数量更多 因为第1点,需要建立更多的索引 多数查询都需要多表关联!!! 因为第3点,关联查询极有可能导致索引无效反范式化优点数据在一个表,避免关联查询的性能消耗 减少多表建立索引开销 最差情况:查询时全表扫描,也大概率是顺序IO;比关联查询的随机IO快...原创 2020-08-02 18:11:04 · 185 阅读 · 0 评论 -
Mysql—聚簇索引
在B-tree基础上改造为B+tree 节点页保存叶子页引用 叶子页上保存整行数据 叶子页上也有节点页上的索引及索引的行数据 叶子页之间互有引用 Innodb默认主键位聚簇索引;如果没有主键、有唯一性索引,则使用唯一索引做聚簇索引;如果也没有唯一性索引则默认建立一个隐藏主键做聚簇索引 MyISAM主键则不是聚簇索引,只是普通唯一性索引。 如果有需要聚簇在一起的数据,使用该字段做聚簇索引;否则尽可能使用无意义自增列做聚簇索引。优点物理上连续 顺序IO 可视为“数据表”,索引..原创 2020-08-02 18:10:43 · 214 阅读 · 0 评论 -
Mysql—单列索引
即建立索引时使用一个列 字段不能是表达式一部分 字段不能是函数的参数原创 2020-08-01 20:44:10 · 117 阅读 · 0 评论 -
Mysql—hash索引
将被索引的列进行hash计算,形成一个散列表,用于精确查找,不支持范围、排序、group by查找。自定义hash索引即自己实现hash计算和存储。在表中添加一个列,用来保存要被索引的字段的hash值。添加时对字段进行hash计算保存。当今高并发的场景下,不推荐mysql中进行条件判断、函数运算。所以不推荐使用,...原创 2020-08-01 20:43:34 · 203 阅读 · 0 评论 -
Mysql—存储引擎
Innodb存储引擎支持事务,所以崩溃后可以通过事务日志恢复数据。数据存储在Innodb黑盒的表空间tablespace数据和索引存放在单独的文件中实现了标准的四个隔离级别默认RR,通过MVCC+间隙锁防止幻读间隙锁MVCC会锁定涉及到的数据行间隙锁会对索引中,间隙进行锁定,防止幻影行的插入回表Innodb主键为聚集索引,聚集索引的节点上存放了整行数据。其他索引为非聚集索引,非聚集索引叶子结点只存放聚集索引。回表即:当通过非聚集索...原创 2020-08-01 20:42:59 · 72 阅读 · 0 评论 -
Mysq—整数类型
tinyint 8bit -128-127/0-255 smallint 16bit mediumint 24bit int 32bit 21亿左右/42亿左右 bigint 64bit 9223...原创 2020-08-01 20:42:17 · 132 阅读 · 0 评论 -
Mysql—事务日志提交事务
存储引擎修改数据时只修改内存拷贝,再把该修改行为记录到磁盘上的事务日志中。而不是每次都将修改的数据本身持久化到磁盘。事务日志记录属于追加行为,顺序IO,而直接持久化数据本身需要频繁挪动硬盘磁头,属于随机IO。顺序IO比随机IO快很多。事务日志持久化后,内存中数据可以慢慢的刷回磁盘中。称之为预写式日志。如果事务只持久化到了事务日志并未刷回磁盘服务器崩溃,当数据库重启时会自动刷回这部分数据。...原创 2020-08-01 20:41:31 · 279 阅读 · 0 评论 -
Mysql--Innodb的MVCC
MVCC—多版本并发控制原理:保存数据在某个时间点的快照。即不同时间点开启的多个事务,对于同一张表的同一个数据看得到有可能都不一样。Innodb的MVCC实现每行记录后面保存两个隐藏列,一个保存行的创建时间,一个保存行过期时间,虽然说是时间,但其实他们存储的是系统版本号。个人猜测是时间戳的毫秒数。 每当开启一个新的事务系统版本号会进行递增。也就是时间戳递增。当前系统版本号也会作为当前事务版本号。 SELECT会附加查询条件:a,查询行创建时间字段小于当前事务版本号的数据。保...原创 2020-08-01 20:40:50 · 153 阅读 · 0 评论 -
Mysql—锁
锁分类读锁read lock=共享锁 shared lock多个客户端可以在同一时间读取同一资源写锁white lock=排他锁 exclusive lock当某个线程获取到写锁时将阻塞其他线程获取读锁和写锁,直到放开。 写锁优先级高, 写锁插队,写锁请求会插队到读锁队列前面,而读锁请求不能插队到写锁前面。锁粒度表锁阻塞对表的所有增删改操作 强制表锁,例如Alter等ddl行锁最大程度支持并发 只在存储引擎层面实现...原创 2020-08-01 20:40:14 · 73 阅读 · 0 评论 -
Mysql—数据类型基础
数据允许范围内使用更小的数据类型占用更少的磁盘、内存、CPU缓存;消耗的Cpu时钟周期更少。尽可能选择简单数据类型简单数据类型占用更少CPU时钟周期。字符串的检验规则和排序规则更复杂。例如:状态字段使用整型代替状态字符串 使用Mysql内置的时间代替字符串保存时间。 用整型存储IP地址。避免字段可为NULLNull值会占用额外的存储空间。innodb会使用单独的bit来存储Null值。有NULL值的列建立索引,会导致固定大小的索引列变...原创 2020-08-01 20:39:01 · 99 阅读 · 0 评论 -
Mysql—字符串类型
varchar char 类型 可变字符串 定长字符串 空格 varchar会保留字符串末尾空格 默认去除末尾空格 空间分配 用多少分配多少,数据添加时根据实际长度分配存储空间 预先分配足够空间,没用到的空间,末尾补空格。总是分配足够的存储空间 ...原创 2020-08-01 20:36:29 · 167 阅读 · 0 评论 -
git的diff操作是个啥?
说到git大家应该都不陌生了,它是我们合作开发、代码管理的重要工具。相信很多人都用过IDEA的git面板或者source tree这类git可视化工具,它们都有比对改动、分支比对功能,那么他们是怎么实现的呢。其实用到的就是diff指令,简单来说就是比对功能。下面举几个简单的例子感受一下:git diff 比较当前working tree与暂存区index之间差异。即已经Add的文件但尚未commit时的差异。git diff —cached/git diff —staged 比较当前worki原创 2020-07-22 20:48:20 · 342 阅读 · 0 评论 -
浅析tomcat调优
基础:每个进入到tomcat的请求,都会创建一个新线程来处理。几个关键参数max threads 最大线程数,指的是tomcat可以接受的最大请求数,默认200acceptcount 队列最大数,指当请求数达到max threads时,队列可以缓存的请求数,默认应该是100max connections 最大连接数,服务器想发送请求,必须先和tomcat建立socket链接,这个就是允许的最大连接数了。最大连接数应该大于最大线程数+队列最大数,默认应该是1000...原创 2020-05-21 21:31:48 · 268 阅读 · 0 评论 -
关于HTTP的几个问题
1.长连接和短连接短连接:当发送http时先建立tcp连接,请求结束后,tcp连接断开。http1.0默认使用短链接。长链接:http 1.1开始header里加入connection:keep-alive参数,使http请求结束后,TCP连接不断开,可以连接复用。使一个TCP连接可以发送多个Http请求2. 一个TCP是否可以同时处理多个http请求?http1.1虽然提供了同时发送多个http请求,但要求发送和返回顺序一致,这个行为不可控所以有但默认关闭;http2提供了multip原创 2020-05-21 21:30:13 · 195 阅读 · 0 评论 -
maven编译后参数名变var1...
想直接看解决方案的可以直接看最后。 最近在做gradle项目迁移到maven,原因是我们使用jenkins做自动化CICD,由于我们的gradle是打包的镜像,所以每次CI时会去启动镜像,这时会先启动gradle的守护进程,这个过程在jenkins下异常缓慢,导致每次CI时间过长,尝试关闭启动开启守护进程,但是仍然会启动一个jvm什么的还是很慢,后来我们分析其实就是这种镜像方式使用导致gr...原创 2020-04-10 09:03:20 · 1545 阅读 · 0 评论 -
java之日志框架
java日志框架其实分两块内容:一是日志框架比如JDK的j.u.l(java.util.logging),apache的log4j ,logback以及log4j2 等,这类日志框架主要作用是配置日志输出到控制台,文件,发布到哪。二是日志门面日志门面其实就是java程序和日志框架的中间层。阿里巴巴开发规范中提到,禁止直接使用日志框架的api来直接记录日志。因为不同日志框架提供了不同的api...原创 2020-02-12 00:07:42 · 113 阅读 · 0 评论 -
redis连接数
最近远程办公每个人都要启动多个微服务,dev环境为了节约成本就用了一台redis,突然报错连不上了。一查是连接数不够了。下面几个指令解决问题:查看当前连接数 info clients查看最大连接数: config get maxclients设置最大连接数 config set maxclients 10000...原创 2020-02-11 23:55:31 · 228 阅读 · 0 评论 -
疫情来袭,spring cloud 实现IDEA内debug的多地协同联调
最近疫情严重,互联网公司纷纷开启了远程办公模式。我们公司微服务架构,每个人负责一个项目,大家平时都在一个网络环境内,注册到nacos使用默认模式,直接注册的应用程序的主机ip。但是现在远程办公,大家网络环境不一样,大家内网无法互相访问,也就无法互相调用。所以这里我们使用ngrok 将本地应用启动后做内网穿透,发布出去,这样就实现了自己的一个对公网发布的服务。然后配置nacos的注册ip及por...原创 2020-02-04 21:01:15 · 642 阅读 · 1 评论