这个是我订阅 陈皓老师在极客上的专栏《左耳听风》,我贴出来是为了本身之后方便学习和记忆,同时也分享给大家一块儿学习,固然若是有兴趣,能够去订阅,为了不广告嫌疑,我这就很少说了!如下第一人称是指陈皓老师。html
想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你!前端
首先,Java 最黑科技的玩法就是字节码编程,也就是动态修改或是动态生成 Java 字节码。Java 的字节码至关于汇编,其中的一些细节你能够从下面的这几个教程中学习。java
固然,通常来讲,咱们不使用 JVMTI 操做字节码,而是用一些更好用的库。这里有三个库能够帮你比较容易地作这个事。git
就我而言,我更喜欢 Byte Buddy,它在 2015 年还获了 Oracle 的 “Duke’s Choice” 大奖,其中说 Byte Buddy 极大地发展了 Java 的技术。github
使用字节码编程能够玩出不少高级玩法,最高级的仍是在 Java 程序运行时进行字节码修改和代码注入。听起来是否是一些很黑客,也很黑科技的事?是的,这个方式使用 Java 这门静态语言在运行时能够进行各类动态的代码修改,并且能够进行无侵入的编程。算法
好比, 咱们不须要在代码中埋点作统计或监控,可使用这种技术把咱们的监控代码直接以字节码的方式注入到别人的代码中,从而实现对实际程序运行状况进行统计和监控。若是你看过个人《编程范式游记》,你就知道这种技术的威力了,其能够很魔法地把业务逻辑和代码控制分离开来。编程
要作到这个事,你还须要学习一个叫 Java Agent 的技术。Java Agent 使用的是 “Java Instrumentation API”,其主要方法是实现一个叫 premain() 的方法(嗯,一个比 main() 函数还要超前执行的 main 函数),而后把你的代码编译成一个 jar 文件。多线程
在 JVM 启动时,使用这样的命令行来引入你的 jar 文件:oracle
java -javaagent:yourAwesomeAgent.jar -jar App.jar。更为详细的文章你能够参看:“Java Code Geeks: Java Agents”,你还能够看一下这个示例项目:jvm-monitoring-agent 或是 EntryPointKR/Agent.java。若是想用 ByteBuddy 来玩,你能够看看这篇文章 “经过使用 Byte Buddy,便捷地建立 Java Agent”。若是你想学习如何用 Java Agent 作监控,你能够看一下这个项目 Stage Monitor。jvm
接下来说讲 Java 底层知识中另外一个很是重要的内容——JVM。
提及 JVM,你有必要读一下 JVM 的规格说明书,我在这里放一个 Java 8 的, The Java Virtual Machine Specification Java SE 8 Edition 。对于规格说明书的阅读,我认为是系统了解 JVM 规范的最佳文档,这个文档可让你对于搞不清楚或是诡异的问题恍然大悟。关于中文翻译,有人在 GitHub 上开了个 Repo - “java-virtual-machine-specification”。
另外,也推荐一下 JVM Anatomy Park JVM 解剖公园,这是一个系列的文章,每篇文章都不长,可是都很精彩,带你一点一点地把 JVM 中的一些技术解开。
学习 Java 底层原理还有 Java 的内存模型,官方文章是 JSR 133。还有马里兰大学的威廉·皮尤(William Pugh)教授收集的和 Java 内存模型相关的文献 - The Java Memory Model ,你能够前往浏览。
对于内存方面,道格·利(Doug Lea)有两篇文章也是颇有价值的。
垃圾回收机制也是须要好好学习的,在这里推荐一本书 《The Garbage Collection Handbook》,在豆瓣上的得分竟然是 9.9(固然,评价人数很少)。这本书很是全面地介绍了垃圾收集的原理、设计和算法。可是这本书也是至关难啃的。中文翻译《垃圾回收算法手册》翻译得很通常,有人说翻译得很烂。因此,若是可能,仍是读英文版的。若是你对从事垃圾回收相关的工做有兴趣,那么你须要好好看一下这本书。
固然,更多的人可能只须要知道怎么调优垃圾回收, 那么推荐读读 Garbage Collection Tuning Guide ,它是 Hotspot Java 虚拟机的垃圾回收调优指南,对你颇有帮助。
Quick Tips for Fast Code on the JVM 也是一篇很不错的文章,里面有写出更快的 Java 代码的几个小提示,值得一读。
好了,总结一下今天学到的内容。Java 最黑科技的玩法就是字节码编程,也就是动态修改或是动态生成 Java 字节码。Java 的字节码至关于汇编,学习其中的细节颇有意思,为此我精心挑选了 3 篇文章,供你学习。咱们通常不使用 JVMTI 操做字节码,而是用一些更好用的库,如 asmtools、Byte Buddy 和 BiteScript 等。使用字节码编程能够玩出不少高级玩法,其中最高级的玩法是在 Java 程序运行时进行字节码修改和代码注入。同时,我介绍了 Java Agent 技术,帮助你更好地实现这种高级玩法。
JVM 也是学习 Java 过程当中很是重要的一部份内容。我推荐阅读一下 JVM 的规格说明书,我认为,它是系统了解 JVM 规范的最佳文档,可让你对于搞不清楚或是诡异的问题恍然大悟。同时推荐了 JVM Anatomy Park 系列文章,也很是值得一读。
随后介绍的是 Java 的内存模型和垃圾回收机制,尤为给出了如何调优垃圾回收方面的资料。这些内容都很底层,但也都很重要。对于想成为高手的你来讲,仍是有必要花时间来啃一啃的。
你的点赞是我持续分享好东西的动力,欢迎点赞!
一个笨笨的码农,个人世界只能终身学习!