字节码以无证方式随时间变化

Oro*_*102 5 java jvm bytecode

今天我在openjdk 7上使用javaagent和instrumentation来探索大型应用程序(如jboss服务器和应用程序)的类.我每隔10秒就调用所有类的重新转换,因此它们的字节码在我的ClassFileTransformer实现中得到.

我的实现只是跟踪类的字节码如何随时间变化.首先,我很惊讶,字段和方法的顺序,方法访问修饰符,常量池的内容和其他类似的东西因检查而异.但是,它仍然记录在案.

没有记录的内容 - 某些项目可以在类中创建常量池并注入方法中.现在我注意到数字值(Longs,Doubles,Floats等)会发生.

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

pool:
...
#17 Float NaNf
method:
#1 fload #17 //NaNf
...
Run Code Online (Sandbox Code Playgroud)

在运行时更改类之后:

pool:
...
#17 Float NaNf
#18 Float NaNf
method:
#1 fload #18 //NaNf <- look, it loads #18 now
Run Code Online (Sandbox Code Playgroud)

我仔细检查过,没有附加任何其他变压器或代理商.

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

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

Hol*_*ger 1

\n

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

\n
\n\n

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

\n\n
\n

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

\n
\n\n

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

\n