/** * This method is called when a traced leak is detected. It can be overridden for tracking how many times leaks * have been detected. */ protected void reportTracedLeak(String resourceType, String records) { logger.error( "LEAK: {}.release() was not called before it's garbage-collected. " + "See http://netty.io/wiki/reference-counted-objects.html for more information.{}", resourceType, records); }
/** * This method is called when a traced leak is detected. It can be overridden for tracking how many times leaks * have been detected. */ protected void reportTracedLeak(String resourceType, String records) { logger.error( "LEAK: {}.release() was not called before it's garbage-collected. " + "See http://netty.io/wiki/reference-counted-objects.html for more information.{}", resourceType, records); }
/** * This method is called when a traced leak is detected. It can be overridden for tracking how many times leaks * have been detected. */ protected void reportTracedLeak(String resourceType, String records) { logger.error( "LEAK: {}.release() was not called before it's garbage-collected. " + "See http://netty.io/wiki/reference-counted-objects.html for more information.{}", resourceType, records); }
private static Constructor<?> customClassConstructor(String customLeakDetector) { try { final Class<?> detectorClass = Class.forName(customLeakDetector, true, PlatformDependent.getSystemClassLoader()); if (ResourceLeakDetector.class.isAssignableFrom(detectorClass)) { return detectorClass.getConstructor(Class.class, int.class); } else { logger.error("Class {} does not inherit from ResourceLeakDetector.", customLeakDetector); } } catch (Throwable t) { logger.error("Could not load custom resource leak detector class provided: {}", customLeakDetector, t); } return null; }
private static Constructor<?> obsoleteCustomClassConstructor(String customLeakDetector) { try { final Class<?> detectorClass = Class.forName(customLeakDetector, true, PlatformDependent.getSystemClassLoader()); if (ResourceLeakDetector.class.isAssignableFrom(detectorClass)) { return detectorClass.getConstructor(Class.class, int.class, long.class); } else { logger.error("Class {} does not inherit from ResourceLeakDetector.", customLeakDetector); } } catch (Throwable t) { logger.error("Could not load custom resource leak detector class provided: {}", customLeakDetector, t); } return null; }
private static void safeExecute(EventExecutor executor, Runnable task) { try { executor.execute(task); } catch (Throwable t) { rejectedExecutionLogger.error("Failed to submit a listener notification task. Event loop shut down?", t); } } }
private static Constructor<?> obsoleteCustomClassConstructor(String customLeakDetector) { try { final Class<?> detectorClass = Class.forName(customLeakDetector, true, PlatformDependent.getSystemClassLoader()); if (ResourceLeakDetector.class.isAssignableFrom(detectorClass)) { return detectorClass.getConstructor(Class.class, int.class, long.class); } else { logger.error("Class {} does not inherit from ResourceLeakDetector.", customLeakDetector); } } catch (Throwable t) { logger.error("Could not load custom resource leak detector class provided: {}", customLeakDetector, t); } return null; }
private static Constructor<?> customClassConstructor(String customLeakDetector) { try { final Class<?> detectorClass = Class.forName(customLeakDetector, true, PlatformDependent.getSystemClassLoader()); if (ResourceLeakDetector.class.isAssignableFrom(detectorClass)) { return detectorClass.getConstructor(Class.class, int.class); } else { logger.error("Class {} does not inherit from ResourceLeakDetector.", customLeakDetector); } } catch (Throwable t) { logger.error("Could not load custom resource leak detector class provided: {}", customLeakDetector, t); } return null; }
private static void safeExecute(EventExecutor executor, Runnable task) { try { executor.execute(task); } catch (Throwable t) { rejectedExecutionLogger.error("Failed to submit a listener notification task. Event loop shut down?", t); } } }
/** * This method is called when an untraced leak is detected. It can be overridden for tracking how many times leaks * have been detected. */ protected void reportUntracedLeak(String resourceType) { logger.error("LEAK: {}.release() was not called before it's garbage-collected. " + "Enable advanced leak reporting to find out where the leak occurred. " + "To enable advanced leak reporting, " + "specify the JVM option '-D{}={}' or call {}.setLevel() " + "See http://netty.io/wiki/reference-counted-objects.html for more information.", resourceType, PROP_LEVEL, Level.ADVANCED.name().toLowerCase(), simpleClassName(this)); }
void notifyHalfClosed(Http2Stream stream) { for (int i = 0; i < listeners.size(); i++) { try { listeners.get(i).onStreamHalfClosed(stream); } catch (Throwable cause) { logger.error("Caught Throwable from listener onStreamHalfClosed.", cause); } } }
private static void reportTooManyInstances() { if (logger.isErrorEnabled()) { String resourceType = simpleClassName(HashedWheelTimer.class); logger.error("You are creating too many " + resourceType + " instances. " + resourceType + " is a shared resource that must be reused across the JVM," + "so that only a few instances are created."); } }
/** * This method is called when an untraced leak is detected. It can be overridden for tracking how many times leaks * have been detected. */ protected void reportUntracedLeak(String resourceType) { logger.error("LEAK: {}.release() was not called before it's garbage-collected. " + "Enable advanced leak reporting to find out where the leak occurred. " + "To enable advanced leak reporting, " + "specify the JVM option '-D{}={}' or call {}.setLevel() " + "See http://netty.io/wiki/reference-counted-objects.html for more information.", resourceType, PROP_LEVEL, Level.ADVANCED.name().toLowerCase(), simpleClassName(this)); }
@Override public <T> ResourceLeakDetector<T> newResourceLeakDetector(Class<T> resource, int samplingInterval) { if (customClassConstructor != null) { try { @SuppressWarnings("unchecked") ResourceLeakDetector<T> leakDetector = (ResourceLeakDetector<T>) customClassConstructor.newInstance(resource, samplingInterval); logger.debug("Loaded custom ResourceLeakDetector: {}", customClassConstructor.getDeclaringClass().getName()); return leakDetector; } catch (Throwable t) { logger.error( "Could not load custom resource leak detector provided: {} with the given resource: {}", customClassConstructor.getDeclaringClass().getName(), resource, t); } } ResourceLeakDetector<T> resourceLeakDetector = new ResourceLeakDetector<T>(resource, samplingInterval); logger.debug("Loaded default ResourceLeakDetector: {}", resourceLeakDetector); return resourceLeakDetector; } }
DefaultResourceLeakDetectorFactory() { String customLeakDetector; try { customLeakDetector = AccessController.doPrivileged(new PrivilegedAction<String>() { @Override public String run() { return SystemPropertyUtil.get("io.netty.customResourceLeakDetector"); } }); } catch (Throwable cause) { logger.error("Could not access System property: io.netty.customResourceLeakDetector", cause); customLeakDetector = null; } if (customLeakDetector == null) { obsoleteCustomClassConstructor = customClassConstructor = null; } else { obsoleteCustomClassConstructor = obsoleteCustomClassConstructor(customLeakDetector); customClassConstructor = customClassConstructor(customLeakDetector); } }
@SuppressWarnings("deprecation") @Override public <T> ResourceLeakDetector<T> newResourceLeakDetector(Class<T> resource, int samplingInterval, long maxActive) { if (obsoleteCustomClassConstructor != null) { try { @SuppressWarnings("unchecked") ResourceLeakDetector<T> leakDetector = (ResourceLeakDetector<T>) obsoleteCustomClassConstructor.newInstance( resource, samplingInterval, maxActive); logger.debug("Loaded custom ResourceLeakDetector: {}", obsoleteCustomClassConstructor.getDeclaringClass().getName()); return leakDetector; } catch (Throwable t) { logger.error( "Could not load custom resource leak detector provided: {} with the given resource: {}", obsoleteCustomClassConstructor.getDeclaringClass().getName(), resource, t); } } ResourceLeakDetector<T> resourceLeakDetector = new ResourceLeakDetector<T>(resource, samplingInterval, maxActive); logger.debug("Loaded default ResourceLeakDetector: {}", resourceLeakDetector); return resourceLeakDetector; }
private static void reportTooManyInstances() { if (logger.isErrorEnabled()) { String resourceType = simpleClassName(HashedWheelTimer.class); logger.error("You are creating too many " + resourceType + " instances. " + resourceType + " is a shared resource that must be reused across the JVM," + "so that only a few instances are created."); } }
@Override public <T> ResourceLeakDetector<T> newResourceLeakDetector(Class<T> resource, int samplingInterval) { if (customClassConstructor != null) { try { @SuppressWarnings("unchecked") ResourceLeakDetector<T> leakDetector = (ResourceLeakDetector<T>) customClassConstructor.newInstance(resource, samplingInterval); logger.debug("Loaded custom ResourceLeakDetector: {}", customClassConstructor.getDeclaringClass().getName()); return leakDetector; } catch (Throwable t) { logger.error( "Could not load custom resource leak detector provided: {} with the given resource: {}", customClassConstructor.getDeclaringClass().getName(), resource, t); } } ResourceLeakDetector<T> resourceLeakDetector = new ResourceLeakDetector<T>(resource, samplingInterval); logger.debug("Loaded default ResourceLeakDetector: {}", resourceLeakDetector); return resourceLeakDetector; } }
DefaultResourceLeakDetectorFactory() { String customLeakDetector; try { customLeakDetector = AccessController.doPrivileged(new PrivilegedAction<String>() { @Override public String run() { return SystemPropertyUtil.get("io.netty.customResourceLeakDetector"); } }); } catch (Throwable cause) { logger.error("Could not access System property: io.netty.customResourceLeakDetector", cause); customLeakDetector = null; } if (customLeakDetector == null) { obsoleteCustomClassConstructor = customClassConstructor = null; } else { obsoleteCustomClassConstructor = obsoleteCustomClassConstructor(customLeakDetector); customClassConstructor = customClassConstructor(customLeakDetector); } }
/** * This method is called when an untraced leak is detected. It can be overridden for tracking how many times leaks * have been detected. */ protected void reportUntracedLeak(String resourceType) { logger.error("LEAK: {}.release() was not called before it's garbage-collected. " + "Enable advanced leak reporting to find out where the leak occurred. " + "To enable advanced leak reporting, " + "specify the JVM option '-D{}={}' or call {}.setLevel() " + "See http://netty.io/wiki/reference-counted-objects.html for more information.", resourceType, PROP_LEVEL, Level.ADVANCED.name().toLowerCase(), simpleClassName(this)); }