
java.lang.VerifyError: Stack map does not match the one at exception
禁止字节码校验:通过设置JVM启动时参数
发布日期:2025-04-01 08:46:55
浏览次数:11
分类:精选文章
本文共 746 字,大约阅读时间需要 2 分钟。
在编写AOP程序时,遇到了JDK 11环境下的verifyError问题。verifyError提示“Stack map does not match the one at exception”,这通常是由于JVM在加载动态生成的类文件时对字节码进行校验失败所引起的。
JVM在加载类文件时会执行字节码校验,这一过程旨在确保字节码的安全性和一致性。如果类文件是使用javac编译生成的,通常不会出现verifyError。但当类文件由动态工具(如asm、cglib等)生成,或来源于第三方库时,可能会遇到校验失败的问题,这可能是由于字节码生成程序存在bug,也可能是由于JVM版本升级导致新增的校验条件。
对于这个问题,可以采取以下解决措施:
-noverify
来禁用字节码校验,这可以让动态生成的类文件避开JVM的校验步骤。例如:java -noverify YourMainClass
- 更换JVM实现:某些情况下,可以考虑更换基于 McCabe 的 JDK(如JDBC或PrivateDirectory),尤其是在遇到特定JVM版本的验证问题时。
- 安全隐患:禁用校验可能会降低运行时的安全性,允许恶意代码执行。
- 性能影响:校验机制的禁用会增加性能开销,影响应用的执行效率。
- 兼容性问题:不同JVM实现可能对校验的实现方式有所不同,禁用校验可能导致其他问题。
在禁用校验时,需要注意以下几点:
在实际操作中,应根据具体的应用场景权衡 performance 和 security 的权衡。同时,可以结合字节码生成工具进行审计,确保生成的字节码是正确无误的。此外,尽量使用那些已经通过广泛测试并被证明稳定性的动态类生成工具,以减少遇到类似问题的风险。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月18日 19时30分45秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java.lang.ClassNotFoundException后续
2023-01-27
java.lang.IllegalStateException: Optional int parameter 'id' is not present but cannot be translated
2023-01-27
java.lang.NoClassDefFoundError+ (wrong name)
2023-01-27
java.lang.NoClassDefFoundError: kotlin/reflect/jvm/internal/KotlinReflectionInternalError
2023-01-27
java.lang.NumberFormatException 错误及解决办法
2023-01-27
java农业文化旅游管理平台(ssm)
2023-01-27
java农业物流仓储系统
2023-01-27