1 // 2 // ======================================================================== 3 // Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. 4 // ------------------------------------------------------------------------ 5 // All rights reserved. This program and the accompanying materials 6 // are made available under the terms of the Eclipse Public License v1.0 7 // and Apache License v2.0 which accompanies this distribution. 8 // 9 // The Eclipse Public License is available at 10 // http://www.eclipse.org/legal/epl-v10.html 11 // 12 // The Apache License v2.0 is available at 13 // http://www.opensource.org/licenses/apache2.0.php 14 // 15 // You may elect to redistribute this code under either of these licenses. 16 // ======================================================================== 17 // 18 19 package org.eclipse.jetty.util.preventers; 20 21 import java.lang.reflect.Method; 22 23 /** 24 * GCThreadLeakPreventer 25 * 26 * Prevents a call to sun.misc.GC.requestLatency pinning a webapp classloader 27 * by calling it with a non-webapp classloader. The problem appears to be that 28 * when this method is called, a daemon thread is created which takes the 29 * context classloader. A known caller of this method is the RMI impl. See 30 * http://stackoverflow.com/questions/6626680/does-java-garbage-collection-log-entry-full-gc-system-mean-some-class-called 31 * 32 * This preventer will start the thread with the longest possible interval, although 33 * subsequent calls can vary that. Recommend to only use this class if you're doing 34 * RMI. 35 * 36 * Inspired by Tomcat JreMemoryLeakPrevention. 37 * 38 */ 39 public class GCThreadLeakPreventer extends AbstractLeakPreventer 40 { 41 /* ------------------------------------------------------------ */ 42 /** 43 * @see org.eclipse.jetty.util.preventers.AbstractLeakPreventer#prevent(java.lang.ClassLoader) 44 */ 45 @Override 46 public void prevent(ClassLoader loader) 47 { 48 try 49 { 50 Class clazz = Class.forName("sun.misc.GC"); 51 Method requestLatency = clazz.getMethod("requestLatency", new Class[] {long.class}); 52 requestLatency.invoke(null, Long.valueOf(Long.MAX_VALUE-1)); 53 } 54 catch (ClassNotFoundException e) 55 { 56 LOG.ignore(e); 57 } 58 catch (Exception e) 59 { 60 LOG.warn(e); 61 } 62 } 63 64 }