最近有同事在实现Harmony的instrument包,用到了IBM VME的jvmti,发现该jvmti实现的redefineclass方法严重"违反"specification的"bug",并且IBM JDK 5也有同样的表现。大家都知道instrument允许应用程序在runtime动态修改class在内存中的bytecode,这是java 5的一个重要增强,这个feature是通过jvmti实现的,但是jvmti目前对此还有很多的限制,Java 5 JVMTI的文档对redefineclass方法有这样的固定:
" The redefinition may change method bodies, the constant pool and attributes. The redefinition must not add, remove or rename fields or methods, change the signatures of methods, change modifiers, or change inheritance. These restrictions may be lifted in future versions. "
如果应用试图做这些被禁止的操作,会得到一个UnsupportedOperationException,这一点对于我手头的Java 6 rc b65版本也依然成立(是老了点...可怜可怜下载Sun JDK需要approval的可怜人吧...)。但是在IBM JDK里面,这个限制是不存在的,也就是说,你可以在runtime任意修改class的bytecode, 增删改方法signature和field都可以(还没试过更改继承结构,不过想来也是可以的),尽管有很多AOP框架可以做这个事情,但是原理上JVM直接提供的支持效率会好很多(还没有测试过,有空对比一下AspectJ),脑子里立刻浮现出无数很cool的应用吧,嘿嘿。为了确认这是个有意为之的增强,我还专门到J9的内部站点上raise了一个bug,结果得到的答复果然是: 这是一个intended value add。后来又私下了解了一下,才知道hot code swapping是J9的一个重要卖点,但是奇怪的是为什么JavaOne2006上有关IBM JDK的presentation并没有提到这一点呢?呵呵。
对了,如果要禁止这个增强,也就是说得到遵守specification的行为,可以在启动JVM的使用加上-Xfuture参数,诡异,难道不应该叫-Xnofuture么? ;-)
Update: 犯乐观主义错误了,测试过了,更改类继承结构是不行的...:(
分享到:
相关推荐
IBM JDK1.6 安装版
linux 64位IBM JDK1.6
ibm jdk5.0,开放的策略文件,解决默认ibm的jdk对密码算法的长度限制,下载后替换掉JAVA_HOME/jre/lib/security/中现有的两个包。
IBM Webpshere 8.5.0ND版自带的商业JDK,版本信息如下: java version "1.6.0" Java(TM) SE Runtime Environment (build pwa6460_26sr2ifix-20120419_02(SR2+IV19661)) IBM J9 VM (build 2.6, JRE 1.6.0 Windows ...
ibm jdk diagnostic reference document
IBM JDK 解压之后,在IDE配置一下就可以用了,亲测可用!
ibm JDK5.0 fro linux,这个东西很难下的。
linux 64位 IBM JDK1.5
IBM JDK5 垃圾收集策略,第 1 部分
ibm版本的jdk1.8 for linux x64,已测试可用,安装无需root权限
ibmjdk1.6版本,window版本。~~~~~~~~~~~~~~~~~~~~~~~~
ibm jdk 1.7 64 windows
本文描述了几种IBM JDK5的垃圾回收策略,几种策略的特点和原理,对于WAS6.1 GC调优有很大的帮助
IBM JDK 垃圾收集及存储分配技术,真是不想写了
IBM JDK6 SR15(对应Oracel JDK6U71) part1 刚好服务器上更新JVM,但Oracel的JDK只更新到JDK6U45后就不再免费提供技术支持了 后来刚好IBM那边提供了他们的商业JDK6,上传看有需要的朋友可以下载 由于最大只能上传70M...
IBM JDK6 SR15(对应Oracel JDK6U71) part2 刚好服务器上更新JVM,但Oracel的JDK只更新到JDK6U45后就不再免费提供技术支持了 后来刚好IBM那边提供了他们的商业JDK6,上传看有需要的朋友可以下载 由于最大只能上传70M...
IBM公司的jre运行环境, IBM JDK,与目前oracle JDK有所区别
压缩包太大,分两个压缩包 ibm_jdk1.7.1_x86.part1.rar, ibm_jdk1.7.1_x86.part2.rar,解压版。验证过
IBM jdk1.5 Guide AIX 开发必须
IBM JDK1.8 证书相关jar,例如jdbc 链接由tcp/ip修改到SSL后需要替换JDK相应的jar