java—当我更改类时,实例会发生什么情况?

java—当我更改类时,实例会发生什么情况?,java,memory,memory-management,dynamic,memory-model,Java,Memory,Memory Management,Dynamic,Memory Model,我将被要求提出一个自适应类布局,即在我的例子中,一个可以将某些数组元素作为自己的字段内联或在运行时更改其大小的类布局 我还不知道该怎么做,但让我们先假设一下,我有 当我更改所述类的字节码时,类A的实例会发生什么情况 特别是,如何处理字段/方法偏移 例如,假设我向类添加了一个字段。。。这会影响已创建的实例还是仅影响新创建的实例 编辑:由于人们都在询问细节,我的任务是 在运行时对以前关于类布局修改的工作进行调查,并根据调查中获得的知识,对[技术细节]实施此类类布局修改 如果您对这些技术细节感兴趣,我

我将被要求提出一个自适应类布局,即在我的例子中,一个可以将某些数组元素作为自己的字段内联或在运行时更改其大小的类布局

我还不知道该怎么做,但让我们先假设一下,我有

当我更改所述类的字节码时,类A的实例会发生什么情况

特别是,如何处理字段/方法偏移

例如,假设我向类添加了一个字段。。。这会影响已创建的实例还是仅影响新创建的实例

编辑:由于人们都在询问细节,我的任务是

在运行时对以前关于类布局修改的工作进行调查,并根据调查中获得的知识,对[技术细节]实施此类类布局修改

如果您对这些技术细节感兴趣,我将在

框架,它使用-atm-一个固定大小的锁数组,每个锁由一个数值组成,最后N个字节用作事务ID

由于使用锁数组减少了数据的局部性,我们感兴趣的是确定一种启发式方法,该方法将告诉我们何时内联锁是有意义的,即锁和它们所对应的对象最终可能位于同一缓存线中

此外,使用固定大小的ID人为地限制了可以在任何一个时间点同时活动的事务量。因此,我们希望能够按需种植它们


我应该设计一个同时支持这两种功能的动态类布局,根据需要内联锁和扩展锁。

这是不可能的。至少没有非常黑暗的魔法。如果你决定应用其中的一部分,会发生什么情况取决于你自己

编辑:

很难证明缺少什么,但我试图给出一些论点:

在语言规范和公共API中没有这样的选项。 我所知道的所有实现都不支持该功能。 在运行时更改类型定义不符合静态类型的思想。 您正在寻找一些字节码修改框架,如:

所有类型的框架都使用其中一些来构建代理对象。也许这是一个糟糕的例子,因为它正在构造一个新的可赋值的丰富类。但正如前面提到的,你真的需要知道你在做什么

至少asm为您提供了一个验证器,以获取最终引入的问题的一些提示。不知道其他框架如何处理这个问题

说了这一切,又是一个警告!!!
最好尝试改进您的应用程序架构,或者尝试Apaches DynaBean之类的东西。

您如何在不破坏运行中的JVM的情况下更改字节码?@Stultuske正如我所说,我不知道。我只是假设动态类布局需要手动重新安排类成员。我建议不要这样做。请向我们解释您想用这种自适应类布局解决什么问题。最有可能的是,我们能够提出一个不需要黑魔法的解决方案。@RalfKleberhoff见editI退出游戏。这项任务需要对整个堆栈有透彻的了解,从Java同步到HotSpot编译器所做的优化,再到CPU切换策略。你能详细解释一下为什么不可能吗?显然,这不是不可能的,因为存在完全热重新加载的产品。这是一种模糊的黑暗魔法,但几乎不可能。@DaveNewton从未见过任何魔法。支持运行时重新加载的ll产品只能更改方法正文,但不能添加或删除字段,甚至不能更改方法参数列表。这些功能在中指定:重新定义可能会更改方法体、常量池和属性。重新定义不得添加、删除或重命名字段或方法、更改方法的签名或更改继承。这些限制可能会在将来的版本中取消可能会有具有更多功能的自定义JVM,但如果该软件不在标准JVM(如HotSpot)上运行,则没有任何帮助。我已经开始研究ASM,是的。但是,我只知道如何在加载之前修改内容。我将被要求在运行时修改类。引用:对以前关于cla的工作进行调查在运行时对ss布局进行修改,并根据调查中获得的知识,对[技术细节]实施此类类布局修改。