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