gpt4 book ai didi

java - 从另一个 JVM 加载 JVM 中现有的类对象

转载 作者:行者123 更新时间:2023-12-01 18:46:22 26 4
gpt4 key购买 nike

如何从另一个 JVM 加载 JVM 中现有的类对象?

我正在分析我的服务器中的一个罕见场景。我的服务器中没有正确的日志来帮助我解决这种情况,我相信这可能是特定类对象(用户定义)的问题。

例如,下面是一个类:

public class MyRequest 
{
public byte[] getData()
{
return somdata;
}
}

目前,在我的服务器的 JVM 中,我的 JVM 内存中有 100 个上述类对象。我想知道是否有可能加载所有 100 个对象并访问它们的数据/方法 (getData())。我不想创建 MyRequest 类的新实例(我知道这很容易)。我想通过另一个 Java 进程从 JVM 加载现有对象。

P.S:我无法以任何理由终止我的服务器。P.S:我无法安装任何工具,如 VisualVM 等,而且工具告诉我们对象类型、内存,但不告诉我们确切的数据。

最佳答案

基本上,这是行不通的。

  1. 如果您无法附加调试器,您将无法执行任何操作。

  2. 如果您可以附加调试器,您应该能够找到并查看这些实例,但您将无法让它们执行其设计之外的操作做。特别是,如果它们没有被设计为可序列化,您将无法序列化它们。

我认为最好的选择是更改服务器代码以改进日志记录,然后使用调试器代理重新启动它......并等待问题再次出现。

当然,如果您附加了调试器,则无需将对象移动到另一个 JVM。你可以直接查看他们的状态。

<小时/>

但是,有一个问题。许多“极其罕见”的场景实际上与线程、线程安全和计时问题有关。为了观察此类错误的影响,您可以采取许多措施来改变程序的行为。

<小时/>

跟进

So if we know the starting address of the Virtual memory for that JVM...can we not know the data? assuming all objects are within the JVM memory space.

事情并不那么简单:

  • Java 堆上对象的位置是不可预测的。
  • 线程堆栈的位置不可预测。
  • 等等。

理论上可以转储任何进程的内存,重建 JVM 的执行状态,并“读取”对象的状态。但是您需要专门的工具和/或大量 JVM 内部知识才能做到这一点。我什至不确定这些工具是否存在......

简而言之,据我所知,这不切实际。

关于java - 从另一个 JVM 加载 JVM 中现有的类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17609429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com