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

时间:2017-12-27 18:20:35

标签: java design-patterns

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

  

你有一个java应用程序,它使用一个连接对象   连接到不同的客户端。连接对象是类型   ClientConnection。我想知道有多少个实时连接对象   出现在本申请的特定时刻?

我给出的答案:

  1. 我将在ClientConnection中创建一个静态变量connectionCount 类。
  2. 每次调用ClientConnection构造函数时,我都会递增 静态变量按1计算。
  3. 我将覆盖ClientConnection中的finalize()方法 每次调用变量count都会减1。
  4. 但面试官对这个答案并不满意 我们对这个问题有其他方法吗?

3 个答案:

答案 0 :(得分:1)

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

假设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 / close方法测量连接的生命周期。您还可以将公共构造函数视为open方法。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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