All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.portal.kernel.test.GCUtil Maven / Gradle / Ivy

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.portal.kernel.test;

import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

import java.util.ArrayList;
import java.util.List;

import org.junit.Assert;

/**
 * @author Shuyang Zhou
 */
public class GCUtil {

	public static void fullGC(boolean ensureEnqueuedReferences)
		throws InterruptedException {

		ReferenceQueue referenceQueue = new ReferenceQueue<>();

		SoftReference softReference = new SoftReference<>(
			new Object(), referenceQueue);

		List list = new ArrayList<>();

		while (true) {
			try {
				list.add(new byte[100 * 1024 * 1024]);
			}
			catch (OutOfMemoryError oome) {
				list.clear();

				list = null;

				break;
			}
		}

		Assert.assertNull(softReference.get());
		Assert.assertSame(softReference, referenceQueue.remove());

		if (ensureEnqueuedReferences) {
			fullGC(false);
		}
	}

	public static void gc(boolean ensureEnqueuedReferences)
		throws InterruptedException {

		gc(true, ensureEnqueuedReferences);
	}

	public static void gc(boolean actively, boolean ensureEnqueuedReferences)
		throws InterruptedException {

		ReferenceQueue referenceQueue = new ReferenceQueue<>();

		WeakReference weakReference = new WeakReference<>(
			new Object(), referenceQueue);

		if (actively) {
			while (weakReference.get() != null) {
				System.gc();

				System.runFinalization();
			}
		}

		Assert.assertSame(weakReference, referenceQueue.remove());

		if (ensureEnqueuedReferences) {
			gc(actively, false);
		}
	}

}