如何跟踪java应用程序中创建的对象的数量?

问题描述 投票:1回答:3

最近在接受采访时遇到了这个问题:

您有一个Java应用程序,它使用连接对象连接到不同的客户端。连接对象的类型为ClientConnection。我想知道在这个应用程序的特定时刻有多少个活动连接对象?

我给出的答案:

  1. 我将在ClientConnection类中创建一个静态变量connectionCount。
  2. 每次调用ClientConnection构造函数时,我都会将静态变量计数增加1。
  3. 我将覆盖ClientConnection中的finalize()方法,并在每次调用时将变量count减1。

但是采访者对这个答案并不满意。 我们对这个问题有其他方法吗?

java design-patterns
3个回答
1
投票

我认为你出错的关键部分是假设面试官真的希望你跟踪JVM中对象实例的数量。相反,我认为这是为了跟踪处于“打开”状态的对象数量,对象的用户在使用它时需要通过close()方法处理对象(类似于如何JDBC连接工作)。

假设ClientConnection有某种开放和关闭的方法,我会用以下方式实现:

public class ClientConnection {

  private static final AtomicInteger count = new AtomicInteger();

  public void open() {
    // This could also be in the constructor, depending on
    // the requirements of the object
    count.incrementAndGet();
  }

  public void close() {
    // <close out the physical connection>
    count.decrementAndGet();
  }

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

}

基本上只是使用线程安全整数作为类的静态成员,然后通过打开/关闭方法测量连接的生命周期。您还可以将公共构造函数视为open方法。


0
投票

关闭连接时,可能不会立即调用finalize()方法。在对象被垃圾收集之前不会被调用,这可能是在任何时候,或者如果JVM退出而没有运行垃圾收集则不会被调用。在连接关闭时(当套接字关闭时),应该在连接上有某种监听器。 Here在解决这个问题上有所帮助。


0
投票

依赖finalize()是不好的,因为它不能保证在任何给定程序的生命周期内被调用。

此外,仅仅因为JVM垃圾收集给定对象并不意味着操作系统将对所请求的任何资源执行任何特殊操作;例如,假设ClientConnection打开一个套接字,即使在对象被垃圾回收之后,操作系统也可能使套接字保持活动状态。

您需要连接上的侦听器,或者需要使用对象池模式。

© www.soinside.com 2019 - 2024. All rights reserved.