<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[SHENLANLiP的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/SHENLANLiP</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; SHENLANLiP]]></copyright><item><title><![CDATA[synchronized关键字]]></title><link>https://blog.youkuaiyun.com/SHENLANLiP/article/details/148669626</link><guid>https://blog.youkuaiyun.com/SHENLANLiP/article/details/148669626</guid><author>SHENLANLiP</author><pubDate>Sun, 15 Jun 2025 13:55:09 +0800</pubDate><description><![CDATA[当锁竞争非常激烈时，无法通过自旋获取锁的线程会被阻塞挂起，等待操作系统调度。：自旋锁任务锁的状态不会持续太久，选择不断检测锁是否释放，而不是阻塞自己，这避免了变态，但也会占用CPU时间，因此自旋次数有限制，这个次数是自适应的。线程如果自旋成功了，那么下次自旋的次数会更加多，反之，如果对于某个锁，很少有自旋能够成功，那么在以后要或者这个锁的时候自旋的次数会减少。jdk1.6后JVM 为了减少锁的开销，引入了多种锁的状态，并根据实际的竞争情况进行升级，而不是一开始就使用开销最大的重量级锁。]]></description><category></category></item><item><title><![CDATA[线程池原理分析]]></title><link>https://blog.youkuaiyun.com/SHENLANLiP/article/details/148609460</link><guid>https://blog.youkuaiyun.com/SHENLANLiP/article/details/148609460</guid><author>SHENLANLiP</author><pubDate>Thu, 12 Jun 2025 14:20:13 +0800</pubDate><description><![CDATA[阿里开发手册写到建议使用 `ThreadPoolExecutor` 去创建线程池，而不是 `Excuteors`，因为`Excuteors`使用的是**无界队列**，可能导致** OOM**（核心线程数）： 线程池中始终保持活动的线程数。即使这些线程处于空闲状态，也不会被回收，除非设置了为true。（最大线程数）： 线程池允许创建的最大线程数。（保持活动时间）： 当线程池中的线程数大于核心线程数时，多余的空闲线程在等待新任务的最长时间。超过会被回收，直到线程数等于核心线程数。]]></description><category></category></item><item><title><![CDATA[JVM垃圾回收]]></title><link>https://blog.youkuaiyun.com/SHENLANLiP/article/details/148382978</link><guid>https://blog.youkuaiyun.com/SHENLANLiP/article/details/148382978</guid><author>SHENLANLiP</author><pubDate>Mon, 02 Jun 2025 15:58:59 +0800</pubDate><description><![CDATA[现在的商业虚拟机都采用这种收集算法来回收新生代，但是并不是将新生代划分为大小相等的两块，而是分为一块较大的 Eden 空间和两块较小的 Survivor 空间，每次使用 Eden 空间和其中一块 Survivor。如果并发标记和清理的速度跟不上应用程序生成垃圾的速度，导致在CMS回收过程中，老年代的内存被耗尽，此时CMS无法继续进行并发回收，JVM会立即启动一个“备用”的、完全STW的Serial Old。将存活的对象进行标记（第一次遍历），然后清理掉未被标记的对象（第二次遍历）。，以提升总的吞吐量。]]></description><category></category></item><item><title><![CDATA[JVM内存结构详解]]></title><link>https://blog.youkuaiyun.com/SHENLANLiP/article/details/148353425</link><guid>https://blog.youkuaiyun.com/SHENLANLiP/article/details/148353425</guid><author>SHENLANLiP</author><pubDate>Sat, 31 May 2025 16:58:53 +0800</pubDate><description><![CDATA[管理本地方法的调用，本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区，它甚至可以直接使用本地处理器中的寄存器，直接从本地内存的堆中分配任意数量的内存。本质上，方法的退出就是当前栈帧出栈的过程。，即可将这个方法与所属的类型进行绑定，这样一来，由于明确了被调用的目标方法究竟是哪一个，因此也就可以使用静态链接的方式将符号引用转换为直接引用。除了一些 Native 方法调用是通过本地方法栈实现的，其他所有的 Java 方法调用都是通过栈来实现的（也需要和其他运行时数据区域比如程序计数器配合）。]]></description><category></category></item><item><title><![CDATA[Spring循环依赖问题]]></title><link>https://blog.youkuaiyun.com/SHENLANLiP/article/details/148343723</link><guid>https://blog.youkuaiyun.com/SHENLANLiP/article/details/148343723</guid><author>SHENLANLiP</author><pubDate>Fri, 30 May 2025 20:00:55 +0800</pubDate><description><![CDATA[用于延迟创建早期 Bean 引用，为什么要延迟？如果仅仅是解决循环依赖问题，使用二级缓存就可以了，但是如果 Bean A 实现了AOP，那么注入到其他bean的时候，并不是最终的代理对象，而是原始的，这会导致 B 无法 huodeA 上定义的 AOP 功能，这时就需要通过三级缓存的ObjectFactory 实现代理对象的延迟创建，才能提前产生最终的需要代理的对象。二级缓存 (earlySingletonObjects): 存储的是 Bean 实例的早期引用 (Early Bean Reference)。]]></description><category></category></item></channel></rss>