范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

这个面试题居然从11年前就开始讨论了,而官方今年才表态

  大家好,我是歪歪。
  这期给大家盘一个面试题啊,就是下面的第二题。
  这个面试题的图片都被弄的有一点"包浆"了。
  所以为了你的观感,我还是把第二道题目手打一遍。
  啧啧啧,这行为,暖男作者实锤了:
  spring 在启动期间会做类扫描,以单例模式放入 ioc。但是 spring 只是一个个类进行处理,如果为了加速,我们取消 spring 自带的类扫描功能,用写代码的多线程方式并行进行处理,这种方案可行吗?为什么?
  老实说,我第一次看到这个面试题的时候,人是懵的。
  我知道 Spring 在启动期间会把 bean 放到 ioc 容器中,但是到底是单线程还是多线程放,我还真不清楚。
  所以我做的第一件事情是去验证题目中这句话:但是 spring 只是一个个类进行处理。
  怎么去验证呢?
  肯定是找源码啊,源码之下无秘密啊。
  怎么去找呢?
  这个就需要你个人的经验积累了,抽丝剥茧的去翻 Spring 源码,这个就不是本文重点了,所以我就不细说了。
  但是我可以教你一个我一般用的比较多的奇技淫巧。
  首先你肯定要搞个 Bean 在项目里面,比如我这里的 Person:
  然后把项目日志级别调整为 debug:
  logging.level.root=debug
  接着启动项目,在项目里面找 Person 的关键字。
  原理就是这是一个 Bean,Spring 在操作它的时候一定会打印相关日志,从日志反向去查找代码,要快的多。
  所以通过 Debug 日志,我们能定位到这样一行关键日志:
  Identified candidate component class: xxxx.Person.class]
  然后全局搜索关键字,就能找到这个地方:
  这个地方,就是打第一个断点的地方。
  然后启动项目,从调用堆栈往前找,能找到这个地方:
  这个类就是我要找的类:
  org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan
  从源码上看,里面确实没有并发相关的操作,看起来确实是在 for 循环里面单线程一个个处理的 Bean 的。
  那么从理论上讲,如果是两个没有任何关联关系的 Bean,比如我下面 Person 和 Student 这两个 Bean,它们在交给 Spring 托管,往 ioc 容器里面放的时候,完全可以用两个不同的线程处理嘛:
  所以问题就来了:
  如果为了加速,我们取消 spring 自带的类扫描功能,用写代码的多线程方式并行进行处理,这样可以吗?
  可以吗?
  我也不知道啊。
  但是我知道去哪里找答案。
  但是在找答案之前,我先大胆的猜一个答案:不可以。
  为什么?
  因为我看的是 Spring 5.x 版本的源码,在这个版本里面还是单线程处理 Bean。
  对于 Spring 这种使用规模如此之大的开源框架来说,如果能支持多线程加载的话,肯定老早就支持了。
  所以我先盲猜一个:不可以。
  找答案
  这个问题的答案肯定就藏在 Spring 的 issues 里面。
  不要问我为什么知道。这是来自老程序员的直觉。
  所以我直接就是来到了这里:
  1.2k 个 issue,怎么找到我想要找的呢?
  肯定是用关键词搜索一波。基于现在掌握的信息,你说关键词是什么?
  肯定是我们前面找到的这个方法、这个类啊,这也是你唯一掌握到的信息:
  org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan
  话不多说,先拿着类名搜一搜,看看啥情况。
  从搜索结果上看,真的是一搜就中:
  我带你看看这个 issue 的具体内容:
  https://github.com/spring-projects/spring-framework/issues/28221
  有个叫做 kyangcmXF 的同学...
  呃,我第一眼看到他的名字的时候,看到有 F,K 还有 C,第一瞬间想起的是"疯狂星期四"。
  那我就叫他"星期四"同学吧。
  "星期四"同学说:我的项目有数以万计的 Bean 要被 Spring 初始化。所以每次项目启动的时候需要好几分钟才能完成工作。
  然后他发现 doScan 的代码是单线程,一个一个的去处理 Bean 的。
  所以他提出了一个问题:我是不是可以用 ConcurrentHashMap 来代替 Set 数据结果,然后并发加载。
  他的问题和我们文章开头提出的面试题可以说是一模一样。而他甚至还给出了实现的代码:
  然后这个 issue 下只有一个回复,是这样的:
  首先,我们先看看这条回复的人是谁:
  他就是 Spring 的 Contributors,他的回答可以说就是官方回答了。
  他给"星期四"同学说:thanks 老铁,but not possible。
  but post-processing bean definitions asynchronously is not possible at the moment.
  目前不可能异步的对 bean 进行后置处理。
  到这里,我们至少知道了,想用异步加载的方式确实是在实现上有困难,不仅仅是简单的单线程改多线程。
  然后,这个老哥给"星期四"同学指了条路,说如果你想要进一步了解的话,可以看看编号为 13410 的 issue。
  虽然我们现在已经有一个答案了,但是既然大佬指路了,那我肯定高低得带你去瞅上一眼。
  还得从11年前说起
  根据大佬指路的方向,我点开这个 issue 的时候都震惊了:
  https://github.com/spring-projects/spring-framework/issues/13410
  题目翻译过来是"在启动期间并行的处理 Bean 的初始化",紧扣我们的面试题。
  让我震惊的主要是这个 issue 的创建时间:2011 年 10 月 12 号。
  好家伙,原来 11 年前大家就提出了这个问题并进行了讨论。
  但是根据我多年在 github 上冲浪的经验,遇到这种"年久失修"的 issue 不能从头到尾的看,得反着来,得先看最后一个回复是什么时候。
  所以我直接就是一个拉到最后,没想到最后一个回复还挺新鲜,是三个月前:
  回答的这个哥们,也是 Spring 的官方人员,所以可以理解针对这个问题的官方回答:
  这个哥们说了很长一段,我简单的翻译一下:
  他说这个问题在最新的 6.0 版本中也不会被解决,因为它目前的优先级并不是特别高。
  在处理真正的启动案例时,我们经常发现,时间都花在少数几个相互依赖的特定 bean 上。在那里引入并行化,在很多情况下并不能节省多少,因为这并不能加快关键路径。这通常与 ORM 设置和数据库迁移有关。
  你也可以使用"应用程序启动跟踪功能"(application startup tracking)为自己的应用程序收集更多这方面的信息:可以看到启动时间花在哪里以及是如何花的,以及并行化是否会改善这种情况。
  对于 Spring Framework 6.0,我们正专注于本地用例的 Ahead Of Time 功能,以及启动时间的改进。
  到这里,就再次证明了官方对于并行化处理 bean 的态度:
  但是这个哥们的回答中倒没有说"这个功能做不了",他说的是"经过调研,这个功能实现后的收益并不大"。
  而且他还透露了一个关键的信息,针对 Spring 启动速度,在 6.0 里面的方向是 AOT。
  其这也不算透露,早在 2020 年,甚至更早,我记得 Spring 就说过以后的努力方向是 AOT,提前编译(Ahead-of-Time Compilation)。
  如果你对于 AOT 很陌生的话,可以去了解一下,不是本文重点,提一下就行。
  接下来,关于这个 11 年前的帖子,里面的内容还是比较多,我只能带你简单浏览一下帖子,如果你想要了解细节的话,还得自己去看看。
  首先,提出这个问题的人其实已经提出了自己的解决之道:
  核心想法还是在 Bean 初始化的时候引入线程池,然后并发初始化 Bean。只是需要特别考虑的是存在循环依赖的 Bean。
  然后官方立马就站出来对线了:
  小老弟,虽然从代码上看,在 Spring 容器中引入并发的 Bean 初始化看起来是直截了当的方法,但在实现起来并非看起来这么简单。重要的是我们需要看到更多的反馈和需求,当大家都在说"Spring 容器的初始化从根本上说太慢了",我们才会认真考虑这种改变。
  接着有个老哥跳出来说:我这边有个应用启动花了 2 小时 30 分...
  官方针对这个时长也表示很震惊:
  但是他们的核心观点还是:在 Spring 容器中并行化 Bean 初始化的好处对于少数使用 Spring 的应用程序来说是非常重要的,而坏处是不可避免的 Bug、增加的复杂性和意想不到的副作用,这些可能会影响所有使用 Spring 的应用程序,恐怕这不是一个有吸引力的前景。
  官方还是把这个问题定义为"不会修复",因为如果没有强有力的理由,官方确实不太可能在核心框架中引入这么大的变化。
  这个观点也和他的第一句话很匹配:more pragmatic approach.
  more 大家都认识。
  approach,也应该是一个比较熟悉的单词:
  那么 pragmatic 是什么意思呢?
  这个单词不认识很正常,属于生僻词,但是你知道的,我写技术文的时候顺便教单词。
  pragmatic,翻译过来是"务实的"的意思:
  所以"more pragmatic approach",是啥意思,来跟我大声的读一遍:更务实的方法。
  官方的意思是,更务实的方法,就是先找到启动慢的根本原因,而不是把问题甩锅给 Spring,关键是这是核心逻辑,没有强有力的理由,能不动,就别动。
  然后期间就是使用者和官方之间的相互扯皮,一直扯到 5 年后,也就是 2016 年 6 月 30 日:
  官方重要决定:好吧,把这个问题的优先级提升一下,提升为"Major"任务,保留在 5.0 的积压项目中。
  但是...
  好像官方这波放了鸽子。
  直到 2018 年,网友又忍不住了,这个啥进度了呀?
  没有回应。
  又到了 2019 年,啥进度了啊,我很期待啊:
  还是没有回应。
  然后,时间来到了 2020 年。
  三年之后又三年,现在都 9 年了,大佬,啥进度了啊?
  斗转星移,白驹过隙,白云苍狗,换了人间。时间很快,来到了 2021 年。
  让我们共同恭喜这个 issue 已经悬而未决 10 周年了:
  最后,就是今年了,7 月 15 日,网友提问:有什么好消息了吗?
  官方答:别问了,我鸽了,咋滴吧?
  怎么才能快?
  在寻找答案的过程中,我找到了这样的一个项目:
  https://github.com/dsyer/spring-boot-allocations
  这个项目是对于不同版本的 Spring Boot 做了启动时间上的基准测试。
  测试的结论最终都被官方采纳了,所以还是很有权威性的。
  整个测试方法和测试过程以及火焰图什么都在链接里面贴了,我就不赘述了。
  只是把最后的结论搬出来,给大家看看:
  我按照自己的理解翻译一下。
  首先,如果你要采用下面的方法,你就要放弃一些功能,所以不是所有的建议都能适用于所有的应用程序。 从 Spring Boot web starters 中排除下面这些 Classpath:Hibernate Validator;Jackson(但Spring Boot actuators 依赖于它)。如果你需要JSON渲染,请使用 Gson;Logback:使用slf4j-jdk14代替 使用 spring-context-indexer,它不会有很大的帮助,但是有一点点,算一点点。 如果可以,别使用 actuators。 使用 Spring Boot 2.1 和Spring 5.1 版本。当 2.2 和 5.2 可用时,升级到 2.2 和 5.2 版本 用 spring.config.location(命令行参数或 System 属性等)固定 Spring Boot 配置文件的位置。 如果你不需要 JMX,就用 spring.jmx.enabled=false 来关闭它(这是 Spring Boot 2.2 的默认值)。 把 Bean 设置为 lazy,也就是懒加载。在 Spring Boot 2.2 中有一个配置项 spring.main.lazy-initialization=true 可以用。 解压 fat jar 并以明确的 classpath 运行。 用 -noverify 运行JVM。也可以考虑 -XX:TieredStopAtLevel=1 。目的是关闭分层编译。
  至于每个点背后的原因,答案就藏在前面说到的 issue 里面,感兴趣,自己去翻,我就是指个路,就不细说了,有兴趣自己去翻一翻。

