在java中,在执行过程中的任何特定时间点都可以找到内存堆上的当前对象吗?

在java中,在执行过程中的任何特定时间点都可以找到内存堆上的当前对象吗?,java,memory,object,Java,Memory,Object,说我有课 class A{ //code for class A } class B{ //code for class B } class A{ public static void main(String a[]){ //Initialize m instances of A and n instances of B and store each in arrays //Equate any arbit index in the array to null

说我有课

class A{
  //code for class A
}


class B{
  //code for class B
}

class A{
  public static void main(String a[]){
    //Initialize m instances of A and n instances of B and store each in arrays
    //Equate any arbit index in the array to null
  }
}

在这个场景中,我的主要目标是在内存中的任意点找到类A和B的所有活动实例

我想一定可以使用调试器


但是,由于某些原因(原因超出了问题的范围),我需要从代码本身中获取实例。因此,我需要这样一个函数

public void getAllActiveInstances(){
  //Print values
}

编辑:我不需要实例来操作它们。我只想知道它们是否存在。这主要用于调试目的。
如果这是不可能的,那么请解释如何使用调试器进行同样的操作。

简短的回答是否,您不应该在任何时候使用java查看内存内部

很长的答案是,如果在GC收集对象之后有任何方式访问它,那么您就违反了GC的原则,即只收集执行代码无法以任何方式访问的对象。垃圾收集的内存将被释放并返回给程序,以便对其执行任何操作。这意味着,如果你已经GC了一个对象A,java可以将任意数量的东西写入该位置,从而破坏该内存块的“A-ness”。试图读取现在存储在内存块中的对象B,并假装它是A,这将导致各种问题


展望未来:为了跟踪您创建的所有类,我建议修改类本身。类可以有一个
静态
容器(如
HashMap
),构造函数将构造的类添加到
HashMap
。但是,请注意,由于您挂起对所有已创建对象的引用,垃圾收集将永远不会收集这些对象并释放内存。

简短的回答是否,您不应该在任何时候使用java查看内存内部

很长的答案是,如果在GC收集对象之后有任何方式访问它,那么您就违反了GC的原则,即只收集执行代码无法以任何方式访问的对象。垃圾收集的内存将被释放并返回给程序,以便对其执行任何操作。这意味着,如果你已经GC了一个对象A,java可以将任意数量的东西写入该位置,从而破坏该内存块的“A-ness”。试图读取现在存储在内存块中的对象B,并假装它是A,这将导致各种问题

展望未来:为了跟踪您创建的所有类,我建议修改类本身。类可以有一个
静态
容器(如
HashMap
),构造函数将构造的类添加到
HashMap
。但是,请注意,由于您挂起对所有已创建对象的引用,垃圾收集将永远不会收集这些对象并释放内存。

“在这种情况下,我的主要目标是在内存中的任意点查找类A和B的所有活动实例,而不管垃圾收集器是否删除了该对象。”

如果垃圾收集器删除了它,它将不会是活动实例,也不会是任何类型的实例

这方面没有Java API,当然JRockit飞行控制和/或调试器可以为您做到这一点,但如果您想要一种实际的编程方式,则必须手动进行。祝您好运,使其可靠。您可能需要使用构造函数和终结器来增加和减少对象计数

不要尝试实现自己的对象池,除非您真的真的认为自己可以在自己的游戏中击败hotspot Optimizer。

“在这种情况下,我的主要目标是在内存中的任何位置找到类A和B的所有活动实例,而不管垃圾收集器是否删除了对象。”

如果垃圾收集器删除了它,它将不会是活动实例,也不会是任何类型的实例

这方面没有Java API,当然JRockit飞行控制和/或调试器可以为您做到这一点,但如果您想要一种实际的编程方式,则必须手动进行。祝您好运,使其可靠。您可能需要使用构造函数和终结器来增加和减少对象计数


不要尝试实现自己的对象池,除非你真的认为自己可以在自己的游戏中击败hotspot Optimizer。

如你所述,你可以使用调试器来完成。Java提供了调试API。你可以实现自己的调试器并连接到应用程序本身

另一种方法是给你的课程配备仪器。我知道以下技巧:

  • 使用存储对所有必须监视的实例的引用的特殊工厂来实例化它们
  • 使用AOP(例如AspectJ)。aspect会将创建的实例注册到存储库中(如上所述)
  • 用于动态更改类。请看一看-一个使用java instrumentation API的非常简单的项目。您可以使用它作为示例来了解该问题

  • 正如您所提到的,您可以使用调试器进行调试。Java提供了调试API。您可以实现自己的调试器并连接到应用程序本身

    另一种方法是给你的课程配备仪器。我知道以下技巧:

  • 使用存储对所有必须监视的实例的引用的特殊工厂来实例化它们
  • 使用AOP(例如AspectJ)。aspect会将创建的实例注册到存储库中(如上所述)
  • 用于动态更改类。请看一看-一个使用java instrumentation API的非常简单的项目。您可以使用它作为示例来了解该问题

  • “原因超出了问题的范围”-那么你问错了问题。你不应该以你正在尝试的方式获取实例。@artbristol+