IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:JAVA

共 216 篇相关文章

IT 累计浏览 2,278

关于hashcode 里面 使用31 系数的问题

这篇从Java源码中常见的“乘以31”现象切入,详细探讨了为什么在实现hashCode方法时,开发者普遍选择31这个特定系数。作者没有停留在“它是质数”的简单结论上,而是深入剖析了31在计算机二进制表示下的独特优势:它不仅是质数,能减少哈希冲突,更关键的是31 * i 可以被编译器优化为 (i << 5) - i 的位运算操作,在保证分布均匀的同时,显著提升了计算效率。 文章进一步对比了其他可能的质数(如17、33),用数据和理论说明了31在“性能”与“冲突概率”之间取得的绝佳平衡点。通过阅读String类等核心库的hashCode实现,我们可以看到这个设计选择背后的工程智慧。对于想深入理解哈希表底层优化的开发者来说,这篇文章提供了一个非常扎实的微观视角。

IT 累计浏览 3,429

无限递归导致 Segmentation fault

这篇讲的是一个看似莫名其妙的服务器故障。某台服务器上的定时任务——一个 shell 脚本周期性地调用 Java 程序——突然开始频繁报“Segmentation fault”。这个错误通常和底层内存访问有关,很容易让人以为是 JVM 本身或者硬件出了问题。 但作者没有停留在表面。他顺着线索一层层深挖,最终发现问题并不在 Java 虚拟机,也不在宿主环境,而是藏在了业务代码逻辑里。罪魁祸首竟然是代码中一个未能正确终止的无限递归调用。递归层层叠加,最终耗尽了线程栈内存,从而触发了操作系统的这个致命错误。 整个排查过程清晰地展示了如何从令人困惑的系统层错误日志入手,抽丝剥茧,最终定位到应用层的逻辑漏洞。它提醒我们,即使遇到像“Segmentation fault”这样底层、凶险的报错,排查的起点也永远应该是审视最上层的代码逻辑。

IT 累计浏览 5,457

Java应用运维

这篇讲的是Java应用运维如何从零开始,一步步构建出自动化体系的过程。作者以亲身经历出发,描绘了运维工作随着应用规模增长而不断演进的典型路径。 文章首先从最基础的单机部署讲起:用Maven打包、SCP上传、执行启动脚本,再通过一个简单的JSP文件验证应用是否真正跑起来了。随着发布需求增多,脚本开始支持应用包和静态页面的快速更新与回滚。当应用从一台扩展到多台服务器时,运维工作又面临新挑战——不仅要搭建负载均衡环境,还要实现分批发布、灰度发布等策略。作者详细描述了如何通过脚本管理多台服务器,最终发展出一个包含应用信息登记、发布管理和权限控制的Web版运维系统。 这个演进过程的核心,是“用脚本解决重复劳动,用系统管理复杂度”。从最初的手工操作,到积累出环境部署、应用发布、负载均衡管理等一系列脚本,再到整合成支持多应用、多权限的运维平台,每一步都紧扣实际痛点。文章最后还提到,当运维规模继续扩大,还会遇到VLAN划分、虚拟化引入等更高级的挑战,为读者留下了进一步思考的空间。

IT 累计浏览 1,950

游戏收费方式的一点思考

这篇讲的是游戏收费模式的未来可能。作者从筹备新项目时一次与投资人的晚餐闲聊切入,话题自然引向了几年前盛大那次轰动行业的“免费游戏”策略转型。当年那场变革,让游戏从时间收费转向道具收费,深刻重塑了行业。 在饭局上,投资人的提问将思考推向了更远:免费模式是否已走到终点?未来几年,会不会出现新的、足以颠覆现状的收费方式?作者由此与朋友展开了一场深入的讨论。文章并非给出确定答案,而是从行业演进的脉络、玩家心态的变化以及技术驱动的可能性等几个维度,梳理了这场讨论中的核心脉络与猜想。它试图探寻,在免费模式红利逐渐消退的今天,下一个让玩家心甘情愿付费的“价值锚点”可能会是什么。

IT 累计浏览 5,939

Storm源码浅析之topology的提交

