Recently, when looking at the LeakCanary principle, we found that we can create a ReferenceQueue queue.

After using new WeakReference(object, ReferenceQueue), if the object object is recovered, the WeakReference object will be added to the ReferenceQueue queue.

Write a test code for this and record it.

public class LeakMemoryTest {
	// Create a reference collection queue
	static ReferenceQueue<LeakMemoryTest> queue = new ReferenceQueue<>();
	/ / weak references
	static WeakReference<LeakMemoryTest> ref;

	public static void main(String[] args) {
		// Test the collection object
		LeakMemoryTest t = new LeakMemoryTest();
		// Weak reference associated test object and reclaim queue
		ref = new WeakReference<>(t, queue);
		// Log print recycle queue
		printQueue(queue);
		// Empty the test object. If it is not empty, the object will not be recycled and the last reference object will not appear in the queue
		t = null;
                System.out.println("release object.");
		Thread thread = new Thread(new Runnable() {
			@Override
			public void run(a) {
				long millis = 2000L;
				int maxCount = 5;
				int current = 0;
				// Determine whether objects in weak references are reclaimed
				while(ref.get()! =null&& current < maxCount){
					System.out.println("sleep"+millis+"ms,start gc operation ");
					try {
						Thread.sleep(millis);
					} catch (InterruptedException e) {
						e.printStackTrace();
						break;
					}
					/ / gcSystem.gc(); current++; }}}); thread.start();try {
			thread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// Log print recycle queue
		printQueue(queue);
	}

	private static void printQueue(ReferenceQueue<LeakMemoryTest> queue){
		Reference<? extends LeakMemoryTest> temp;
		System.out.println("\ nqueue left left left left left left left left left left left left left left down down down down down down down down down");
		do{
			temp = queue.poll();
			if(temp ! =null){
				System.out.println("reclaimed object :" + temp.toString()+" , ReferenceQueue object = "+temp.get()); }}while(temp! =null);
		System.out.println("The queue write write write write write write write write write write write write write write \ n"); }}Copy the code

Final running result:

Queue left left left left left left left left left left left left left left down down down down down down down down down the queue write write write write write write write write write write write write write write the release object. Sleep2000ms, Start the gc operation queue left left left left left left left left left left left left down down down down down down down down down left left reclaimed object: Java. Lang. Ref. 15 db9742 WeakReference @ ReferenceQueue object =nullThe queue write write write write write write write write write write write write write writeCopy the code