当前位置: 首页 > 面试题库 >

Java中在运行时存在一个类的多少个实例

白信鸿
2023-03-14
问题内容

今天在面试中,我被要求编写代码来确定在Java运行时类的多少实例退出。

我告诉他们,我们可以利用反思。请告诉我您是否有有效的方法。


问题答案:

我认为反思不会帮助您。有JVMTI(以及较早且现在已不存在的JVMPI)可用于分析堆并确定类的当前实例数。

一种编码的替代方法是向您要跟踪以下实例的类添加一个计数器:

class Myclass {

   static private final AtomicInteger count = new AtomicInteger();

   {
      count.getAndIncrement();
   }

   static public int instanceCount() { 
      return count.get();
   }

   // edit: account for serializable
   private void readObject(ObjectInputStream ois) 
       throws ClassNotFoundException, IOException {
      counter.getAndIncrement();
      ois.defaultReadObject();          
   }
}

这将跟踪曾经创建的实例数量,并且是线程安全的。要了解何时对实例进行垃圾回收,可以使用PhantomReferenceReferenceQueue来跟踪收集的实例并减少计数器。

class Myclass {

   static private final AtomicInteger count = new AtomicInteger();
   static private final ReferenceQueue<MyClass> queue = new ReferenceQueue<MyClass>();

   {
      count.getAndIncrement();
      new PhantomReference<MyObject>(this, queue);
   }

   static public int instanceCount() { 
      return count.get();
   }

   static {
      Thread t = new Thread() {
         public void run() {
            for (;;) {
               queue.remove();
               count.decrementAndGet();
            }
         }
      };
      t.setDaemon(true);
      t.start();
   }

}

编辑:

如果该类是可序列化的,则实现该readObject方法并增加计数器。我已将其添加到第一个代码示例中。



 类似资料:
  • 问题内容: 我有一个绝妙的主意,可以加快生成36个文件所需的时间:使用36个线程!不幸的是,如果我使用36个线程/会话启动一个连接(一个连接对象),那么与每次执行每个线程相比,所有事情的滞后性更大。 现在,如果我尝试创建36个新连接(36个连接对象),则每个线程都有一个单独的服务器连接,要么我退出内存异常(以某种方式程序仍然运行,并成功结束工作,但速度比我慢依次执行一个线程)。 那么该怎么办?如何

  • 我有一个应用程序在Liberty Server中作为war运行。如何在Liberty Server中运行同一个程序的多个实例?有办法在java代码里面得到战争的名字吗? String completePath=getClass()。getProtectionDomain()。getCodeSource()。getLocation()。旅游()。getPath(); 归来的.../target/cl

  • 我的查询如下: > 在我的应用程序中,我需要在计划中同时运行多个pyspark应用程序。是否有任何方法可以同时从spark驱动程序运行多个pyspark应用程序,从而创建单独的sparkcontext对象? 如果第一个查询的答案是否定的,那么我可以运行一个应用程序从驱动程序,另一个从执行程序,但我可以一次运行它。 null 配置:VM-1:Hadoop主节点、Spark驱动程序和执行程序、Mong

  • 问题很明显。当我准备好JVM规范时,我遇到了Java堆栈 “2.5.2 Java虚拟机堆栈” 每个Java虚拟机线程都有一个私有Java虚拟机堆栈,与线程同时创建。Java虚拟机堆栈存储帧(§2.6)。Java虚拟机堆栈类似于C等传统语言的堆栈:它保存局部变量和部分结果,并在方法调用和返回中发挥作用。由于Java虚拟机堆栈除了用于推送和弹出帧之外,从未被直接操作,因此帧可能是堆分配的。Java虚拟

  • Java如何在运行时获取一个类的所有对象实例?这个类不一定由Spring管理,也不一定是单例 根据类名+ClassLoader得到所有的类的对象实例,而不是反射并new一个对象

  • java中一个普通线程需要多少内存。假设没有与之关联的对象。