Package io.netty.util

Class ResourceLeakDetector.DefaultResourceLeak<T>

    • Constructor Detail

      • DefaultResourceLeak

        DefaultResourceLeak​(java.lang.Object referent,
                            java.lang.ref.ReferenceQueue<java.lang.Object> refQueue,
                            java.util.Set<ResourceLeakDetector.DefaultResourceLeak<?>> allLeaks,
                            java.lang.Object initialHint)
    • Method Detail

      • record0

        private void record0​(java.lang.Object hint)
        This method works by exponentially backing off as more records are present in the stack. Each record has a 1 / 2^n chance of dropping the top most record and replacing it with itself. This has a number of convenient properties:
        1. The current record is always recorded. This is due to the compare and swap dropping the top most record, rather than the to-be-pushed record.
        2. The very last access will always be recorded. This comes as a property of 1.
        3. It is possible to retain more records than the target, based upon the probability distribution.
        4. It is easy to keep a precise record of the number of elements in the stack, since each element has to know how tall the stack is.
        In this particular implementation, there are also some advantages. A thread local random is used to decide if something should be recorded. This means that if there is a deterministic access pattern, it is now possible to see what other accesses occur, rather than always dropping them. Second, after ResourceLeakDetector.TARGET_RECORDS accesses, backoff occurs. This matches typical access patterns, where there are either a high number of accesses (i.e. a cached buffer), or low (an ephemeral buffer), but not many in between. The use of atomics avoids serializing a high number of accesses, when most of the records will be thrown away. High contention only happens when there are very few existing records, which is only likely when the object isn't shared! If this is a problem, the loop can be aborted and the record dropped, because another thread won the race.
      • dispose

        boolean dispose()
      • close

        public boolean close()
        Description copied from interface: ResourceLeak
        Close the leak so that ResourceLeakDetector does not warn about leaked resources.
        Specified by:
        close in interface ResourceLeak
        Returns:
        true if called first time, false if called already
      • close

        public boolean close​(T trackedObject)
        Description copied from interface: ResourceLeakTracker
        Close the leak so that ResourceLeakTracker does not warn about leaked resources. After this method is called a leak associated with this ResourceLeakTracker should not be reported.
        Specified by:
        close in interface ResourceLeakTracker<T>
        Returns:
        true if called first time, false if called already
      • reachabilityFence0

        private static void reachabilityFence0​(java.lang.Object ref)
        Ensures that the object referenced by the given reference remains strongly reachable, regardless of any prior actions of the program that might otherwise cause the object to become unreachable; thus, the referenced object is not reclaimable by garbage collection at least until after the invocation of this method.

        Recent versions of the JDK have a nasty habit of prematurely deciding objects are unreachable. see: https://stackoverflow.com/questions/26642153/finalize-called-on-strongly-reachable-object-in-java-8 The Java 9 method Reference.reachabilityFence offers a solution to this problem.

        This method is always implemented as a synchronization on ref, not as Reference.reachabilityFence for consistency across platforms and to allow building on JDK 6-8. It is the caller's responsibility to ensure that this synchronization will not cause deadlock.

        Parameters:
        ref - the reference. If null, this method has no effect.
        See Also:
        Reference.reachabilityFence(java.lang.Object)
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • getReportAndClearRecords

        java.lang.String getReportAndClearRecords()