java - 为什么Java的调试Hot Swap仅限于方法内的变化?

标签 java debugging hotdeploy jpda

我已经通过hot deployment tutorial它有效。 但我对限制有疑问(第 3 点),即

热部署仅支持方法实现中的代码更改。如果添加新类或新方法,仍然需要重新启动。

如果我对现有方法进行更改但在添加方法或类时需要重新启动,基本上为什么我们不需要重新启动服务器。

我理解它的工作原理:-当我对现有方法进行更改或引入新方法时,Eclipse 会将文件放置在正确的位置 在网络服务器下。如果类加载器已经在 perm gen 空间中加载了类,它将从 permgen 空间中卸载它并在内部加载新的而不需要重新启动服务器,以便反射(reflect)新的更改(字节码)。那是对的吗 ?

如果是,为什么热部署不适用于新方法和新类文件?

最佳答案

推理非常复杂,只有熟悉 JVM 以及它如何管理内存的人才能完全了解。这里有一个不错的解释:Java HotSwap Guide (虽然它实际上是 JRebel 产品的广告)- 滚动到标题为 为什么 HotSwap 仅限于方法体?的部分。

要点:有两个主要因素会阻止 HotSwap 处理类的结构更改:JIT 和内存分配。

JVM 中的 JIT(即时)编译器在类加载并运行几次后优化字节码,基本上内联了许多调用以提高性能。在类签名和结构可能发生变化的环境中安全有效地实现该功能将是一项重大挑战。

如果允许更改类结构,有关内存管理会发生什么其他问题。 JVM 将不得不修改现有的类实例,这意味着将它们重新定位到堆存储的其他部分。更不用说必须自己重新定位类对象。 JVM 的内存管理已经非常复杂且高度优化;此类更改只会增加复杂性并可能降低 JIT 编译器的性能(并可能导致其他错误)。

我认为可以安全地假设 JVM 工程师不愿意在支持此功能所需的性能和错误足迹上进行权衡。这就是 JRebel 等产品应运而生的原因。

关于java - 为什么Java的调试Hot Swap仅限于方法内的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34473125/

相关文章:

java - 如何使用 Spring Security Java 配置将 HTTP 请求重定向到 HTTPS?

debugging - Selector 的调试值

Javascript循环没有停止..我的结果在一秒钟后就消失了

java - 无论如何要在 Coldfusion 9 中热部署 Jar?

java - Dropwizard热部署

java - 如何制作从列表末尾开始的列表迭代器

java - Spring Data JPA 规范 groupBy

java - 检索文件系统中图像的尺寸

c# - 使用跟踪监听器将调试输出重定向到文件时出现问题

java - Java 项目中的自动更新属性文件值