开发者社区 > 云原生 > 正文

Arthas有个问题不知道能不能解决,报以下错误,修改类中的哪些东西不会报这个错误呢?

Arthas有个问题不知道能不能解决,我有个class想通过arthas 的retansform 命令加载进去,这个类我只改了方法中的一个参数类型,HashMap改成了LinkedHashMap,加载失败了,报下面错误:
retransform error! java.lang.UnsupportedOperationException: class redefiniti
请问有方法解决吗?修改类中的哪些东西不会报这个错误呢?

展开
收起
嘟嘟嘟嘟嘟嘟 2024-01-04 07:59:07 135 0
3 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    Arthas的retransform命令在加载类时,会检查类的字节码是否与当前运行的类一致。如果修改了类中的某个方法的参数类型,可能会导致字节码不一致,从而引发UnsupportedOperationException错误。

    要解决这个问题,你可以尝试以下方法:

    1. 使用-Xrs参数启用Redefine支持。这将允许你在运行时修改类的定义。例如:
    java -jar arthas-boot.jar your_app_name --watch redefine --rs
    
    1. 如果你不想使用-Xrs参数,可以考虑将修改后的类重新编译成字节码文件,然后使用-cp参数指定新的字节码文件路径。例如:
    java -cp /path/to/your/new/classes your_main_class
    
    1. 如果你使用的是Spring Boot应用,可以考虑使用Spring Boot DevTools插件。这个插件可以在开发过程中自动重启应用,并在应用重新启动时重新加载类定义。要使用这个插件,你需要在你的pom.xml文件中添加以下依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
    

    然后在运行应用时添加--spring-boot-devtools参数:

    java -jar your_app_name.jar --spring-boot-devtools
    

    这样,当你修改类并保存时,应用会自动重启并重新加载类定义,而不会引发错误。

    2024-01-05 16:39:57
    赞同 展开评论 打赏
  • 1a402bfa844a6c73fc13948deebc3b20.png
    注意检查下方法,是否有无用的。
    此回答整理自钉群“Arthas开源交流群”

    2024-01-04 18:16:38
    赞同 展开评论 打赏
  • Arthas的retransform命令在加载类时,会检查类的字节码是否与当前类的版本一致。如果修改了类中的某个方法的参数类型,可能会导致字节码不一致,从而引发UnsupportedOperationException异常。

    要解决这个问题,你可以尝试以下方法:

    1. 使用-XX:+RedefineClasses-XX:+PreserveFramePointer参数启动Java虚拟机(JVM),这样可以让JVM在重新定义类时保留旧类的帧指针信息。例如:
    java -XX:+RedefineClasses -XX:+PreserveFramePointer -jar your_arthas_agent.jar
    
    1. 如果你使用的是Spring Boot项目,可以考虑使用spring-boot-devtools插件来自动重启应用。这个插件会在检测到类文件发生变化时自动重启应用,而不需要手动重启。要使用这个插件,你需要在你的pom.xml文件中添加以下依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
    

    然后,在运行应用时添加--spring-boot-devtools.restart.enabled=true参数:

    java -jar your_app.jar --spring-boot-devtools.restart.enabled=true
    
    1. 如果以上方法都无法解决问题,你可以考虑将修改后的类编译成一个新的类文件,然后将新的类文件替换原来的类文件。这样可以避免修改类中的某个方法的参数类型导致的问题。
    2024-01-04 08:51:06
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Arthas应用诊断利器-新特征介绍 立即下载
使用Arthas 抽丝剥茧深入应用-线上诊断利器之外 立即下载
workshop专场--容器、消息&IoT专场-开发者动手实践营-容器、消息和IoT-Java诊断利器Arthas排查问题实践 立即下载