View Javadoc

1   /*
2    * Copyright 2009 Red Hat, Inc.
3    *
4    * Red Hat licenses this file to you under the Apache License, version 2.0
5    * (the "License"); you may not use this file except in compliance with the
6    * 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   * @author <a href="http://www.jboss.org/netty/">The Netty Project</a>
28   * @author <a href="http://gleamynode.net/">Trustin Lee</a>
29   * @version $Rev: 2234 $, $Date: 2010-04-06 18:23:25 +0900 (Tue, 06 Apr 2010) $
30   */
31  public class SharedResourceMisuseDetector {
32  
33      private static final int MAX_ACTIVE_INSTANCES = 256;
34      private static final InternalLogger logger =
35          InternalLoggerFactory.getInstance(SharedResourceMisuseDetector.class);
36  
37      private final Class<?> type;
38      private final AtomicLong activeInstances = new AtomicLong();
39      private final AtomicBoolean logged = new AtomicBoolean();
40  
41      public SharedResourceMisuseDetector(Class<?> type) {
42          if (type == null) {
43              throw new NullPointerException("type");
44          }
45          this.type = type;
46      }
47  
48      public void increase() {
49          if (activeInstances.incrementAndGet() > MAX_ACTIVE_INSTANCES) {
50              if (logged.compareAndSet(false, true)) {
51                  logger.warn(
52                          "You are creating too many " + type.getSimpleName() +
53                          " instances.  " + type.getSimpleName() +
54                          " is a shared resource that must be reused across the" +
55                          " application, so that only a few instances are created.");
56              }
57          }
58      }
59  
60      public void decrease() {
61          activeInstances.decrementAndGet();
62      }
63  }