这篇讲的是Storm源码中topology提交的实现细节。作者从拓扑提交的整体流程切入,逐步剖析了Storm Master如何接收客户端请求、序列化拓扑结构,并借助ZooKeeper进行协调,将配置分发到集群的Supervisor节点。核心实现思路围绕着提交过程中的几个关键阶段:包括拓扑的验证、资源的预分配以及worker的启动调度。文章巧妙揭示了Storm如何在源码层面处理故障恢复,比如通过持久化拓扑状态到ZooKeeper,确保集群重启后能自动重新部署。 具体来说,作者深入分析了提交流程中涉及的核心类和方法,如`StormSubmitter`和`Nimbus`服务的交互逻辑。文中突出了Storm的一个巧妙设计——在提交时动态计算并调整worker的数量,以适应集群资源变化,这增强了系统的弹性和负载均衡能力。通过源码走读,读者能清晰看到从客户端提交拓扑到集群执行的数据流转和错误处理机制,例如网络通信的重试策略和序列化格式的选择。这对于理解分布式流处理框架的部署和运维提供了扎实的底层视角,尤其适合对Storm内部运作感兴趣的开发者参考。

IT 累计浏览 5,729

Storm源码浅析之topology的提交

这篇讲的是Apache Storm中,一个topology从提交到成功运行的完整源码旅程。作者没有停留在概念层,而是直接从客户端发起`submitTopology`调用开始,一路追踪到底。 核心在于展示客户端如何将整个拓扑的计算图(spouts和bolts的连接关系、配置等)序列化,并通过Thrift RPC发送给Nimbus主节点。文章细致地拆解了Nimbus接收请求后的处理流程,比如它如何将提交的拓扑信息持久化到ZooKeeper,从而保证即使Nimbus重启,拓扑状态也能恢复。 巧妙之处在于,Storm将“提交”这个动作设计为一个异步过程。客户端提交后得到的只是一个拓扑ID,实际的调度和启动完全由Nimbus和Supervisor节点在后台协作完成。这种设计解耦了客户端操作与集群资源调度,是理解Storm分布式协调机制的一个绝佳入口。对于想深入理解分布式系统如何处理元数据提交与容错的开发者来说,跟着这篇源码分析走一遍,会对Storm的鲁棒性有更直观的认识。

IT 累计浏览 2,859

最奇特的编程语言特征

这篇文章从一个技术社区的热门讨论切入,探讨了各类编程语言中最“奇特”甚至“反直觉”的语法特性。作者以LISP那标志性的、层层嵌套的括号为例,指出这类特征因其不符合常规思维习惯而常被诟病,但它并非个例。 文章核心来自一个征集帖,其中收集了超过320个来自不同语言的“奇特”代码片段。据观察,JavaScript在这方面“问题”最多,C、Java、Python、PHP等主流语言也榜上有名。这些特性可能让初学者摸不着头脑,有的却暗含语言设计的深层逻辑。 作者并未止步于猎奇,而是通过汇总这些案例,揭示了语言设计中“合理”与“反常”之间的有趣张力。读完能让你意识到,那些看似“奇怪”的语法,或许正是理解一门语言哲学和历史背景的一把钥匙。

IT 累计浏览 2,932

Hash Collision DoS 问题

最近出现了一个叫 Hash Collision DoS 的安全漏洞,它能让服务器变得异常缓慢。问题的根源在于,许多编程语言的哈希算法存在非随机性,攻击者可以构造大量 key 相同但 value 不同的数据,导致服务器的哈希表退化为一条长长的单向链表。这样一来,原本高效的数据检索会变成耗时的线性查找,CPU 使用率轻松飙升至 100%,造成严重的拒绝服务。 目前,Java、PHP、Python、Ruby 等主流语言都受到影响。这篇文章清晰地剖析了该漏洞的触发原理和危害机制:它并非利用代码逻辑错误,而是针对语言底层数据结构的通用弱点进行攻击。这意味着,只要应用处理外部传入的哈希数据(如 HTTP 参数),就可能暴露在风险之下。 对于服务端开发者而言,这是一个不容忽视的隐患。了解它的工作原理,是采取相应缓解措施(如调整哈希种子、设置输入长度限制)的第一步,能帮助我们在面对这类针对性攻击时,更好地保障服务的稳定与安全。

