View Javadoc

    1   /*
    2    * Copyright 2012 The Netty Project
    3    *
    4    * The Netty Project licenses this file to you under the Apache License,
    5    * version 2.0 (the "License"); you may not use this file except in compliance
    6    * with the License. You may obtain a copy of the License at:
    7    *
    8    *   http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    13   * License for the specific language governing permissions and limitations
    14   * under the License.
    15   */
    16  package org.jboss.netty.util.internal;
    17
    18  import java.util.concurrent.atomic.AtomicBoolean;
    19  import java.util.concurrent.atomic.AtomicLong;
    20
    21  import org.jboss.netty.logging.InternalLogger;
    22  import org.jboss.netty.logging.InternalLoggerFactory;
    23
    24  /**
    25   * Warn when user creates too many instances to avoid {@link OutOfMemoryError}.
    26   */
    27  public class SharedResourceMisuseDetector {
    28
    29      private static final int MAX_ACTIVE_INSTANCES = 256;
    30      private static final InternalLogger logger =
    31          InternalLoggerFactory.getInstance(SharedResourceMisuseDetector.class);
    32
    33      private final Class<?> type;
    34      private final AtomicLong activeInstances = new AtomicLong();
    35      private final AtomicBoolean logged = new AtomicBoolean();
    36
    37      public SharedResourceMisuseDetector(Class<?> type) {
    38          if (type == null) {
    39              throw new NullPointerException("type");
    40          }
    41          this.type = type;
    42      }
    43
    44      public void increase() {
    45          if (activeInstances.incrementAndGet() > MAX_ACTIVE_INSTANCES) {
    46              if (logger.isWarnEnabled()) {
    47                  if (logged.compareAndSet(false, true)) {
    48                      logger.warn(
    49                              "You are creating too many " + type.getSimpleName() +
    50                              " instances.  " + type.getSimpleName() +
    51                              " is a shared resource that must be reused across the" +
    52                              " application, so that only a few instances are created.");
    53                  }
    54              }
    55          }
    56      }
    57
    58      public void decrease() {
    59          activeInstances.decrementAndGet();
    60      }
    61  }