<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Xp545945的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Xp545945</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Xp545945]]></copyright><item><title><![CDATA[图片上传组件]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/136603881</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/136603881</guid><author>Xp545945</author><pubDate>Sun, 10 Mar 2024 16:29:44 +0800</pubDate><description><![CDATA[项目需要多张图片上传回显，图片上传后返回图片ID，不返回url，需要通过图片ID获取token然后再拼接成图片下载的URL。选择el-upload组件进行开发。]]></description><category></category></item><item><title><![CDATA[类加载问题汇总]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108866684</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108866684</guid><author>Xp545945</author><pubDate>Tue, 29 Sep 2020 13:27:17 +0800</pubDate><description><![CDATA[类加载时机（主动引用）

new、getStatic、putStatic，invokeStatic指令时加载。
反射调用时，如果类没有进行init，会先init。
作为父类加载。
JVM启动时指定的主类。
java.lang.invoke.MethodHandler

被动引用

通过子类引用父类的静态字段，不会加载子类。
定义引用类数组，底层是Object类型不会加载引用类型。
使用类的静态常量池不会触发类加载。

类加载过程

加载：

通过类的全限定名来获取类的二进制字节流。
将字节码静态结构转化为方]]></description><category></category></item><item><title><![CDATA[volatile问题汇总]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108838795</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108838795</guid><author>Xp545945</author><pubDate>Sun, 27 Sep 2020 23:20:29 +0800</pubDate><description><![CDATA[volatile作用

可见性：所有线程都能看到共享内存的最新状态，不保证操作的原子性。
防止指令重排。

volatile原理

从Java内存模型理解，volatile要求d读操作(read、load、use)，写(assign、store、write)动作必须连续出现，从而保证读操作会先刷新工作内存，写操作会立即同步到主内存。
通过内存屏障控制CPU的store buffer和invalid queue的行为来防止指令重排。

Store buffer 和Invalid Queue

CPU修改Cac]]></description><category></category></item><item><title><![CDATA[进程问题汇总]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108833782</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108833782</guid><author>Xp545945</author><pubDate>Sun, 27 Sep 2020 18:29:12 +0800</pubDate><description><![CDATA[进程状态

创建状态：初始化进程控制块PCB，分配进程运行需要的资源。
就绪状态：进程已拥有除CPU以外所有资源，进入就绪队列，等待CPU调度。
运行状态：已获得CPU，正处于执行的状态。
阻塞状态：由于发生某些事件(IO请求、缓冲区申请失败等)暂时无法执行，进入阻塞状态。
终止状态：进行进程的清理工作，回收PCB。

僵尸进程

进程结束后没有被完全销毁，而是留下了成为僵尸进程的数据结构。
进程结束后仍然会保留包括进程号、退出状态、运行时间的信息，占用进程号不释放。
避免方法：

通过wait/waitp]]></description><category></category></item><item><title><![CDATA[LeetCode134]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108832770</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108832770</guid><author>Xp545945</author><pubDate>Sun, 27 Sep 2020 17:38:50 +0800</pubDate><description><![CDATA[在一条环路上有 N 个加油站，其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车，从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发，开始时油箱为空。如果你可以绕环路行驶一周，则返回出发时加油站的编号，否则返回 -1。
来源：力扣（LeetCode）

暴力解法就是枚举每个起点i，从i开始能否完成一周，这里很多重复计算。假设从起点i开始最多能够到达某一点j，那么i+1最多也只能到达j。很多起点都可以直接跳过，需要考虑的点应该是从i无.]]></description><category></category></item><item><title><![CDATA[隔离级别问题汇总]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108824133</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108824133</guid><author>Xp545945</author><pubDate>Sun, 27 Sep 2020 11:12:07 +0800</pubDate><description><![CDATA[隔离级别分类




事务隔离级别
脏读
不可重复读
幻读




读未提交
是
是
是


不可重复读
否
是
是


可重复读
否
否
是


串行化
否
否
否


什么是幻读

事务A 按照一定条件进行数据读取， 期间事务B 插入了相同搜索条件的新数据，事务A再次按照原先条件进行读取时，发现了事务B 新插入的数据称为幻读。
如果事务A 按一定条件搜索， 期间事务B 删除了符合条件的某一条数据，导致事务A 再次读取时数据少了一条，这种情况归为不可重复读。

RR隔离级别如何实现

使用MVCC保证快照]]></description><category></category></item><item><title><![CDATA[索引问题汇总]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108820902</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108820902</guid><author>Xp545945</author><pubDate>Sun, 27 Sep 2020 09:06:59 +0800</pubDate><description><![CDATA[什么是索引？

索引是保证MySQL高效查询数据的数据结构
索引减少服务器需要扫描的数据量。
索引可以避免排序和临时表。
索引可以将随机IO变为顺序IO。

索引有哪些数据结构

B-Tree索引
HASH索引
Full-Text索引
R-Tree索引

B-Tree索引结构
一个m介B树的定义如下：

每个节点最多有m个子树
根节点不是叶子节点，至少有两个子树。
除根节点之外的所有非叶子节点至少有m/2棵子树。
所有非叶子节点中包含k个关键字和k+1个子树。
所有叶子节点都出现在同一层次，并且不带信息，视]]></description><category></category></item><item><title><![CDATA[背包DP总结]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108755187</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108755187</guid><author>Xp545945</author><pubDate>Wed, 23 Sep 2020 16:04:38 +0800</pubDate><description><![CDATA[01背包
问题：有n个重量和价值分别为wi和vi的物品，从这些物品中挑出总重量不超过m的物品，求所有挑选方案中价值总和的最大值。
使用dfs搜索时依次对第i种物品都考虑选择或不选择，如果选择那么剩余容量为m-wi，然后在剩余的物品中继续搜索；如果不选择那么剩余容量不变，继续在后面的物品中搜索。使用动态规划的方法，则把每次开始搜索时容量和当前需要判断的物品看做一个状态，得到的转移方程为
dp[i][j]=max(dp[i−1][j],dp[i−1][j−wi]+vi)
dp[i][j]=max(dp[i-1]]]></description><category></category></item><item><title><![CDATA[HTTPS]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108687079</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108687079</guid><author>Xp545945</author><pubDate>Sat, 19 Sep 2020 22:49:41 +0800</pubDate><description><![CDATA[《图解HTTP》-- HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议，经由HTTP进行通信，利用SSL/TLS建立全信道，加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证，同时保护交换数据的隐私与完整性。

HTTPS请求过程

client向service发送请求
service将自己的公钥发送给client
client验证service的公钥，确保公钥是service的。
client生成一个随机密钥用于后续和service通信，并用ser.]]></description><category></category></item><item><title><![CDATA[方法调用字节码命令]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108661410</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108661410</guid><author>Xp545945</author><pubDate>Fri, 18 Sep 2020 11:06:34 +0800</pubDate><description><![CDATA[指令





invokeinterface
调用接口方法，在运行时搜索一个实现了这个接口方法的类型


invokevirtual
调用对象的实例方法，根据对象的实际类型进行分派


invokedynamic
允许应用级别的代码来确定执行哪一个方法调用


invokevirtual
invokevirtual常用与动态分派，即调用子类重写的方法，这里不同于调用接口方法。动态分派使用了虚方法表实现，虚方法表中只会存放可以被重写的方法，而且通常不会包含接口方法。如果虚方法表中将父类的虚方法表中的...]]></description><category></category></item><item><title><![CDATA[小和归并]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108636031</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108636031</guid><author>Xp545945</author><pubDate>Thu, 17 Sep 2020 09:39:13 +0800</pubDate><description><![CDATA[给一个数组，对每个元素计算数组左边比当前元素小的元素和，最后将这些结果再求和。例如{1, 3, 5, 2, 4, 6}的小和为1+4+1+6+15=27。
这个题实际上是逆序数的变形，以元素3来说，后面的5,4,6比3大，所以小和都会将其计算一次，所以我们想要计算是对于任意元素i，右边比i大的元素个数。考虑归并排序能将左右两个有序数组合并，对于左边的任意元素i，都能计算得到右边比i大的元素个数。每一轮合并都能计算的到元素i右边比其大的元素个数，经过所有合并之后，就得能得到原数组中在i右边且比i大的元素个数。]]></description><category></category></item><item><title><![CDATA[KMP和扩展KMP算法]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108635603</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108635603</guid><author>Xp545945</author><pubDate>Thu, 17 Sep 2020 09:20:18 +0800</pubDate><description><![CDATA[KMP算法
KMP算法能解决问题为：给一个主串S，模式串P，计算S中是否包含P，以及出现的位置。
当模式串P和主串S从S[i]匹配到长度L时失配，如果使用暴力匹配则需要从S[i+1]重新匹配，匹配位置在主串上出现回退。当模式串和主串S匹配长度L失配，那么从S[i]开始长度为L-1的子串与P的前L-1个字符是相同的，所以实际上重新匹配时模式串P和主串的S[i+1]匹配等价于模式串P和模式串的子串P[1]的匹配。利用这个现象可以提前计算出关于模式串P的一些匹配规则，可以加快匹配速度。
KMP算法计算的是失配数组]]></description><category></category></item><item><title><![CDATA[PoolThreadCache简单理解]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108602360</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108602360</guid><author>Xp545945</author><pubDate>Tue, 15 Sep 2020 16:27:43 +0800</pubDate><description><![CDATA[PoolThreadCache用户缓存线程申请的内存，Netty中内存需要从PoolArena中申请，而这些申请到的内存在使用完之后不会立刻还给PoolArena，而是将其缓存到线程局部变量中，PoolThreadCache正是是线程局部变量，其创建基于PoolThreadLocalCache，PoolThreadCache作为一个中间层又在一定程度上提高了内存的分配效率。
PoolThreadCache中包含几类属性：

Arena：初始化时与PoolThreadCache关联的Arena。
Memory]]></description><category></category></item><item><title><![CDATA[rebase操作使用方法]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108597504</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108597504</guid><author>Xp545945</author><pubDate>Tue, 15 Sep 2020 12:57:48 +0800</pubDate><description><![CDATA[合并历史提交
我们在开发一个需求时，通常为了防止代码丢失，会进行多次提交，但是在最后push时这些提交记录就没什么用了，所以需要将历史提交进行合并。rebase命令派上了用场：
# 查看提交历史，找到需要变基的提交
git log 
PS D:\xp\doc&gt; git log
commit 9e9cbebb97a7bff19cb592c63c91149b36ea82d3 (HEAD -&gt; master)
Author: xupan &lt;xp545945@163.com&gt;
Date:  ]]></description><category></category></item><item><title><![CDATA[PoolChunk内存分配分析]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108595236</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108595236</guid><author>Xp545945</author><pubDate>Tue, 15 Sep 2020 10:46:47 +0800</pubDate><description><![CDATA[PoolChunck中有以下几个属性和内存分配有关：

pageSize: PoolChunck中每页的大小，下面以8KB为例。
maxOrder：伙伴算法中树的高度从0到maxOrder，下面以11为例。
maxSubpageAllocs：叶子节点的个数，1&lt;&lt;11。
memoryMap: 数组表示的二叉树，数组长度为1&lt;&lt;12。
depthMap：数组表示的二叉树，数组长度为1&lt;&lt;12;
subpages: 叶子节点对应的数组，可以继续切分为小于8KB的大小，所以使用]]></description><category></category></item><item><title><![CDATA[4层代理和7层代理]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108586737</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108586737</guid><author>Xp545945</author><pubDate>Mon, 14 Sep 2020 20:01:02 +0800</pubDate><description><![CDATA[4层代理
4层代理使用NAT技术，Nginx修改数据包里面的目标和源IP和端口，然后数据包发现目标服务，服务器处理王城后，Nginx再做一次修改，返回给请求的客户端。
7层代理
读取并解析HTTP请求内容，然后根据具体内容（URL、参数、Cookie、请求头），转发到相应的服务器，转发的过程是建立和目标机器的连接，然后转发请求，收到响应数据再转发给请求客户端。
4层代理和7层代理的区别

理论上4层要比7层快，因为7层代理需要解析数据包的具体内容，需要消耗额外的CPU。
7层代理能够获得请求的内容，更加灵活]]></description><category></category></item><item><title><![CDATA[TCP报文结构]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108548795</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108548795</guid><author>Xp545945</author><pubDate>Sat, 12 Sep 2020 14:03:10 +0800</pubDate><description><![CDATA[TCP报文结构

端口号
TCP的端口号加上IP确定一个应用进程。

源端口号：通过IP和源端口号来标识报文的返回地址。
目的端口号：接收方计算机上的应用程序接口。

序号和确认号

序号标识本报文段发送的数据组的第一个字节的序号，在TCP中每个字节一个序号。
确认号表示该确认号之前的额数据正确无误的收到，确认号只有当ACK标识为1时有效。

数据偏移
由于TCP头部包含可选项，所以头部长度不确定，数据偏移用来标识头部的长度，最大为60字节。
控制位

URG：紧急指针标识。
ACK：确认需要标识，为1时标]]></description><category></category></item><item><title><![CDATA[fetch和pull区别]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108545177</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108545177</guid><author>Xp545945</author><pubDate>Sat, 12 Sep 2020 09:15:16 +0800</pubDate><description><![CDATA[更新本地代码可以使用git fetch + git merge或者git pull两种方法。在实现上fetch和pull也有一些区别。
fecth
git fetch只从远程拉最新的代码，并修改本地缓存的远程分支的commitID，git fetch之后使用git status就会看到本地分支落后远程分支这种提示。工作示意图：
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-na8oiNHr-1599873308075)(image/fetch示意图.png)]
pull
gi]]></description><category></category></item><item><title><![CDATA[Redis集群]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108534465</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108534465</guid><author>Xp545945</author><pubDate>Fri, 11 Sep 2020 14:51:01 +0800</pubDate><description><![CDATA[Redis集群模式
主从模式
主从模式是基于主从复制的特性设计的，一般是设置一个主节点、多个从节点。主从复制过程如下：

主节点执行bgsave命令，生成RDB快照文件，并使用一个复制缓存区记录整个主从同步期间执行的所有写命令。
主节点将快照文件发送个从节点，从节点收到后执行全量加载，加载之前会将内存中的数据清空。
主节点发送缓存区的数据给从节点进行增量同步。（缓存区采用的是循环数组，所以需要设置合理的大小防止数据覆盖）

哨兵模式
哨兵模式在主从模式上进行了一些优化，引入一个哨兵集群来负责监控Redis集]]></description><category></category></item><item><title><![CDATA[SpringCloud之Hystrix]]></title><link>https://blog.youkuaiyun.com/Xp545945/article/details/108530949</link><guid>https://blog.youkuaiyun.com/Xp545945/article/details/108530949</guid><author>Xp545945</author><pubDate>Fri, 11 Sep 2020 11:24:39 +0800</pubDate><description><![CDATA[什么是服务雪崩效应
服务雪崩效应的是一种因服务提供者不可用导致服务调用者不可用，并将不可用逐渐放大的现象。服务雪崩过程：

服务提供者不可用。
重试加大请求流量。
服务调用者不可用。

应对服务雪崩效应的策略：

服务降级，接口调用失败就调用本地的方法返回一个默认值，防止客户端一直等待。
服务熔断，接口在一个统计时间范围内的请求失败数量达到设定值就开启熔断。之后的请求就会进入提前定义好的一个熔断方法，返回错误信息。在设定时间之后尝试恢复。
服务隔离 ，隔离服务之间的相互影响。
服务监控：在服务发生调用时,会]]></description><category></category></item></channel></rss>