首页 文章 精选 留言 我的

精选列表

搜索[前后端架构],共10000篇文章
优秀的个人博客,低调大师

看看,我如何在面试官前吹牛P

你好,我是 yes。 这篇文章我想谈谈如何在面试官前面吹牛P。 我给了六个案例,教你如何把 B 格提上去。 这篇文章的灵感来自于一个读者,他在群里@了我。 我一看,确实啊! 首先 “几个 offer” 说明关于 Synchronized 的面试题很常见。 然后从 “面试官和我争” 可以看出,确实很多人的理解是错的。 然后你再从 JVM 源码层面和他说说,这面试不就妥了? 如果我是面试官,这候选人透露出来他看过 JVM 代码,并且还发现了书上的错误,说的有理有据的,这 level 不就上来了? 这面试不就稳了? 就是这篇关于Synchronized的一个点。 提升 B 格的时候到了。 想想看,当面试官问你看过什么源码呀? 你答:我看过 JVM 关于 Synchronized 的源码,我发现网上有好多理解都是错误的...阿巴阿巴。 安逸得惨咯! 这么一想,我发现我写过的文章还有好多可以装23的地方! 比如这篇:从Dubbo源码到CPU分支预测之旅 面试官问:看过 Dubbo 源码嘛? 你答:看过,我之前看源码的时候还发现了一个很奇怪的地方,有个地方 if 和 switch结合着用。 我就很奇怪,所以我就用 benchmark 跑了跑,试了试 if 和 switch 的执行效率。 我发现全 if 的效率是最高的。 于是我又反编译了代码。 我发现 switch 是通过查表直接拿索引去访问的,而 if 是每次都会取出变量和条件进行比较。 那不是应该 switch 的效率最佳吗? 带着疑问的我继续查阅资料,后来我发现原来是 CPU 分支预测(详细看上面文章)搞得鬼,所以 Dubbo 的源码才会这样写。 你看,这一波下来,你这表现满分啊! 会主动看源码! 会用示例跑(动手)。 会反编译比较,钻研(动手)。 最后到底层 CPU(6666)。 这一套下来?面试官不要你要谁? 再比如这篇:炸了!一口气问了我18个JVM问题! 面试官:你平时看什么书呀? 你答:我看过《深入理解Java虚拟机》,我还发现了一个错误呢。 面试官:什么错误呀? 你答:不是因为“Con-current Mode Failure”而导致 Full GC ,而是因为发生了 Full GC 所以抛这个错。 我当时好奇看了看 CMS 的源码,我发现..... 后续不贴了,之前的文章写的很清楚了,也是从源码上找证据。 面试官一听,这小伙子看书就算了,因为想钻研还去看源码,源码不仅看进去了还看出错误? 不仅热爱学习还有钻研精神,我要给他发 offer!!!! 再比如这篇:Kafka索引设计与二分查询与底层缓存 面试官:你看过 Kafka 源码嘛? 你答:看过。 当时看到了 Kafka 索引的设计,采用了稀疏索引,利用二分查找来加快搜索速度。 但是我从源码发现这个二分查找是变型的,因为就消息队列的特性而言,索引数据都是在文件末尾追加的写入的,并且写入的数据基本上会立马被读取。 也就是说数据热点集中在尾部,而操作系统又是根据LRU来管理内存页的,所以标准的二分会导致缺页中断的情况发生。 所以 Kafka 巧妙的采用了冷热分区来实现变型的二分查找。 你看看,这一波下来,面试官大拇指不给你给谁? 看过源码, 懂得基本算法,理解消息队列尾部热点特性,晓得操作系统LRU来淘汰内存页,啧啧! 面试官对你说: 再比如这篇:ConcurrentBag 听过没?好家伙高并发知识点十分密集! 面试官:让你设计一个连接池你怎么设计? 你答:我之前看过 HikariCP 的源码。 重点就是无锁设计,因为连接池是读多写少的场景,所以可以利用 CopyOnWriteArrayList 来存储连接,然后再利用本地化存储的思想来减少竞争。 获取连接的流程: 先去 ThreadLocal 找之前用过的连接,找到则直接返回。 如果找不到就去 CopyOnWriteArrayList 实现的 sharedList 里面找连接(这里还有个窃取的概念),如果找到则返回。 如果找不到则用 SynchronousQueue 等待连接,超时则返回 null。 再详细就看上面文章吧。 怎么说? 一般的回答,估计也就会说个加锁保证线程安全。 好点的,说个读多写少场景,用个写时复制。 你这波无锁+写时复制+本地资源加速缓存+SynchronousQueue 无缓存等待队列。 如果你觉得还不够细,那就再说说 HikariCP 的 FastList,它优化了 ArrayList。 ArrayList 每次 get 都会有范围检查,并且 remove 是从前往后遍历的。 而在连接池这个场景每次 get 范围检查没有必要,并且 remove 的时候从后往前遍历更好。 够不够细? 我细到 ArrayList 的 get 的范围检查我都要计较!(HikariCP 不愧是最快的) 面试官可能在角落里瑟瑟发抖。 再比如这个:RPC 核心,万变不离其宗 面试官:让你设计一个RPC框架你怎么设计? 你答:容我想想(假装思考,其实小宇宙就快忍不住爆发了)。 RPC 框架基础的核心其实就这么几点: 动态代理(屏蔽底层调用细节) 序列化(网络数据传输需要扁平的数据) 协议(规定协议,才能识别数据) 网络传输(I/O模型BB一下,一般用 Netty 作为底层通信框架即可) 注意,上面加粗的其实二字,一定要说,要注意语气,要显得你游刃有余,低调奢华。 当然上面只是基础核心,生产级别需要注册中心作为服务的发现、路由分组、负载均衡、异常重试、限流熔断等。 更详细的就看上面的文章吧~ 面试官已经躲在角落里瑟瑟发抖了。 再比如..... 比如不了了,太多了! 不信你去翻翻看! 我写这篇文章的时候,我发现电脑屏幕竟然越来越高。 原来,是我慢慢地从椅子上滑了下去.... 我怕我再举几个例子,我要给自己跪下了。 我时常会看看自己写的文章。 然后,默默在心里念叨这家伙真滴牛P。 所以不要错过我的文章哟,可能每一篇都是装23的机会。 因为微信推送机制,文章可能无法及时送达,所以加个星标,文章必会及时推送~。 唉,再这样下去,我怕和半佛老师一样,成为一个每天在镜子面前给自己磕头的硬核男人。 我是 yes,从一点点到亿点点,我们下篇见。 本文分享自微信公众号 - yes的练级攻略(yes_java)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

