private void init() {
		isRunning = true;
		gcCallbackProcessor = new Thread(new Runnable() {

			@Override
			public void run() {
				while (isRunning) {
					try {
						listen();
					} catch (Throwable e) {
						e.printStackTrace();
					}
				}

			}

			private void listen() throws InterruptedException {

				final Reference<?> ref = gcCallback.poll();
				if (ref != null) {
					System.out.println(ref + " is being reclaimed");
					refHolder.remove(ref);
					System.out.println("Ref holder looks like " + refHolder);
					final T newInstance = creator.createNew();
					if (objectQueue.offer(newInstance)) {
						final Reference<T> newRef = new WeakReference<T>(
								newInstance, gcCallback);
						refHolder.put(newRef, IS.PRESENT);
					}
				}
			}

		}, "Object pool GC reclaim");
     	gcSpamThread = new Thread(new Runnable() {

			@Override
			public void run() {
				while(isRunning) {
					System.gc();
				}
				
			}
			
		}, "GC Spam thread");
		gcCallbackProcessor.start();
		gcSpamThread.start();
	}