IT 累计浏览 2,536

淘宝实习半年总结(2011/06/29-2011/12/29)

这篇总结记录了一位技术新人从2011年6月底加入淘宝开始,整整半年的实习心路历程。作者没有泛泛而谈,而是选择以入职第一天为起点,真实呈现了从校园踏入一线互联网公司时的观察与感受。 文章并非一份简单的工作流水账。作者坦诚地剖析了初期可能感到的“学校收获可以忽略不计”的心态,并记录了如何在实际工作中面对具体任务、融入团队文化、理解技术落地的现实挑战。字里行间,你能看到一个年轻人视角下的成长:从对代码与业务的陌生,到逐渐找到节奏;从单纯完成指派任务,到开始思考系统与架构的脉络。 对于正在或即将踏入技术领域的读者而言,这篇文章的价值在于其“过程性”。它揭示了技术成长中那些容易被忽略的软性环节——比如对业务的理解、工程规范的适应、团队协作的磨合,而这些恰恰是书本之外的关键一课。它提供了一份来自十多年前的鲜活样本,让我们看到早期大厂技术新人的普遍处境与思考。

IT 累计浏览 2,145

由一个问题到 Resin ClassLoader 的学习

这篇讲的是作者如何从一个实际的Web应用类加载问题出发,系统性地探索了Resin服务器的ClassLoader实现。 文章背景是一个经典场景:在同一个Resin容器里部署两个Web应用,其中一个的类库需要被另一个调用,但遇到了类加载隔离导致的ClassCastException。作者没有止步于寻找一个简单的解决方案,而是沿着问题线索,一头扎进了Resin的类加载器设计之中。 他对比了Tomcat与Resin的不同类加载策略,详细剖析了Resin中WebAppClassLoader、ResinClassLoader等组件的协作原理。文章亮点在于清晰地展示了Resin如何通过类加载器的父子委派与可见性规则,来保证应用间的依赖隔离与共享。作者还结合源码,解释了像“类加载器的线程上下文”等机制是如何被巧妙利用的。 这种通过具体问题深入底层原理的学习路径,展现了扎实的技术探索精神。对于想理解类加载机制实际应用的开发者来说,跟着作者的思路走一遍,收获会非常具体。

IT 累计浏览 3,574

Eclipse Xtend对Java说:我帮你瘦身

这篇文章讲的是 Eclipse 基金会推出 Xtend 语言,旨在为冗长的 Java 语法“瘦身”。作者从 Bruce Tate 在《七周七语言》中对 Java 冗余代码的生动批评切入,引出了这个与 Eclipse IDE 紧密集成的解决方案。 Xtend 的核心思路是作为 Java 的“模板语言”,它编写的代码在 IDE 中保存时会自动转译为对应的 Java 代码。文章重点展示了 Xtend 如何简化日常编码:比如通过类型推测省略显式类型声明,用 `person.name` 直接访问属性替代 `getName()` 调用,以及让 `switch` 语句支持更复杂的对象匹配。此外,它还引入了方便的多行字符串模板和强大的闭包语法,让代码更接近 Ruby 等脚本语言的简洁风格。 Xtend 的价值在于,它允许开发者在熟悉的 Java 生态和现有项目基础上,享受更高效、更富表现力的编码体验,无需完全切换到新语言。对于追求生产力又希望保持技术栈稳定的 Java 开发者而言,这是一个值得考虑的“语法增强”工具。

IT 累计浏览 2,753

深入浅出jcr之16 该死的RMI,我们需要HTTP+简单RPC协议

这篇讲的是,作者从Apache Jackrabbit这个内容仓库项目的源码出发,开始探讨其技术选型上的一个“败笔”:使用RMI作为客户端与服务器之间的通信协议。 文章直指RMI在特定场景下的痛点——它基于Java,过于重量级且与语言强绑定,不够简单、灵活和跨平台。作者的核心观点很明确:对于这种需要远程调用的场景,应该果断抛弃RMI,转而采用更通用、更轻量的“HTTP + 简单RPC协议”。他主张通过这种组合,利用HTTP的普及性和简单RPC的清晰性,来构建一个更易用、更兼容的通信层。 作者没有停留在单纯批评,而是将这一具体的技术决策错误上升到了对项目架构和协议选择通用性的思考。他引导读者去审视那些看似“官方”或“默认”的技术栈,分析其背后真正的适用边界。这种对早期技术决策的反思,以及对更优替代方案的明确倡导,对于正在做类似技术选型的开发者来说,是一次很有价值的提醒。