每日一博 | 学习 JVM 参数前必须了解的

本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 JVM参数是什么 大家照相通常使用手机就够用了,但是针对发烧友来说会使用更专业的设备,比如单反相机,在单反里有好几个模式,P/A/S/M,其中P是傻瓜模式,程序会自动根据环境设置快门速度和光圈大小,以得到相对合适的曝光效果。A档是光圈优先,用户可以自己设置光圈大小,快门速度等都交给相机程序来决定,类似半自动化的模式。S档是快门优先模式,和A档类似,只是用户可以设置快门速度。最后一个模式是M档,这是纯手动模式,由用户自己来调整快门速度,光圈大小等,这个对人的要求就会很高,但是很多专家往往都会选择M档来拍摄自己的作品。 可以把JVM想象成相机,JVM参数想象成光圈大小,快门速度之类的参数值,这些参数对程序的运行会影响挺大。 java程序跑在JVM上,JVM会根据环境自动设置一些JVM参数,但是这些参数并不能保证一定是最优的,有些参数在启动的时候就基本设置好了,它们在运行的时候还无法调整。为了让JVM能更好地运行你的程序,还是有必要对JVM参数有一定的理解,知道这些JVM参数分别在什么场景下有效果,起到什么作用,比如我们到底期不期望类可以卸载,是否可以在运行的时候打印一些日志协助我们了解JVM的运行情况,出问题的时候是否可以自动给我们做一些现场数据的保留等,这些都是可以通过JVM参数来设置的。 JVM参数有多少 相机调整的无非就那么几个参数值,那JVM参数到底有多少个呢,大概有1000多个,是不是让你很震惊,没错,确实有这么多。 大家可以到 JVM参数 | PerfMa应用性能技术社区 去看看所有这些JVM参数(注:这是PerfMa社区专门为大家分享JVM参数经验的讨论区),当然我们不一定非得对每个JVM参数要了解清楚,但是对一些常见的,有助于性能调优的JVM参数还是有必要了解一下的。 JVM参数通常设置的位置 我们启动一个java程序很简单,命令类似如下 java Main 我们都知道上面的Main是程序的启动类,JVM执行的时候会找到这个Main类里的如下签名的函数 Public static void main(String args[]) 那这里函数的参数args怎么传进来的呢?我们通过在启动命令的主类后面加上相关的参数,参数之间用空格分开,JVM会自动将这些参数作为args的组成部分传进来,比如 java Main arg1 arg2 这样,args这个数组里自动会填充arg1和arg2两个元素,这样在你的程序里就可以使用这些参数了 我们把arg1和arg2这些叫做程序参数,但是和我们课程相关的并不是程序参数,而是JVM参数,那JVM参数放到哪里呢?JVM参数都是放在主类之前,java命令之后,比如 java -Xmx100M Main arg1 arg2 这里的-Xmx100M其实就是JVM参数,所以所有的JVM参数都是放在这个位置的,如果不是这个位置,那你设置的JVM参数将会是无效的,如果参数出现不符合预期的情况,那请第一时间检查的是你JVM参数设置的位置,当然还可能存在一些别的原因导致JVM参数和你设置的情况可能不一致的情况 JVM参数的写法 那JVM参数具体怎么写呢,可以有好几种 “-X” 开头的,比如-Xmx100M “-XX: ” 开头的,比如-XX:+UseG1GC “-” 开头的,比如-verbose:gc 其中-X和-开头的通常会被转换为一个或者多个-XX:开头的参数,只是一个简化的写法,比如说-Xmx100M,JVM里会自动转化为-XX:MaxHeapSize=100M,-verbose:class会自动转换为-XX:+TraceClassLoading -XX:+TraceClassUnloading 通过Flags参数指定JVM参数文件 如果JVM参数都和源码伴着一起发布的话,如果仅仅修改JVM参数也必须拉个分支提交代码,这不是很友好,有什么好办法呢? 我们可以在启动参数里设置一个参数就好,这个参数类似如下 java -XX:Flags=/home/admin/flags Main arg1 arg2 设置过这个参数之后,我们只要在服务的/home/admin目录下创建flags文件,同时在这个文件里指定所有的JVM参数就可以了,但是对flags文件里的参数写法会有些要求,-X之类的参数不能设置,但是可以用其等价的-XX的参数来替代,比如说-Xmx100M,只能用-XX:MaxHeapSize=100M来取代,同时在文件里不要出现-XX:,只要key=value或许+/-key就可以了,不同的参数之间用换行或者空格分开即可,比如flags文件的内容如下: MaxHeapSize=8G +UseG1GC 其实等价于 -Xmx8G -XX:+UseG1GC 可以通过加上-XX:+PrintVMOptions可以打印设置过的JVM参数来验证,比如 java -XX:Flags=/home/admin/flags -XX:+PrintVMOptions Main arg1 arg2 通过VMOptionsFile参数来指定JVM参数文件 使用上面的Flags参数可能会比较别扭,因为设置参数和我们正常的写法不太一样,如果我们的JDK版本大于1.8的话,JVM提供了一个更人性化的参数,那就是VMOptionsFile来取代Flags,这也是指定一个文件,这个文件里的JVM参的写法和我们在java命令后写的JVM参数写法完全一样 java -XX:VMOptionsFile=/home/admin/flags Main arg1 arg2 在flags文件里我们可以这么写 -Xmx8G -XX:+UseG1GC 是不是方便了很多呢 开始JVM参数学习之旅 上面这些内容都了解清楚之后,就可以开始真正学习JVM参数了,我们也专门在社区给大家开了一门免费的学习JVM参数的课程,有兴趣的同学请到PerfMa社区进行了解学习,也欢迎大家参与讨论,慢慢揭开JVM参数的神秘面纱。 一起来学习吧: PerfMa KO 系列之 JVM 参数【Memory篇】

