Java 开发者必读的 10 篇精选优秀技术文章

  • 郭蕾

2015 年 11 月 17 日

话题:JavaRubyPython语言 & 开发架构

作为最受欢迎的编程语言之一,Java 已经走过了 20 个年头。从已经落寞的诺基亚到现在火热的电商系统,我们都能看到 Java 语言的身影。经过 20 年的历练,这门语言已经逐渐成熟,并经过很多大型系统的考验。社区关于这门语言的讨论,也从语言使用过渡到了性能优化以及反思。

InfoQ 上有大量的关于 Java 性能、语言细节、语言对比等方面的文章,现在向大家推荐 10 篇精选的优秀文章,这些文章来自微信公众号 InfoQ,如果您对各类技术感兴趣,推荐关注,后续我们也将会把最优秀的内容第一时间通过微信公众号推送给您。

1、作为一名 Java 程序员,我为何不在生产项目中转向 GO

自 Google 在 2009 年发布 Go 语言的第一个正式版之后,这门语言就以出色的语言特性受到大家的追捧,尤其是在需要高并发的场景下,大家都会想到是不是该用 Go。随后,在国内涌现出了一批以七牛为代表的使用 Go 作为主要语言的团队,而许世伟大神本人也在各种场合下极力推动 Go 在国内的发展,于是在这种大环境下,中国的 Go 开发者群体逐渐超越了其他地区。

那么问题来了,业余时间好学是一回事,真正要将一个新东西运用到生产中则是另一回事。JavaScript 的开发者可以义无反顾地选择 Node.js,但是对于 Java 开发者来说,在下一个大项目里究竟是该选择 Go,还是 Java 呢?

扫描二维码关注公众号后,发送数字 1 即可阅读原文。

2、企业级 Java 应用最重要的 4 个性能指标

虽然很多人都曾预言 Java 将一蹶不振,但是不可否认的是,很多重要项目中,尤其是银行和政府一些大型项目,Java 仍在其中扮演着极其重要的角色。国内 APM 领军企业 OneAPM 的 Java 工程师陶炳哲,多次参与银行、运营商等大型企业的性能优化工作, 总结了企业级 Java 应用最应重视的 4 个性能指标,主要包括:商业事务,外部服务,垃圾回收以及应用布局。

扫描二维码关注公众号后,发送数字 2 即可阅读原文。

3、你的 Java 代码对 JIT 编译友好吗?

JIT 编译器是 Java 虚拟机(以下简称 JVM)中效率最高并且最重要的组成部分之一。但是很多的程序并没有充分利用 JIT 的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用 JIT 的程度。

在本文中,我们将介绍一些简单的方法来验证你的程序是否对 JIT 友好。这里我们并不打算覆盖诸如 JIT 编译器工作原理这些细节。只是提供一些简单基础的检测和方法来帮助你的代码对 JIT 友好,进而得到优化。

扫描二维码关注公众号后,发送数字 3 即可阅读原文。

4、Java 大牛谈:我为什么反对用 Node

随着无线端的快速普及,前后端分离技术走上前台,而 Node 由于它的一些特性被工程师快速接受尤其是前端工程师,所以产生了很多 Node 是否会引起新的技术变革的讨论。

我本人是淘系的一个 Web 开发人员,基本上经历了淘系关于 Node 和 Java 技术选型讨论的过程,所以今天我给大家推演一下在像淘系这个环境下 Node 能否会成为主流的 Web 开发技术,当然后面也给出了我认为比较适合的场景。

扫描二维码关注公众号后,发送数字 4 即可阅读原文。

5、Java 永久代去哪儿了