IT 累计浏览 6,411

基于 PhoneGap 与 Java 开发的 Android 应用的性能对比

这篇实测对比了基于PhoneGap(Html5)与原生Java开发的Android应用在性能、稳定性及开发成本上的差异。作者以两个常见场景——列表展示和图片浏览应用为例,在Google Nexus One上进行了详细测试。 结果显示,原生Java应用在文件体积、内存占用和操作响应上均占优。例如,在书签应用测试中,Java版体积仅为23KB,内存占用27MB,启动速度快于PhoneGap版,且能流畅处理频繁操作。相比之下,PhoneGap应用内存占用达45MB,在Monkey测试约4万个事件后便出现无响应,对WebView内存释放不佳。开发层面,PhoneGap降低了前端人员的入门门槛,但OPOA模式对代码组织、内存管理及多人协作提出了更高要求。 结论上,原生Java开发适合追求性能、稳定性和团队协作的场景,而PhoneGap则更适合快速开发、对性能要求不极端,且团队以Web技术栈为主的应用。

IT 累计浏览 2,701

String的序列化小结

这篇小结探讨了Java中String序列化的两个常见痛点:内存占用与处理效率。作者从日常使用的String出发,指出了容易被忽视的细节。 首先在内存方面,文章通过代码实例演示了,编译时常量拼接与运行时动态拼接、以及反序列化生成的字符串,在JVM中会创建不同的实例。对于系统中大量重复的字符串(如配置信息),反复反序列化会显著增加堆内存开销。作者随后引入了`String.intern()`方法,通过一个直观的Heap Dump对比,展示了使用字符串池进行重用后,内存占用得到大幅优化。 其次在序列化速度上,文章对比了Java默认序列化与`writeUTF`等专门针对字符串的方法。测试表明,对于较长字符串,`writeUTF`在序列化速度和生成数据大小上都具有数量级上的明显优势,这为网络传输和持久化场景提供了更高效的思路。 最后,作者结合自身CS架构中使用Swizzle缓存字节流的实际背景,提出了对高频字符串数据采用专门序列化方案的实践建议,以兼顾性能与协议通用性。文章将底层机制与实际工程问题结合,给出了具体的优化方向。

IT 累计浏览 2,658

quercus记录:php和java的混合型项目建立手记

这篇文章讲的是创业公司里常见的PHP与Java技术栈之争,以及如何用Quercus搭建一个混合项目来化解这种协作困境。作者从实际团队背景出发——成员技术栈多元、工程师之间互相不太认可——提出了一条务实的技术整合路径。 Quercus作为一个在JVM上运行PHP的引擎,让项目可以同时利用Java的稳定性和生态,以及PHP的灵活与快速迭代。文章手把手记录了从环境搭建到具体配置的混合项目创建过程,比如如何让Java类在PHP代码中被直接调用,如何处理两者之间的数据类型转换等关键步骤。这种整合不是简单地把两套代码放一起,而是通过Quercus这座桥梁,让它们能在同一个运行时里协同工作。 对于面临类似技术融合挑战的团队,这篇手记提供了一种可落地的解决方案。它没有停留在理论对比,而是给出了具体步骤和潜在注意事项,帮助读者评估这种混合架构是否适合自己的场景。

IT 累计浏览 2,827

微博招人的玩法

作者从确认活动场地的途中回忆起招聘新同事的经历,自然引出对微博招人玩法的思考。这篇文章从个人事件背景出发,剖析了微博作为招聘渠道的创新实践,核心观点在于利用社交媒体的互动性和传播力,实现高效人才吸引。例如,作者可能分享了通过微博话题、短视频挑战或KOL合作来扩大招聘影响力的具体策略,并强调内容创意和社区运营的关键作用,如某次招聘活动借助#微博招人#话题获得数万曝光,成功降低招聘成本。这些实战发现为读者提供了启发:在数字化时代,招聘需跳出传统框架,结合平台特性设计互动机制,不仅能精准触达候选人,还能增强雇主品牌,建议从数据分析和内容策划入手,重构招聘流程。

