学习 Java 字节码和 JVM
Posted
技术标签:
【中文标题】学习 Java 字节码和 JVM【英文标题】:Learning about Java bytecode and the JVM 【发布时间】:2010-11-15 11:32:20 【问题描述】:在最近提出的一个问题中,我头脑简单的回答突出了我对 Java、JVM 以及代码如何编译和运行的许多误解。这使我产生了一种将我的理解降低到较低水平的愿望。我对像汇编这样的低级理解没有任何问题,但字节码和 JVM 让我感到困惑。面向对象的代码是如何在低层次上被分解的,我对此一无所知。我想知道是否有人对如何了解 JVM、字节码和 Java 的低级功能有任何建议。是否有任何实用程序可以让您直接编写和运行字节码,因为我相信亲身体验某事是加深对它的理解的最佳方式?此外,我们将不胜感激有关此主题的阅读建议。
编辑:次要问题。所以我有一个子问题,答案给了我一个有趣的想法来了解 jvm,仅以可读的语法编写像 Brainf**k 或 Ook 这样非常简单的语言的合理性是什么(也许我什至可以开发它最终支持oo)编译成字节码是?这会是一次很好的学习经历吗?
【问题讨论】:
+1 用于给brainf**k 属性'simple' ;-) 我猜“简单”的意思是小复杂,而不是易用性;) 【参考方案1】:推荐阅读:the JVM spec.
您可能还想使用BCEL - 周围还有其他用于处理字节码的库,但这可能是最著名的一个。
【讨论】:
我什至不知道这样的规范存在。这真的很有帮助。【参考方案2】:Apache BCEL 将允许您从字节码分析和手工制作 .class 文件。
javap 将允许您反汇编现有的 .class 文件。它对于打开快速测试课程以了解幕后实际情况特别有用。
【讨论】:
【参考方案3】:我是通过阅读the ASM tutorial 和对图书馆本身胡乱学习的。
恕我直言,ASM 比 BECL 更好。
BCEL 已被使用 在多个项目中取得成功,例如 作为编译器、优化器、 混淆器、代码生成器和 分析工具。 不幸的是 没有太多的发展 在过去的几年里。随意地 帮忙或您可能想要一个 查看 ASM 项目 对象网。 - http://jakarta.apache.org/bcel/
【讨论】:
如果你真的想手动编写字节码,Krakatau 比 ASM 好得多。 抱歉,链接the ASM tutorial
已失效
@zionpi,总有 Archive.org (web.archive.org/web/20070715000000/http://…)【参考方案4】:
理解JVM的可靠来源只有一个
Java® 虚拟机规范 Java SE 7 版
http://docs.oracle.com/javase/specs/jvms/se7/html/index.html
【讨论】:
【参考方案5】:Programming for the Java Virtual Machine 是本主题的好书。 (披露:我与作者合作。)
【讨论】:
【参考方案6】:要了解 Java/JVM 的架构:请阅读 Wikipedia、规范和源代码。
要了解如何在低级别上完成面向对象的代码:尝试在 C 等低级别语言中模拟继承/多态性/封装等功能。
在 C 语言中,您可以通过例如函数指针和嵌套结构的组合来实现上述目标。
【讨论】:
我真的很喜欢第二个建议。我想我可能不得不尝试想出一种优雅的方式来做到这一点。我知道一些关于多态性和继承的非常复杂的技术,但它们都是我想出的非常低效的技术,甚至可能算不上模拟这些特性。 添加了有关在 C 中执行此操作的更多信息。如果您对语言和指针的工作方式有很好的理解,实际上并不难。 @MikeMcQuaid:在 C 中实现闭包怎么样?以上是关于学习 Java 字节码和 JVM的主要内容,如果未能解决你的问题,请参考以下文章
Java内存使用异常导致CPU100%原因(线上JVM排查之二)
Java内存使用异常导致CPU100%原因(线上JVM排查之二)