优秀的个人博客,低调大师

SQL Server 2008 R2——分组取前几名

版权声明:本文为博主原创文章 未经许可不得转载 请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我 未经作者授权勿用于学术性引用。 未经作者授权勿用于商业出版、商业印刷、商业引用以及其他商业用途。 本文不定期修正完善,为保证内容正确,建议移步原文处阅读。 <--------总有一天我要自己做一个模板干掉这只土豆 本文链接:http://www.cnblogs.com/wlsandwho/p/4829125.html 耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html ======================================================================= 只是写个简单的例子,不要在意星号什么的。 1 USE tempdb 2 3 IF EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N't_Test') AND OBJECTPROPERTY(id,N'IsUserTable')=1) 4 DROP TABLE t_Test 5 GO 6 CREATE TABLE t_Test( 7 OnLineDate DATETIME, 8 ProductID NVARCHAR(8), 9 WebPage NVARCHAR(32) 10 ) 11 GO 12 INSERT INTO t_Test VALUES(GETDATE(),'11111111','1cccccccccc') 13 WAITFOR DELAY '00:00:01' 14 INSERT INTO t_Test VALUES(GETDATE(),'11111111','1eeeeeeeeee') 15 WAITFOR DELAY '00:00:01' 16 INSERT INTO t_Test VALUES(GETDATE(),'11111111','1bbbbbbbbbb') 17 WAITFOR DELAY '00:00:01' 18 INSERT INTO t_Test VALUES(GETDATE(),'11111111','1dddddddddd') 19 WAITFOR DELAY '00:00:01' 20 INSERT INTO t_Test VALUES(GETDATE(),'11111111','1aaaaaaaaaa') 21 WAITFOR DELAY '00:00:01' 22 INSERT INTO t_Test VALUES(GETDATE(),'22222222','2aaaaaaaaaa') 23 WAITFOR DELAY '00:00:01' 24 INSERT INTO t_Test VALUES(GETDATE(),'22222222','2cccccccccc') 25 WAITFOR DELAY '00:00:01' 26 INSERT INTO t_Test VALUES(GETDATE(),'22222222','2eeeeeeeeee') 27 WAITFOR DELAY '00:00:01' 28 INSERT INTO t_Test VALUES(GETDATE(),'22222222','2dddddddddd') 29 WAITFOR DELAY '00:00:01' 30 INSERT INTO t_Test VALUES(GETDATE(),'22222222','2bbbbbbbbbb') 31 GO 32 33 SELECT OnLineDate,ProductID,WebPage,ROW_NUMBER() OVER(PARTITION BY ProductID ORDER BY OnLineDate DESC) AS rowRum FROM t_Test 34 GO 35 ----------------------------- 36 WITH t_Temp 37 AS 38 ( 39 SELECT OnLineDate,ProductID,WebPage,ROW_NUMBER() OVER(PARTITION BY ProductID ORDER BY OnLineDate DESC) AS rowRum FROM t_Test 40 ) 41 SELECT * FROM t_Temp 42 WHERE t_Temp.rowRum<=3 43 GO 44 ----------------------------- 45 WITH t_Temp 46 AS 47 ( 48 SELECT OnLineDate,ProductID,WebPage,ROW_NUMBER() OVER(PARTITION BY ProductID ORDER BY OnLineDate DESC) AS rowRum FROM t_Test 49 ) 50 SELECT * FROM t_Temp 51 WHERE t_Temp.rowRum<=3 ORDER BY ProductID ASC,OnLineDate DESC 52 GO ======================================================================= 最近没什么好写的,QQ群里有人问问题,就随手写了一个。 然而那人拿了之后就再也没有反应/反馈了。 所以只能对广大伸手党说一句,我真心希望你们都能看看《你的知识需要管理 田志刚》这本书。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册