聚焦全球年会鲍威尔讲话金银价格能否触底反弹?行情走势早报贵金属市场,周五金价重新承压回落。黄金收盘至1738。05美元,跌幅为1。17(期货黄金前一交易日夜盘收盘389。06元,跌幅0。40)白银收盘至18。90美元,跌幅1永和股份子公司享受西部大开发税收优惠政策e公司讯,永和股份(605020)8月29日晚间公告,公司全资子公司内蒙永和主营业务产品符合国家发改委产业结构调整指导目录(2019年本)和西部地区鼓励类产业目录(2020年本)的乐信首席风控官上任一年后请辞,公司二季度末90天以上逾期率升至2。63记者冯赛琪编辑中概股金融科技公司乐信(NASDAQLX)日前宣布公司高管发生变动,首席风控官(CRO)乔杨因个人原因辞去公司职务,自2022年8月31日起生效。据了解,乔杨在这一位油价又变了,今日加油站9295号售价表,调价后涨幅超过0。2元升车友们,油价又变了!截至到今天8月29日,油价累积上涨约240元吨,折算为上涨约0。180。21元升。本周期运行一半了,油价预计调整幅度不断拉宽,并没有缩小的意思,各位车主要做好油科达自控董事长付国军在北交所成功上市有蛮多获得感本报记者孟珂自2021年9月2日北交所宣布设立至今,有两方面超过预期,一是北交所开市速度超预期,从设立到开市仅用时2个多月二是发展超预期,近一年来北交所高质量扩容加速推进,目前上市5年击败阿里,耻与马云并肩,郭凡生为啥这么狂?1hr大家注意看这段视频。视频是2005年的一段央视财经节目赢在中国,视频中这位戴眼镜的中年人叫郭凡生,他正与台下的一名观众辩论他创立的慧聪网和阿里巴巴,哪一个更有前途?这位年轻的中国人寿董事长白涛推进四化改革构建五大核心优势新华网北京8月26日电(任想)中国人寿将不断改革创新,打好坚守和求变的组合拳,致力于打造世界一流的保险公司。8月26日,在中国人寿保险股份有限公司(以下简称中国人寿)举办的中期业绩最大骗局!经营贷利息真的比房贷低么?最新LPR出炉1年期LPR为3。655年期以上LPR为4。3。这两年受疫情影响,中小微企业陆续出现一些因金链断裂而产生的的风险,央行为了解决问题,除了降息之外,还提供了大量的低息贷华电重工海力风电分别中标海上风电项目近日,中国电建集中采购平台发布中国电建华东院山东能源渤中海上风电B场址工程总承包项目塔筒及其附件标段2采购项目中标公示中国电建华东院山东能源渤中海上风电B场址工程总承包项目塔筒及其欧洲电价破一千村镇银行赔五十2022年8月29日星期一一电价。受俄乌冲突天然气断供影响,欧洲电力危机被彻底引爆。电价气价屡创新高。法国德国的情况尤为严峻,明年交付的基本负荷电价均突破1000欧元兆瓦时大关,相4433选基法则是什么?4433选基法则是什么?Tou过基金的人错过你就损失大了所谓4433法则最主要的衡量因素就是时间第一个4是最近一年业绩排名在同类基金的前14的基金第二个4是最近2年3年5年以来排名
体操女皇程菲近况退役后体重从80斤飙到180,父母担心嫁不出去灵动的马尾辫,自信的笑容,苗条的身材,矫健的身姿,是很多人对程菲的最初印象。体操作为我国仅次于乒乓球的第二大奥运项目,有不少卓越的运动员从中脱颖而出,尤其是女子体操项目,更是人才辈贝克汉姆全家逛迪士尼,妻子穿健美裤合拍心机踮脚,小七快胖成球如今的健美裤就如同连衣裙一样,对于女性来说真的是无法拒绝,尤其是身材苗条的女性,健美裤带来的时尚感不仅仅只是时尚方面的展现,身材还有气质都能完美呈现,不过健美裤对驾驭者的身材要求极孩子什么年龄练字比较合适?在这个快速发展的社会里,孩子的学习也是赶早不赶晚。孩子三岁就得上幼儿园。上幼儿园后,家长又要考虑为孩子报一些兴趣班,比如绘画舞蹈钢琴学习写字等。那么儿童几岁开始练字比较适合呢?1从入秋了,今日分享秋季穿衣指南,爸爸妈妈们快来学习一下吧寒露过后各地气温骤降天寒露重的季节给孩子正确穿衣尤为重要一份幼儿园小朋友秋季穿衣图鉴给有需要的家长朋友们1儿童秋季穿衣三大原则2两暖一凉原则3洋葱穿衣法则4不同场合如何穿衣5不同温孩子我要陪你长大但是没有钱就没办法更好陪伴你今天,看到一个令人泪目的短视频,一个妈妈即将外出打工,被没有睡沉的孩子听到,孩子哭喊我不要钱,我只要妈妈,妈妈说妈妈要挣钱给你买玩具,孩子我以后不要玩具了。都说,陪伴是最好的礼物,成年人的性爱观应该是怎样的?版权归原作者所有,侵删性,本来应该是一件愉悦的事,一不小心却容易造成许多伤害。作为成年人,拥有正确的性爱观,是需要两个人一起努力的。因为在我国,每年约有1300万人次人工流产,重复李小璐贾乃亮离婚3年最受伤的却是女儿甜馨10月23日,恰逢甜馨10岁生日。作为父母,贾乃亮和李小璐都为女儿送上了生日祝福。晒出了甜馨的照片。在贾乃亮的社交平台上,晒出了甜馨看手机,抚摸宠物狗的乖巧照片。而李小璐,也晒出了86版西游记白骨精扮演者刘惠明病逝,享年93岁10月21日中影集团离退一处对外发布讣告中国电影集团公司离休干部,86版西游记白骨精老母扮演者刘惠明,于10月19日在北京病逝享年93岁。央视版西游记中,有一段大家非常熟悉的情节,看完这10位女明星的腹肌,我心动了女明星实在太内卷了,身材管理,一个比一个绝。如今,比起颜值,越来越多的女明星更爱秀腹肌。今天,小八就来简单做一个女明星腹肌前十排名。10。金晨近日,由金晨王安宇主演的电视剧炽道,放秋瓷炫爹不疼娘不爱,高龄产子进ICU,老公于晓光陷入出轨风波秋瓷炫的孤独和落寞爹不疼娘不爱,秋瓷炫的童年有多悲惨?她曾在节目上透露说,自己的童年很苦,妹妹很小的时候不慎掉进水里离开了人世。全家人都十分悲痛,尤其是她的母亲。秋瓷炫回忆童年痛失7个无法超越的经典男性角色,有的一直被模仿,有的无可争议有一些演员塑造了影视剧中的一些经典角色,一提到这个人物,就想起这个演员。并且经过了多年,即便后来的版本演员颜值更高,拍摄的技术和方式更先进,也无法撼动他们在观众眼里的地位,有的甚至