1
14
15 package com.liferay.portal.kernel.memory;
16
17 import com.liferay.portal.kernel.util.GetterUtil;
18 import com.liferay.portal.kernel.util.PropsKeys;
19 import com.liferay.portal.kernel.util.PropsUtil;
20
21 import java.lang.ref.Reference;
22 import java.lang.ref.ReferenceQueue;
23
24 import java.util.Map;
25 import java.util.concurrent.ConcurrentHashMap;
26
27
32 public class FinalizeManager {
33
34 public static final boolean THREAD_ENABLED = GetterUtil.getBoolean(
35 PropsUtil.get(PropsKeys.FINALIZE_MANAGER_THREAD_ENABLED));
36
37 public static <T> Reference<T> register(
38 T realReference, FinalizeAction finalizeAction) {
39
40 Reference<T> reference = new EqualityWeakReference<T>(
41 realReference, _referenceQueue);
42
43 _referenceActionMap.put(reference, finalizeAction);
44
45 if (!THREAD_ENABLED) {
46 _pollingCleanup();
47 }
48
49 return reference;
50 }
51
52 private static void _pollingCleanup() {
53 Reference<? extends Object> reference = null;
54
55 while ((reference = _referenceQueue.poll()) != null) {
56 FinalizeAction finalizeAction = _referenceActionMap.remove(
57 reference);
58
59 finalizeAction.doFinalize();
60 }
61 }
62
63 private static Map<Reference<?>, FinalizeAction> _referenceActionMap =
64 new ConcurrentHashMap<Reference<?>, FinalizeAction>();
65 private static ReferenceQueue<Object> _referenceQueue =
66 new ReferenceQueue<Object>();
67
68 private static class FinalizeThread extends Thread {
69
70 public FinalizeThread(String name) {
71 super(name);
72 }
73
74 public void run() {
75 while (true) {
76 try {
77 Reference<? extends Object> reference =
78 _referenceQueue.remove();
79
80 FinalizeAction finalizeAction =
81 _referenceActionMap.remove(reference);
82
83 finalizeAction.doFinalize();
84 }
85 catch (InterruptedException ie) {
86 }
87 }
88 }
89 }
90
91 static {
92 if (THREAD_ENABLED) {
93 Thread thread = new FinalizeThread("Finalize Thread");
94
95 thread.setDaemon(true);
96
97 thread.start();
98 }
99 }
100
101 }