Для получения общей информации об объектах в памяти, я бы посоветовал вам заглянуть в jvisualvm (он находится в папке bin вашего JDK). Он содержит много полезной информации о том, что виртуальная машина делает во время работы вашей программы, включая информацию о различных объектах и состоянии памяти.
Если вы хотите что-то более конкретное, вы можете использовать WeakReferences и ReferenceQueues. Эта опция может быть жизнеспособной, если вас интересуют только объекты нескольких типов. Вы можете создать WeakReference для объектов по мере их создания с помощью общего ReferenceQueue, а затем попросить другой поток периодически проверять очередь (обратите внимание, что в очереди только говорится, что объекты достижимы, а не то, что они фактически собраны):
static ReferenceQueue<MyObject> MY_QUEUE = new ReferenceQueue<MyObject>();
static class MyReference extends WeakReference<MyObject>{
public final String name;
public MyReference(MyObject o, ReferenceQueue<MyObject> q){
super(o, q);
name = o.toString();
}
}
static{
Thread t = new Thread(){
public void run(){
while(true){
MyReference r = (MyReference)MY_QUEUE.remove();
System.out.println(r.name+" eligible for collection");
}
}
}
t.setDaemon(true);
t.start();
}
public MyObject(){
//normal init...
new MyReference(this, MY_QUEUE);
}