Java 字节码相关
字节码编程,也就是动态修改或是动态生成 Java 字节码。Java 的字节码相当于汇编,其中的一些细节。
- Java Zone: Introduction to Java Bytecode ,这篇文章图文并茂地讲述了 Java 字节码的一些细节。
- IBM DeveloperWorks: Java bytecode ,讲 Java 字节码的文章。
- Java Bytecode and JVMTI Examples,这是一些使用 JVM Tool Interface 操作字节码的比较实用的例子。包括方法调用统计、静态字节码修改、Heap Taggin 和 Heap Walking。
不使用 JVMTI 操作字节码,而是用一些更好用的库。这里有三个库可以比较容易地做这个事。
- asmtools - 用于生产环境的 Java .class 文件开发工具。
- Byte Buddy - 代码生成库:运行时创建 Class 文件而不需要编译器帮助。
- Jitescript - 和 BiteScript 类似的字节码生成库。
Byte Buddy,在 2015 年还获了 Oracle 的 “Duke’s Choice”大奖,其中说 Byte Buddy 极大地发展了 Java 的技术。
使用字节码编程可以玩出很多高级玩法,*的还是在 Java 程序运行时进行字节码修改和代码注入。这个方式使用 Java 这门静态语言在运行时可以进行各种动态的代码修改,而且可以进行无侵入的编程。
Java Agent 的技术。Java Agent 使用的是 “Java Instrumentation API”,其主要方法是实现一个叫 premain()
的方法(嗯,一个比 main()
函数还要超前执行的 main 函数),然后把你的代码编译成一个 jar 文件。在 JVM 启动时,使用这样的命令行来引入你的 jar 文件: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 的规格说明书,Java 8 的, The Java Virtual Machine Specification Java SE 8 Edition 。
中文翻译,GitHub Repo - “java-virtual-machine-specification”。
JVM Anatomy Park JVM 解剖公园,带你一点一点地把 JVM 中的一些技术解开。
学习 Java 底层原理还有 Java 的内存模型,官方文章是 JSR 133。还有马里兰大学的威廉·皮尤(William Pugh)教授收集的和 Java 内存模型相关的文献 - The Java Memory Model 。
内存方面两篇文章。
- The JSR-133 Cookbook for Compiler Writers,解释了怎样实现 Java 内存模型,特别是在考虑到多处理器(或多核)系统的情况下,多线程和读写屏障的实现。
- Using JDK 9 Memory Order Modes,讲了怎样通过 VarHandle 来使用 plain、opaque、release/acquire 和 volatile 四种共享内存的访问模式,并剖析了底层的原理。
垃圾回收机制 《The Garbage Collection Handbook》,这本书非常全面地介绍了垃圾收集的原理、设计和算法。但是这本书也是相当难啃的。中文翻译《垃圾回收算法手册》
调优垃圾回收, Garbage Collection Tuning Guide ,它是 Hotspot Java 虚拟机的垃圾回收调优指南。
Quick Tips for Fast Code on the JVM 里面有写出更快的 Java 代码的几个小提示。
小结
Java 最黑科技的玩法就是字节码编程,也就是动态修改或是动态生成 Java 字节码。Java 的字节码相当于汇编。
一般不使用 JVMTI 操作字节码,而是用一些更好用的库,如 asmtools、Byte Buddy 和 BiteScript 等。使用字节码编程可以玩出很多高级玩法,其中*的玩法是在 Java 程序运行时进行字节码修改和代码注入。
Java Agent 技术更好地实现这种高级玩法。
JVM 也是学习 Java 过程中非常重要的一部分内容。阅读JVM 的规格说明书是系统了解 JVM 规范的最佳文档, JVM Anatomy Park 系列文章,也非常值得一读。
Java 的内存模型和垃圾回收机制,出了如何调优垃圾回收方面的资料。