<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[LJZFlying的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/LJZFlying</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; LJZFlying]]></copyright><item><title><![CDATA[线程池原理]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/144487167</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/144487167</guid><author>LJZFlying</author><pubDate>Sun, 15 Dec 2024 14:54:07 +0800</pubDate><description><![CDATA[addWorker中调用new Worker( Runnable firstTask) ,传入当前任务 , 内部实现为 :赋值当前任务,并调用ThreadFactory创建线程。线程创建顺序 :  先创建核心线程数 ,满了之后 ,再来的线程进入workQueue ,如果workQueue也满了,就在外面排队(创建非核心线程) ,如果队列已满 ,且工作线程<最大线程数,则创建新的线程并提交任务,启动。如果当前工作线程<核心线程数,则创建新的线程并且提交任务,线程池中的每一个线程被封装成一个Worker对象。]]></description><category></category></item><item><title><![CDATA[Spring原理]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/144437411</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/144437411</guid><author>LJZFlying</author><pubDate>Thu, 12 Dec 2024 22:12:57 +0800</pubDate><description><![CDATA[--->初始化前(@PostContruct) ---->初始化(afterPropertiesSet)--->初始化后(AOP)---->如果使用Aop,则成为代理对象---->Bean。限流原理 : 底层维护了一个滑动数组时间窗 ,假设第一秒调用10次 ,报错8次 ,记录到数组的第一个元素 ,第2秒调用以此类推,放到第二个元素中,第10秒,调用10次,报错9次。]]></description><category></category></item><item><title><![CDATA[阿里云Java删除和上传OSS文件]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/143838901</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/143838901</guid><author>LJZFlying</author><pubDate>Sun, 17 Nov 2024 21:29:03 +0800</pubDate><description><![CDATA[/ 填写上传到OSS的对象完整路径，例如exampledir/exampleobject.txt。//下面是一个生成签名URL的简单示例（注意：这里只是示例，实际使用时需要根据你的需求设置参数）。// 如果你的Bucket是公开的（public-read），你可以直接使用以下URL进行下载。// 如果你的Bucket是私有的，你需要生成一个签名URL来下载文件。// 注意：这里的URL有效期是根据你设置的参数来的，默认是30秒。// 填写Bucket名称，例如examplebucket。]]></description><category></category></item><item><title><![CDATA[JVM原理]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/143825252</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/143825252</guid><author>LJZFlying</author><pubDate>Sat, 16 Nov 2024 23:06:06 +0800</pubDate><description><![CDATA[Java类加载器以及JVM原理和调优]]></description><category></category></item><item><title><![CDATA[redis五种数据结构的使用场景]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124700836</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124700836</guid><author>LJZFlying</author><pubDate>Wed, 11 May 2022 00:52:22 +0800</pubDate><description><![CDATA[高版本的redis其实不止5中数据结构了，常见的有string，list，sort，set，zset。

先聊Hash ，

Hash结构使用场景 ：存放购物车中订单 。一个用户，一个购物车，很多个商品。

（1）。以用户id为key，

（2）。商品id为field

（3）。商品数量为value

添加商品 ： -- hset cart(key) :1001 1008(field) :1(value)

删除商品： --hdel cart ：1001 1008

Hash的优缺点：

优点：1. 同类数]]></description><category></category></item><item><title><![CDATA[ThreadLocalMap原理源码级讲解]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124678474</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124678474</guid><author>LJZFlying</author><pubDate>Tue, 10 May 2022 01:24:52 +0800</pubDate><description><![CDATA[1.7版本和1.8版本是不一样的。

1.7版本：

ThreadLocal里面维护一个TheradLocalMap，底层是Map，再底层是entry对象，（key，value）形式，key是Thread，value是需要隔离的变量。

1.8版本 ：

每个Thread都维护了一个ThreadLocalMap，底层是Map，再底层是entry对象，entry中存储ThreadLocal是key，value是需要隔离的变量。

1.8版本的好处 ：

1 .每个Map存储的Entry数量很少，因为1.7版本]]></description><category></category></item><item><title><![CDATA[从CAP角度分析redis分布式锁和zookeeper锁区别]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124535146</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124535146</guid><author>LJZFlying</author><pubDate>Mon, 02 May 2022 01:58:51 +0800</pubDate><description><![CDATA[前言：

在分布式系统中，一致性( c )意味着每次读取都会获取最新的写入数据或异常，可用性( a )意味着可以对每个请求得到非异常的响应，而不保证获取最新的写入数据。 分区容错( p )意味着即使节点之间的网络异常，系统也将继续操作。

redis是AP架构，所谓牺牲的一致性，如果reid在主从同步锁的key时，出现挂机情况，那这样是会丢失锁的。出现主从架构锁是失效问题

解决方案：

RedLock （红锁方案已经被淘汰） ： 底层实现手段和zookeeper类似，客户端发送setnx指令，同时向多..]]></description><category></category></item><item><title><![CDATA[Java申请堆外内存之后，如何释放]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124485957</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124485957</guid><author>LJZFlying</author><pubDate>Fri, 29 Apr 2022 00:11:01 +0800</pubDate><description><![CDATA[因为Jvm无法管理堆外内存，所以如何回收呢？

首先是堆外内存如何申请的呢？

通过unsafe中的allocateMomory方法，参数为size（申请的堆外内存大小），并返回内存地址base；

清除时，创建Cleaner对象，调用Cleaner.creat（this（当前堆外内存Buffer），内存释放器。）

内存释放器Deallocator 的底层是有个run方法，调用unsafe.freeMemory去释放空间
...]]></description><category></category></item><item><title><![CDATA[SpringMVC执行流程]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124436514</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124436514</guid><author>LJZFlying</author><pubDate>Tue, 26 Apr 2022 22:37:21 +0800</pubDate><description><![CDATA[一、首先，我们先来认识一下SpringMVC的主要组件
前端控制器（DisatcherServlet）:接收请求，响应结果，返回可以是json,String等数据类型，也可以是页面（Model）。
处理器映射器（HandlerMapping）:根据URL去查找处理器，一般通过xml配置或者注解进行查找。
处理器（Handler）：就是我们常说的controller控制器啦，由程序员编写。
处理器适配器（HandlerAdapter）:可以将处理器包装成适配器，这样就可以支持多种类型的处理器。
视图解析器（V]]></description><category></category></item><item><title><![CDATA[Mysql和redis数据同步解决方案]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124392038</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124392038</guid><author>LJZFlying</author><pubDate>Sun, 24 Apr 2022 23:36:17 +0800</pubDate><description><![CDATA[mysql集群

1 主从复制 解决单机故障问题

2 高可用 对外提供一个主节点，投票选举机制.

3 cluster集群，多个主节点

怎么优化单个主节点的处理能力？从主从复制出发

主节点 master 写操作，数据变更，binlog记录。会有一个dump线程和从节点的I/O线程交互，dump将binglog中具体数据传给IO线程。

从节点，slave 开启I/O线程，从主节点读取binglog，将其写入 relay log （中继日志），再通过sql线程，读取relay log ，写入从库。


]]></description><category></category></item><item><title><![CDATA[JVM调优]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124373108</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124373108</guid><author>LJZFlying</author><pubDate>Sun, 24 Apr 2022 01:42:20 +0800</pubDate><description><![CDATA[jdk1.8默认的PS+PO回收器；

ParallelGC 默认的是 Parallel Scavenge（新生代）+ Parallel Old（老年代）。

什么是调优：

1 .根据需求进行JVM规划和预调优

2 .优化运行JVM运行环境（慢，卡顿）

3. 解决JVM运行过程中出现的各种问题.

linux指令

top 查看那个进程的CPU占用比较高

左边第一列是进程号。



top -Hp 进程号 查看进程中具体哪个线程占用的CPU高

左边第一列是线程号，将线程号转成16进制，去jstac]]></description><category></category></item><item><title><![CDATA[redis的过期键删除策略]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124211266</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124211266</guid><author>LJZFlying</author><pubDate>Sat, 23 Apr 2022 23:50:15 +0800</pubDate><description><![CDATA[Redis 中 key 的过期删除策略





Redis 中提供了三种过期删除的策略





1、定时删除





在设置某个 key 的过期时间同时，我们创建一个定时器，让定时器在该过期时间到来时，立即执行对其进行删除的操作。





优点：





通过使用定时器，可以保证过期 key 可以被尽快的删除，并且释放过期 key 所占用的内存





缺点：





对 CPU 是不友好的，当过期键比较多的时候，删除过期 key 会占用相当一部分的 CPU 资源，对服务器的响应时间和吞吐量造]]></description><category></category></item><item><title><![CDATA[GC的演化]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124360996</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124360996</guid><author>LJZFlying</author><pubDate>Sat, 23 Apr 2022 23:48:48 +0800</pubDate><description><![CDATA[随着内存大小的不断增长而迭代：

- Serial 和Serial Old单线程 STW （stop the world）年轻代和老年代都是单线程回收，回收期间，其他线程（业务线程）全部停止，不准创建对象，垃圾等。

- parallel 并行多线程，多线程回收垃圾，但是回收期间，其他线程依旧是等待。

- Concurrent GC 包括（CMS，ParNew等）： GC线程和业务线程可以同时运行。

ParNew：工作在年轻代的垃圾回收线程。ParNew收集器就是Serial收集器的多线程版本，它也是一]]></description><category></category></item><item><title><![CDATA[常见的负载均衡算法]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124211416</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124211416</guid><author>LJZFlying</author><pubDate>Sat, 16 Apr 2022 12:13:06 +0800</pubDate><description><![CDATA[1.轮询法

轮询法即逐个请求，对于每一个请求，则在地址列表中依次选择一个地址，因此在请求数目上的分配相对比较均衡。

2.随机法

随机法则是随机分配给地址列表中的任一服务器。这个例子则通过随机生成列表长度内的一个整数，然后获取其地址来实现的。

3.源地址哈希法


  该方法通过对发送请求的客户端的ip地址进行求hash值，并对服务地址列表长度取余，选择结果对应的服务器。该方法保证了同一客户端ip地址会被映射到相同的后端服务器上，直到后端服务器列表发生了改变。根据这个特性，可以在服务消费者和...]]></description><category></category></item><item><title><![CDATA[Spring事务失效场景]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124210064</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124210064</guid><author>LJZFlying</author><pubDate>Sat, 16 Apr 2022 10:57:30 +0800</pubDate><description><![CDATA[Spring事务的原理是AOP，进行了切面增强，那么失效的根本原因是这个AOP不起作用了。



1.发生自调用，类里面使用this调用本类的方法，此时这个this对象不是代理类，（不是Autowried注入进来的spring代理对象）。

2.方法不是public的，如果非要用在非public上，开启Aspect代理模式。包括final和static修饰方法，也都会事务失效。

3.数据库是否支持事务，

4。异常被捕获，没有抛出，事务不会回滚。

5 没有被spring容器管理，我们通过@Control]]></description><category></category></item><item><title><![CDATA[Spring事务的传播机制]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124209392</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124209392</guid><author>LJZFlying</author><pubDate>Sat, 16 Apr 2022 10:47:40 +0800</pubDate><description><![CDATA[For Example:

方法A是一个事务方法，A执行过程中调用了B方法，那B方法有无事务，以及对事务的处理方式不同，都会对A的事务造成影响。同时A的事务也会对B的事务产生影响。

所有的参数都是修饰被调用方（B）

1. required (默认) ： 如果当前（调用方A）没有事务，则自己（被调用方B）新建一个事务，如果当前存在事务，则加入事务。

解释： 如果A有事务，A调用B，则B会新建事务。 如果A没有事务，B有事务，那么A就会加入B事务。

2. support : A调用B， 如果当前存在事.]]></description><category></category></item><item><title><![CDATA[redis的持久化]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124203769</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124203769</guid><author>LJZFlying</author><pubDate>Fri, 15 Apr 2022 23:33:40 +0800</pubDate><description><![CDATA[RDB和AOF持久化

RDB是redis的默认选择，

启动redis --&gt; 定时任务（默认60s，一万条数据等作为阈值，触发线程）（把内存数据写入磁盘）--&gt;产生持久化文件 --&gt;关机（内存数据丢失）--&gt;开机会读取磁盘回到内存。 大概流程



RDB持久化原理：

redis会单独创建一个fork子进程，它与当前进程一模一样（所有数据，变量，环境变量，程序计数器等）都和原进程一样，会先把数据写到临时文件（dump.rdb），待持久化行为结束，再将新的临时文件替换上次的旧持久]]></description><category></category></item><item><title><![CDATA[InnoDB和MyISAM的区别]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124203570</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124203570</guid><author>LJZFlying</author><pubDate>Fri, 15 Apr 2022 20:50:14 +0800</pubDate><description><![CDATA[1.InnoDB默认是支持事务的，另一个 不支持事务。 这是被淘汰的最重要原因吧，

2.InnoDB支持外键，另一个不支持。

3. InnoDB是聚集索引，另一个是非聚集索引。

4.InnoDB不保存表的具体行数，select count（*）需要全表扫描， 而MyISAM有个函数，读取一下就知道了

5.InnoDB最小的锁粒度是行锁，MYSAM最小的是表锁，性能不太行。

6.读写修改频繁，用InnoDB，仅仅查询用MyISAM，效率更高。取决于业务
......]]></description><category></category></item><item><title><![CDATA[Sync锁详解]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124185186</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124185186</guid><author>LJZFlying</author><pubDate>Fri, 15 Apr 2022 00:37:18 +0800</pubDate><description><![CDATA[实际上1.6之前的Sync锁是性能不太好的，是非常重的锁（重量级锁）。

重量级锁 ：只有一个线程能获取锁，其他线程被迫进入阻塞队列，空等，消耗cpu资源。

实际业务中 ： 虽然为了保证安全必须加锁，但是并不一定会使用很多线程 ，所以引入了偏向锁的概念： 让下一次锁资源竞争时，更容易把锁分配给上一次抢到资源的锁 （example：给上次的线程加个id，下次去抢线程时直接报上姓名，让锁能识别这个线程，ok，再分给它资源）

这样可以解决很多只有一个线程的业务，增加效率。

如果很多个线程开始抢资源，ok，这]]></description><category></category></item><item><title><![CDATA[CAS底层]]></title><link>https://blog.youkuaiyun.com/LJZFlying/article/details/124185033</link><guid>https://blog.youkuaiyun.com/LJZFlying/article/details/124185033</guid><author>LJZFlying</author><pubDate>Thu, 14 Apr 2022 23:58:35 +0800</pubDate><description><![CDATA[CAS解决原子性问题：

底层通过unsafe类，是native关键字修饰的，Java调用本地操作系统，

openJdk里面能看到，C++写的，x86结构（inter的CPU），底层是用lock锁（多核CPU的情况下，cmpxchgq （应该叫compare And exchange））来保证原子性的。



CAS解决ABA问题：

通过原子类引用 AtomicStampedReference等等 ，给资源加上版本号（version），保证安全
...]]></description><category></category></item></channel></rss>