Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright (C) 2007 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.inject.internal.util;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A reference queue with an associated background thread that dequeues
* references and invokes {@link FinalizableReference#finalizeReferent()} on
* them.
*
*
Keep a strong reference to this object until all of the associated
* referents have been finalized. If this object is garbage collected earlier,
* the backing thread will not invoke {@code finalizeReferent()} on the
* remaining references.
*
* @author Bob Lee
*/
public class FinalizableReferenceQueue {
/*
* The Finalizer thread keeps a phantom reference to this object. When the
* client (ReferenceMap, for example) no longer has a strong reference to
* this object, the garbage collector will reclaim it and enqueue the
* phantom reference. The enqueued reference will trigger the Finalizer to
* stop.
*
* If this library is loaded in the system class loader,
* FinalizableReferenceQueue can load Finalizer directly with no problems.
*
* If this library is loaded in an application class loader, it's important
* that Finalizer not have a strong reference back to the class loader.
* Otherwise, you could have a graph like this:
*
* Finalizer Thread
* runs instance of -> Finalizer.class
* loaded by -> Application class loader
* which loaded -> ReferenceMap.class
* which has a static -> FinalizableReferenceQueue instance
*
* Even if no other references to classes from the application class loader
* remain, the Finalizer thread keeps an indirect strong reference to the
* queue in ReferenceMap, which keeps the Finalizer running, and as a result,
* the application class loader can never be reclaimed.
*
* This means that dynamically loaded web applications and OSGi bundles can't
* be unloaded.
*
* If the library is loaded in an application class loader, we try to break
* the cycle by loading Finalizer in its own independent class loader:
*
* System class loader
* -> Application class loader
* -> ReferenceMap
* -> FinalizableReferenceQueue
* -> etc.
* -> Decoupled class loader
* -> Finalizer
*
* Now, Finalizer no longer keeps an indirect strong reference to the
* static FinalizableReferenceQueue field in ReferenceMap. The application
* class loader can be reclaimed at which point the Finalizer thread will
* stop and its decoupled class loader can also be reclaimed.
*
* If any of this fails along the way, we fall back to loading Finalizer
* directly in the application class loader.
*/
private static final Logger logger
= Logger.getLogger(FinalizableReferenceQueue.class.getName());
private static final String FINALIZER_CLASS_NAME
= "com.google.inject.internal.util.Finalizer";
/** Reference to Finalizer.startFinalizer(). */
private static final Method startFinalizer;
static {
Class> finalizer = loadFinalizer(
new SystemLoader(), new DecoupledLoader(), new DirectLoader());
startFinalizer = getStartFinalizer(finalizer);
}
/**
* The actual reference queue that our background thread will poll.
*/
final ReferenceQueue