5

今天,我在我的 openjdk 7 上使用 javaagent 和检测来探索大型应用程序的类(例如带有应用程序的 jboss 服务器)。我每 10 秒对所有类调用一次重新转换,因此它们的字节码进入了我的 ClassFileTransformer 实现。

我的实现只是跟踪类的字节码如何随时间变化。首先,令我感到惊讶的是,字段和方法的顺序、方法访问修饰符、常量池的内容和其他诸如此类的事情因一项检查而异。但是,它仍然被记录在案

没有记录的内容 - 某些项目可能在类的常量池中创建并注入到方法中。现在我注意到数值(Longs、Doubles、Floats 等)会发生这种情况。

这就是它在 javap 中的样子;前:

pool:
...
#17 Float NaNf
method:
#1 fload #17 //NaNf
...

在运行时更改类之后:

pool:
...
#17 Float NaNf
#18 Float NaNf
method:
#1 fload #18 //NaNf <- look, it loads #18 now

我仔细检查过,没有连接其他变压器或代理。

为什么 JVM 不能让我的字节码保持不变?我在哪里可以了解此类优化/转换(或者还有什么)?我阅读了 JVM 源代码,但这些只会让我更加困惑。

我只是想创建某种实时字节码验证器——一种安全工具。

4

1 回答 1

1

没有记录的内容 - 某些项目可能在类的常量池中创建并注入到方法中。

好吧,您自己链接的文章清楚地说:

常量池可能有更多或更少的条目。常量池条目可能有不同的顺序;但是,方法字节码中的常量池索引将对应。

所以它实际上是有记录的。原因是准确地记住每个类的字节码是没有用的,因此在许多类中重复所有相同的常量池条目。JVM 通常具有与普通类文件不同的内部格式,并在需要时生成类文件,例如在调用转换器时。

于 2013-08-26T13:01:01.540 回答