public void run() {
		debug("GC: started");
		synchronized (this) {
			for (; ;) {
				while (rrdMap.size() > capacity && rrdGcList.size() > 0) {
					try {
						RrdEntry oldestRrdEntry = (RrdEntry) rrdGcList.get(0);
						debug("GC: closing " + oldestRrdEntry.dump());
						removeRrdEntry(oldestRrdEntry);
					} catch (IOException e) {
						e.printStackTrace();
					}
				}

				try {
					debug("GC: waiting: " +
							rrdMap.size() + " open, " +
							rrdGcList.size() + " released, " +
							"capacity = " + capacity + ", " +
							"hits = " + poolHitsCount + ", " +
							"requests = " + poolRequestsCount);
					wait();
					debug("GC: running");
				} catch (InterruptedException e) {
				}
			}
		}
	}