【问题标题】:java - what happens to instances when I change the class?java - 当我更改类时,实例会发生什么?
【发布时间】:2017-10-02 09:39:18
【问题描述】:

我将被要求提出一种“自适应”类布局,即在我的情况下,可以将某些数组元素作为自己的字段内联或在运行时更改它们的大小。

我不知道该怎么做(还没有?),但让我们假设一下,我知道。

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

具体来说,如何处理字段/方法偏移量?

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

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

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

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

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

由于使用锁数组减少了数据局部性,我们有兴趣确定一种启发式方法,它会告诉我们何时内联锁是有意义的 - 即,锁和它们对应的对象(希望)最终位于相同的缓存行。

此外,使用固定大小的 ID 会人为地限制在任何一个时间点可以同时处于活动状态的事务数量。所以我们希望能够按需“增长”它们。

我应该想出一个动态的类布局来支持两者,内联锁并根据需要增加它们。

【问题讨论】:

  • 如何在不使(正在运行的)JVM 崩溃的情况下更改字节码?
  • @Stultuske 正如我所说,我不知道。我只是假设动态类布局需要手动重新排列类成员。
  • 我建议不要这样做。请向我们解释你想用这个自适应类布局解决什么问题。很可能我们将能够提出一个不需要“黑魔法”的解决方案。
  • @RalfKleberhoff 查看编辑
  • 我退出了游戏。这项任务需要深入了解整个堆栈,从 Java 同步到 HotSpot 编译器完成的优化,再到 CPU chaching 策略。

标签: java memory memory-management dynamic memory-model


【解决方案1】:

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

编辑

很难证明不存在某些东西,但我尝试给出一些论据:

  • 语言规范和公共 API 中没有这样的选项。
  • 据我所知,没有一个实现支持该功能。
  • 在运行时更改类型定义是违反静态类型的想法。

【讨论】:

  • 您能否详细说明为什么这是不可能的?
  • 显然这不是不可能的,因为存在完全热重载的产品。这是一种模糊的黑暗魔法,但几乎不可能。
  • @DaveNewton 从未见过。支持runtime reloading的产品只能改变方法体,不能增删字段,甚至不能改变方法参数列表。
  • 功能在Instrumentation API中指定:“重新定义可能会改变方法体、常量池和属性。重新定义不得添加、删除或重命名字段或方法,更改方法的签名或更改继承。这些限制可能会在未来的版本中取消。” 可能会有具有更多功能的自定义 JVM,但如果软件不能在像 HotSpot 这样的标准 JVM 上运行,这将无济于事。
【解决方案2】:

您正在寻找一些字节码修改框架,例如:

http://asm.ow2.org/

各种框架都使用其中的一些来构建,例如代理对象。也许这是一个不好的例子,因为它正在构建一个新的丰富类,它是可分配的。但如前所述,您确实需要知道自己在做什么。

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

说了这么多,又是一个警告!!! 最好尝试改进您的应用程序架构或尝试类似 Apaches DynaBean (https://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/DynaBean.html)。

【讨论】:

  • 我已经开始研究 ASM,是的。但是,我只看到如何在加载它们之前修改它们之前。我将需要在运行时修改类。引用:“对之前关于在运行时修改类布局的工作进行调查,并根据调查中获得的知识,为 [技术细节] 实施这样的类布局修改”。
猜你喜欢
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2010-10-12
  • 2012-11-24
  • 2015-02-04
相关资源
最近更新 更多