在 Java 虚拟机(以下简称 JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法信息(如字节码,栈和变量大小),运行时常量池,已确定的符号引用和虚方法表。

在过去(当自定义类加载器使用不普遍的时候),类几乎是“静态的”并且很少被卸载和回收,因此类也可以被看成“永久的”。另外由于类作为 JVM 实现的一部分,它们不由程序来创建,因为它们也被认为是“非堆”的内存。

在 JDK8 之前的 HotSpot 虚拟机中,类的这些“永久的”数据存放在一个叫做永久代的区域。永久代一段连续的内存空间,我们在 JVM 启动之前可以通过设置 -XX:MaxPermSize 的值来控制永久代的大小,32 位机器默认的永久代的大小为 64M,64 位的机器则为 85M。永久代的垃圾回收和老年代的垃圾回收是绑定的,一旦其中一个区域被占满,这两个区都要进行垃圾回收。但是有一个明显的问题,由于我们可以通过‑XX:MaxPermSize 设置永久代的大小,一旦类的元数据超过了设定的大小,程序就会耗尽内存,并出现内存溢出错误 (OOM)。

备注:在 JDK7 之前的 HotSpot 虚拟机中,纳入字符串常量池的字符串被存储在永久代中,因此导致了一系列的性能问题和内存溢出错误。想要了解这些永久代移除这些字符串的信息,请访问这里查看。

扫描二维码关注公众号后,发送数字 5 即可阅读原文。

6、Java9 新功能:HTTP2&REPL 篇

对 Java 9 的炒作将不再局限于模块化(modularity),Java 9 正在搜罗大量额外的功能模块,这些功能模块正作为 Java 增强提案(JEP)提交,并在 OpenJDK (Java SE 的参考实现项目)中实现。

在这篇文章中,我们将重点关注一些或将在 Java 9 整个生命周期中,对开发者的工作生活影响最大的 JEP,包括新的 HTTP/2 支持和 JShell REPL(读取 - 求值 - 打印 - 循环),后者带来了基于 shell 的交互式 Java 开发环境和探索性开发 API。

扫描二维码关注公众号后,发送数字 6 即可阅读原文。

7、简化你的 Java 代码,让工作更高效

计算机专家在问题求解时非常重视表达式简洁性的价值。Unix 的先驱者 Ken Thompson 曾经说过非常著名的一句话:“丢弃 1000 行代码的那一天是我最有成效的一天之一。”这对于任何一个需要持续支持和维护的软件项目来说,都是一个当之无愧的目标。早期的 Lisp 贡献者 Paul Graham 甚至将语言的简洁性等同为语言的能力。这种对能力的认识让可以编写紧凑、简介的代码成为许多现代软件项目选择语言的首要标准。

相比于其他程序设计语言,Java 语言的冗长已经名声在外。其主要原因是由于程序开发社区中所形成的惯例,在完成任务时,很多情况下,要更大程度地考虑描述性和控制。例如,长期来看,长变量名会让大型代码库的可读性和可维护性更强。描述性的类名通常会映射为文件名,在向已有系统中增加新功能时,会显得很清晰。如果能够一直坚持下去,描述性名称可以极大简化用于表明应用中某一特定的功能的文本搜索。这些实践让 Java 在大型复杂代码库的大规模实现中取得了极大的成功。

本文将着重介绍编写简洁 Java 代码的最佳实践,特别是关于 JDK8 中新增的功能。简而言之,Java 8 中 Lambda 表达式的引入让更加优雅的代码成为可能。这在用新的 Java Streaming API 处理集合时尤其明显。

扫描二维码关注公众号后,发送数字 7 即可阅读原文。

8、你的 Java 日志,有没有用这些改进办法

在任何系统中,日志都是非常重要的组成部分,它是反映系统运行情况的重要依据,也是排查问题时的必要线索。绝大多数人都认可日志的重要性,但是又有多少人仔细想过该怎么打日志,日志对性能的影响究竟有多大呢?今天就让我们来聊聊 Java 日志性能那些事。

扫描二维码关注公众号后,发送数字 8 即可阅读原文。

9、Java NIO 通信框架在电信领域的实践

从广义上看电信软件的范围非常广,细分实际可以分为两大类:系统软件和业务应用软件。

系统软件包括路由器底层的信令机软件、手机操作系统等,业务应用软件主要包括客户关系管理 CRM、网上营业厅、融合计费 OCS 和各类消息网关,例如短信网关、彩信网关等。

本文重点介绍电信业务应用软件的技术变迁历史,以及华为电信软件架构演进和 Java NIO 框架在技术变迁中起到的关键作用。

扫描二维码关注公众号后,发送数字 9 即可阅读原文。

10、写代码这回事儿,架构师你可以说不吗?

要让一个成功的架构得以实现,架构师必须要在整个生命周期始终保持与交付团队的紧密合作。保持紧密合作能够促进架构层面的快速反馈循环。并且还能够为架构师提供更多的与团队交流架构愿景和领导团队的机会。

正如本文题目所描述的那样,架构师除了可以参与到实际的编码工作中之外,还有许多其他的方式可以参与到交付团队中,例如结对编程和同行评审。相反,某些参与方式有可能会对团队造成负面影响,例如接管交付、不允许团队自组织或者采用集体所有制。

其中一个关键目的是为了避免“象牙塔”架构师的角色——只在项目最初发布架构,然后就再也不见踪影。谋求与交付团队的协作关系,共同努力尽早识别和解决架构性缺陷,从而交付成功的架构和最终的产品。

扫描二维码关注公众号后,发送数字 10 即可阅读原文。

JavaRubyPython语言 & 开发架构