学习 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的主要内容,如果未能解决你的问题,请参考以下文章

JVM:深入分析Java字节码-下

java第二周学习心得

Java内存使用异常导致CPU100%原因(线上JVM排查之二)

Java内存使用异常导致CPU100%原因(线上JVM排查之二)

Java内存使用异常导致CPU100%原因(线上JVM排查之二)

Java内存使用异常导致CPU100%原因(线上JVM排查之二)