1.前文回顾在之前的几篇内存管理系列文章中,笔者带大家从宏观角度完整地梳理了一遍Linux内存分配的整个链路,本文的主题依然是内存分配,这一次我们会从微观的角度来探秘一下Linux内核中用于零散小内存块分配的内存池——slab分配器。在本小节中,笔者还是按照以往的风格先带大家简单回顾下之前宏观视角下Linux内存分配最为核心的内容,目的是让大家从宏观视角平滑地过度到微观视角,内容上有个衔接,不至于让大家感到突兀。下...
2023-05-24 15:21:50 182浏览 0点赞 0回复 0收藏
在上篇文章《深入理解Linux物理内存分配全链路实现》中,笔者为大家详细介绍了Linux内存分配在内核中的整个链路实现:但是当内核执行到getpagefromfreelist函数,准备进入伙伴系统执行具体内存分配动作的相关逻辑,笔者考虑到文章篇幅的原因,并没有过多的着墨,算是留下了一个小尾巴。那么本文笔者就为大家完整地介绍一下伙伴系统这部分的内容,我们将基于内核5.4版本的源码来详细的讨论一下伙伴系统在内核中的设计与...
2023-05-24 15:15:09 90浏览 0点赞 0回复 0收藏
在经过上篇文章《从内核源码看slab内存池的创建初始化流程》的介绍之后,我们最终得到下面这幅slabcache的完整架构图:本文笔者将带大家继续从内核源码的角度继续拆解slabcache的实现细节,接下来笔者会基于上面这幅slabcache完整架构图,详细介绍一下slabcache是如何进行内存分配的。1.slabcache如何分配内存当我们使用fork()系统调用创建进程的时候,内核需要为进程创建taskstruct结构,structtaskstruct是内核中的核...
2023-05-17 17:13:39 237浏览 0点赞 0回复 0收藏
在上篇文章《细节拉满,80张图带你一步一步推演slab内存池的设计与实现》中,笔者从slabcache的总体架构演进角度以及slabcache的运行原理角度为大家勾勒出了slabcache的总体架构视图,基于这个视图详细阐述了slabcache的内存分配以及释放原理。slabcache机制确实比较复杂,涉及到的场景又很多,大家读到这里,我想肯定会好奇或者怀疑笔者在上篇文章中所论述的那些原理的正确性,毕竟talkischeap,所以为了让大家看着安...
2023-05-17 17:08:44 343浏览 0点赞 0回复 0收藏
在企业开发中,系统的配置信息往往会分不同的环境,如开发环境、测试环境、生产环境。当我们使用nacos作为配置中心时,一定会遇到的问题就是在应用中配置nacos的serveraddr时测试环境的nacos地址和线上nacos地址如何区分的问题拿开发环境和正式环境来说,比如开发环境的nacos地址是nacos.dev.biggerboy.com:8848而正式环境是nacos.biggerboy.com:8848当在开发环境开发完成准备上线时如何将nacos地址切换为正式环境呢?修改配置...
2023-02-08 14:16:05 775浏览 0点赞 0回复 0收藏
昨天看到一个MySQL数据库设计原则:强烈建议表的主键使用整型自增主键。为啥呢?要弄明白这个问题首先需要了解MySQL是如何维护数据的,你需要知道以下几点:MySQL的InnoDB存储引擎是在B+树上维护表数据的B+树是一种平衡树在这棵树上,每个节点在计算机中叫做数据页,默认16k树的叶子节点是完整的行数据,非叶子节点是主键叶子节点中的行数据按id从小到大的顺序排列PS:MySQL索引底层数据结构详细分析过程参考这篇深入分析My...
2023-02-08 14:14:41 843浏览 0点赞 0回复 0收藏
最近创建maven项目的时候一直卡在loadingarchetpelist,一直没有反应。最开始以为是VPN的问题,把VPN关了之后还是没有效果,然后又尝试切换WIFI,发现还是没有用,这样的话暂时排除了网络问题。然后。。。解决方案一然后我就重启了IDEA,发现还是没有什么作用,依然如此。没辙,继续尝试搜索解决方案。解决方案二于是,我又找到了网上的解决方案,他们给的方案有两个:选择自己的JDK版本或者InternalJRE,不过我发现我这里没有I...
2022-06-20 17:43:36 2834浏览 0点赞 0回复 0收藏
某年某月的某一天,就像一张破碎的脸。。。错了,重来。某天,忽然发现大量的告警,经过多番调查研究考察(此处省略3000字),发现是由于Eureka服务下线太慢,而仍然有大量的请求打进来导致的报错。于是,又经过了大量详细周密的考察和研究,终于找到了问题并且解决了(此处省略5000字)。全文完。......好了,那是不可能的啦,怎么说也要意思一下写个300字凑个原创啊。为啥服务都下线了还会有那么多的请求一直进来呢?呐,我们...
2022-06-20 17:43:10 1254浏览 0点赞 0回复 0收藏
对于Java部分的面试来说,突然想到并发这一块的内容是不太完整的,这篇文章会通篇把多线程和并发都大致阐述一遍,至少能够达到了解原理和使用的目的,内容会比较多,从最基本的线程到我们常用的类会统一说一遍,慢慢看。并发编程进程&线程对于基本的概念,大家应该都很熟悉了,进程是资源分配的单位,线程是CPU调度的单位,线程是进程中的一个实体。对于我们的Java程序来说,天生就是多线程的,我们通过main方法启动,就是启动...
2022-06-13 17:42:11 1799浏览 0点赞 0回复 0收藏
读写锁读写锁,也可以称作共享锁,区别于独占锁,共享锁则可以允许多个线程同时持有,如ReentrantReadWriteLock允许多线程并发读,要简单概括就是:读读不互斥,读写互斥,写写互斥。ReentrantReadWriteLock通过阅读源码发现它内部维护了两个锁:读锁和写锁。privatefinalReentrantReadWriteLock.ReadLockreaderLock;privatefinalReentrantReadWriteLock.WriteLockwriterLock;本质上,不管是ReentrantLock还是ReentrantReadWrit...
2022-06-13 17:42:00 1671浏览 0点赞 0回复 0收藏
引用类型像AtomicInteger那种,只能原子更新一个变量,如果需要同时更新多个变量,就需要使用我们的引用类型的原子类,针对引用类型的原子操作提供了3个。AtomicReference:针对引用类型的原子操作。AtomicMarkableReference:针对带有标记位的引用类型的原子操作。AtomicStampedReference:针对带有标记位的引用类型的原子操作。AtomicMarkableReference和AtomicStampedReference非常类似,他们是为了解决CAS中的ABA的问题(别...
2022-06-13 17:41:51 1627浏览 0点赞 0回复 0收藏
CyclicBarrierCyclicBarrier叫做回环屏障,它的作用是让一组线程全部达到一个状态之后再全部同时执行,他和CountDownLatch主要区别在于,CountDownLatch的计数器只能用一次,而CyclicBarrier的计数器状态则是可以一直重用的。我们可以使用CyclicBarrier一样实现上面的需求。publicclassCyclicBarrierTest{publicstaticvoidmain(String[]args)throwsException{ExecutorServiceexecutorServiceExecutors.newFixedThreadPool(10);C...
2022-06-13 17:41:39 2104浏览 0点赞 0回复 0收藏
ForkJoinForkJoin是一个并行执行任务的框架,利用的分而治之的思想。Fork是把一个大的任务拆分成若干个小任务并行执行,Join则是合并拆分的子任务的结果集,最终计算出大任务的结果。所以整个ForkJoin的流程可以认为就是两步:Fork拆分任务,直到拆分到最小粒度不可拆分为止Join计算结果,把每个子任务的结果进行合并fork:join这里我们需要介绍一下主要的几个类:ForkJoinTask:就是我们的分治任务的抽象类RecursiveTask:继承...
2022-06-13 17:41:26 2014浏览 0点赞 0回复 0收藏
提交任务重点说一下几个方法:submit(Runnabletask,Tresult):可以用于主线程和子线程之间的通信,数据共享。submit(Runnabletask):返回null,相当于调用submit(Runnabletask,null)。invokeAll(Collection<extendsCallable>tasks):批量提交任务,阻塞等待所有任务执行完成之后返回,带超时时间的则是在超时之后返回,并且取消没有执行完成的任务。invokeAny(Collection<extendsCallable>tasks):批量提交任务,只要一个任务有...
2022-06-13 17:41:06 2024浏览 0点赞 0回复 0收藏
publicstaticvoidmain(String[]args)throwsException{testInvokeAny();testCompletionService();}privatestaticvoidtestCompletionService(){CompletionService<String>completionServicenewExecutorCompletionService(executorService);List<Future>taskListnewLinkedList<>();for(inti0;i<TOTAL;i++){taskList.add(completionService.submit(newTestTask(i)));}Stringvaluenull;try{for(inti0;i<TOTAL;i++){valuecompletionSe...
2022-06-13 17:40:44 2590浏览 0点赞 0回复 0收藏
阻塞队列并发编程中,队列是其中不可缺少的一环,其实前面在说到线程池的时候,就已经提及到了阻塞队列了,这里我们要一起看看JUC包下提供的这些队列。阻塞队列阻塞队列中的阻塞包含两层意思:插入的时候,如果阻塞队列满,插入元素阻塞删除查询的时候,如果阻塞队列空,删除查询元素阻塞下面列出队列的一些插入和删除元素的方法,一个个来说:add:向队列尾部插入元素,插入成功返回true,队列满则抛出IllegalStateException("...
2022-06-13 17:40:29 1752浏览 0点赞 0回复 0收藏
publicvoidput(Ee){offer(e);neverneedtoblock}publicbooleanoffer(Ee){if(enull)thrownewNullPointerException();finalReentrantLocklockthis.lock;lock.lock();intn,cap;Object[]array;while((nsize)>(cap(arrayqueue).length))tryGrow(array,cap);try{Comparator<superE>cmpcomparator;if(cmpnull)siftUpComparable(n,e,array);elsesiftUpUsingComparator(n,e,array,cmp);sizen+1;notEmpty.signal();}finally{lock.unlock();...
2022-06-13 17:40:21 1907浏览 0点赞 0回复 0收藏
刚看到新闻,IDEA2022最新的EAP体验版本更新了最新的UI,用户需要自己去申请体验资格,看着非常帅,想白嫖一个皮肤。申请等了半天还没有看到邮件回复,好在这届网友比较给力,找了半天,总算找到一个办法可以直接体验。直接去搜索IDEAEAP版本下载,就可以下载到最新的体验版IDEA了,其他版本的不行,我试过了,至于为啥不行,后面说。下载安装好之后,双击shift搜索registry。之后找到这个配置,ide.experimental.ui,把他勾选...
2022-06-13 17:39:51 2610浏览 0点赞 0回复 0收藏
最近看了下关于分布式限流的部分,看到Sentinel的分布式限流,也就是集群限流的部分,想搭个环境看看,结果发现网上关于这方面的内容基本可以说没有,你甚至很难跑起来他的demo,就算能跑起来,估计也得自己研究半天,麻烦的要死。我猜测很重要的原因可能就是Sentinel关于这块做的并不完善,而且从官方的Issue中能看出来,其实官方对于这块后续并没有计划去做的更好。那么废话不多说,在此之前,肯定要先说下关于Sentinel集群限...
2022-06-13 17:38:59 3465浏览 0点赞 0回复 0收藏
实现InitFunc接口,重写init方法,代码直接贴出来,这里整体依赖的是Apollo的配置方式,注释的部分是我在测试的时候写死代码的配置方式,也是可以用的。publicclassDemoClusterInitFuncimplementsInitFunc{privatefinalStringnamespace"application";privatefinalStringruleKey"demosentinel";privatefinalStringruleServerKey"democluster";privatefinalStringdefaultRuleValue"[]";Overridepublicvoidinit()throwsException{...
2022-06-13 17:37:51 2938浏览 0点赞 0回复 0收藏