自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(10)
  • 收藏
  • 关注

原创 JVM模型-内存分配与回收策略

JDK6 之前虚拟机会先检查老年代最大可用连续空间是否大于新生代所有对象空间,成立,Minor GC可以确保是安全的,不成立,虚拟机会查看HandlePromotionFailure 值是否设置为允许担保失败,如果是,那么会继续检查老年代的连续空间是否大于历次晋升到老年代的平均大小,大于会再进行一次Minor GC,小于 ,或者HandlePromotionFailure 设置为不允许毛线,那此时也要改为进行一次Full GC.通过清除老年代数据来扩大老年代的空间,以便给新生代做担保。

2024-10-09 15:52:37 69

原创 深入解析 Elasticsearch 的倒排索引机制

倒排索引是 Elasticsearch 实现快速全文搜索的核心技术。它将文档中的词项与其出现的文档和位置关联起来,使得在大量文档中迅速查找特定词项成为可能。通过深入分析 Elasticsearch 的源码,我们对其倒排索引的实现有了更深入的了解。倒排索引的构建、存储、查询和更新删除是 Elasticsearch 提供快速、准确搜索结果的关键技术。掌握这些源码实现,能帮助我们更好地理解 Elasticsearch 的内部机制,为优化和扩展搜索功能提供有力的支持。

2024-10-09 15:51:09 663

原创 SpringCloud 与 Dubbo的区别

SpringCloud和Dubbo都是现在主流的微服务架构从技术维度上,其实SpringCloud远远的超过Dubbo,Dubbo本身只是实现了服务治理,而SpringCloud现在以及有21个子项目,以后还会更多,所以其实很多人都会说Dubbo和SpringCloud是不公平的,但是由于RPC以及注册中心元数据等原因,在技术选型的时候我们只能二者选其一,所以我们常常为用他俩来对比服务的调用方式,而。

2024-10-09 15:49:54 561

原创 @Contended注解有什么用?

现代CPU中,为了提高访问效率,通常会在CPU内部设计一种快速存储区域,称为缓存(Cache)。在多线程环境下,如果两个或更多的线程在同一时刻分别修改存储在同一缓存行的不同数据,那么CPU为了保证数据一致性,会使得其他线程必须等待一个线程修改完数据并写回主内存后。伪共享(False Sharing)是多线程环境中的一种现象,涉及到CPU的缓存机制和缓存行(Cache Line)。@Contended是Java 8中引入的一个注解,用于减少多线程环境下的“伪共享”现象,以提高程序的性能。1. 什么是伪共享?

2024-10-09 15:47:37 64

原创 JDK1.8对ConcurrentHashMap的优化

但实际情况并非总是如此理想,虽然ConcurrentHashMap类默认的加载因子为0.75,但是在数据量过大或者运气不佳的情况下,还是会存在一些队列长度过长的情况,如果还是采用单向列表方式,那么查询某个节点的时间复杂度为O(n);因此,对于个数超过8(默认值)的列表,jdk1.8中采用了红黑树的结构,那么查询的时间复杂度可以降低到O(logN),可以改进性能。// 如果tab[i]不为空并且hash值为MOVED,说明该链表正在进行transfer操作,返回扩容完成后的table。

2024-10-09 15:43:35 207

原创 Java ConcurrentHashMap何时扩容及扩容流程

ConcurrentHashMap 的扩容是在内部 Segment 中进行的,而不是整个 ConcurrentHashMap 的扩容。需要注意的是,ConcurrentHashMap 的扩容过程会导致一定的性能开销,因为在迁移元素的过程中会涉及到元素的复制和重哈希等操作。迁移完成后,原始的 Segment 会指向新的 Segment,扩容锁会被释放,其他线程可以继续对该 Segment 进行读写操作。迁移过程中,如果有其他线程对该 Segment 进行写操作,新的写操作会被阻塞,等待迁移完成后再进行。

2024-10-09 15:42:13 65

原创 jdk1.8 ConcurrentHashMap中操作流程简述

addCount(),对table中的使用cas方法不断尝试令节点数记录值加一,此时(方法内)如果count>Threshold则改变table状态(对应3中情况)使用resize方法进行table扩容。b. f.hash>0表示当前节点是链表,树的根节点hash值为**-2**(头节点为虚拟节点) 遍历查找节点key值,找到则更新val+break;通过tabAt()方法获取hash对应位置的节点f,当f为空是,表示直接插入节点,使用***casTabAt()***方法插入节点,break;

2024-10-09 15:41:12 292

原创 AQS底层为什么要采用双向链表

解答:首先,单向链表的尾部节点只会记录下一个节点的位置,而不会记录上一个节点的,因此单向链表只会从一个方向查找,双向链表的节点会同时前驱和后继节点,因此无论从哪一个方向查找都可以,对于某些需要双向检索的同步操作和线程调度非常有用。其次:后继节点,需要判断前驱节点的锁的状态,来判断本身节点是否需要继续阻塞等待,单向链表满足不了,因为找不到上一个节点,当然也无法判断。AQS的底层就是采用双向链表,主要包括管理线程队列、快速的插入和删除、动态管理线程的状态、避免线程的阻塞和唤醒的开销。

2024-10-09 15:39:07 84

原创 并发面试必问:什么是AQS? 一文让你彻底搞懂!

CountDownLatch 通过一个计数器来实现这一功能,每当一个操作完成时,计数器减 1,当计数器减到 0 时,所有等待的线程被唤醒。CountDownLatch 主要使用了 AQS 的共享模式,通过 tryAcquireShared 方法判断计数器是否为 0,如果是,则获取同步状态,否则进入等待队列。通过 AQS,开发者可以专注于同步器的具体逻辑实现,而无需关心底层的线程排队和状态管理细节。AQS 是一个用于构建锁和同步器的基础框架,它通过一个先进先出的等待队列管理多个线程的同步操作。

2024-10-09 15:37:19 182

原创 @Autowired 和 @Resource 的区别

在实际使用中,@Autowired更为常用,因为它可以更方便地进行Bean的注入,并且支持更多的注入方式和特性。但是,在Java EE环境中,@Resource也是很常见的注解,因为它可以方便地进行Bean的注入,并且是标准的Java EE注解。

2024-10-09 15:35:53 28

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除