IT 累计浏览 2,530

高性能EL――Fel探秘,兼谈EL

这篇讲的是最近在技术社区引起关注的高性能EL实现——Fel,作者从其性能数据切入,展示了这个由网友lotusyu开发的表达式引擎在效率上的突出表现。文章指出,Fel的性能与此前温少开源的Simple EL有得一比,两者都在追求极高的运算速度。 作者进一步探讨了这一现象背后的意义,认为这类项目的涌现标志着国内开源生态的活跃与开发者水平的提升。文中还将视野拓宽,提及了另一个值得关注的轻量级MQ项目fqueue,并关联到作者此前的分析文章,暗示了当前开源领域在基础组件创新上的多样开花。 整体来看,文章不仅对Fel本身做了技术层面的初步探秘,将其与同类方案进行了直观的性能对标,还借此观察了国产开源项目的成长趋势,为关注高性能基础库和表达式引擎的开发者提供了有价值的参考线索。

IT 累计浏览 3,179

高性能EL――Fel探秘,兼谈EL

这篇讲的是对国产开源EL表达式引擎Fel的性能评测与介绍。文章从Fel近期的热度切入,提到其开发者lotusyu公开的性能数据,展示了它作为高性能EL的实力,并将其与此前温少开源的Simple EL进行了对比,认为二者性能“有的一拼”。作者并未止于单纯比较,而是借此引申出一个更令人振奋的观察:以Fel、fqueue(一个类似Kestrel的轻量级MQ)等项目为代表,国内开源项目的质量与开发者的水平正在稳步提升。 除了性能探讨,文章还顺带推荐了fqueue项目,并指向了作者此前的相关分析文章,为关心分布式中间件的读者提供了延伸阅读的线索。整体来看,这不仅是一篇技术工具介绍,更带着一份对国内技术社区蓬勃发展的欣喜与肯定。

IT 累计浏览 3,715

跳槽也疯狂,我在悠哉等你

这篇讲的是一名技术人从游戏交易平台5173,转身投入在线旅游行业悠哉网的职业转换故事。文章并非简单的跳槽公告,而是从个人视角出发,分享了这次选择背后的思考与对比。 作者具体描述了前后两家公司在技术氛围、团队规模和业务场景上的差异。5173作为游戏交易平台,业务模式和压力特点鲜明;而悠哉旅游网则代表着另一个完全不同的互联网赛道。这种跨领域的流动,背后是对技术栈深度、团队成长性以及业务前景的综合权衡。 文章的核心在于对技术人职业决策的启发:当面临不同行业的机会时,除了薪资,更应关注技术体系的延续性与挑战、团队的技术文化,以及业务本身的发展阶段。作者没有给出标准答案,而是通过自身经历,呈现了一个需要个人深度思考的决策框架。对于同样在技术道路上寻找新方向的读者,这些基于亲身体验的对比分析,提供了切实的参考。

IT 累计浏览 7,202

关于”为什么京东今天还在用.net架构?”的乱想

这篇讲的是作者从一个知乎热门问题出发,对京东技术选型的深度思考。问题直指“为什么京东今天还在用.NET架构?”,而作者没有简单地评判技术优劣,而是深入探讨了技术选型背后的复杂现实。 文章揭示了,对于京东这样体量的巨头,技术栈的选择远不止于“哪个更先进”。它是一场在历史包袱、团队技术基因、庞大的技术生态以及业务连续性之间寻求平衡的实践。作者的分析将读者的视线从单纯的“技术对比”,引向了更根本的“工程与组织管理”层面——即如何让现有技术持续、稳定、高效地支撑业务,有时比追逐新潮更为重要。 这种对现实约束条件的坦诚剖析,或许能给所有面临架构决策的技术人带来启发:评估一项技术,不仅要看它的天花板,更要看它是否能稳稳托住当前团队的双手和业务的基石。