Для получения общей информации об объектах в памяти, я бы предложил вам изучить jvisualvm (он находится в папке bin вашего JDK). Он имеет много полезной информации о том, что делает VM в вашей программе, включая информацию о различных объектах и состоянии памяти.
Если вы хотите что-то более конкретное, вы можете использовать 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);
}
Также будьте осторожны, что финализаторы довольно дороги. –
Хм, понятия не имею. Почему это дорого? – Feyyaz
Вы никогда не можете быть уверены, что метод finalize будет вызван, поэтому этот подход не гарантирует, что вы увидите все сборки мусора. – dafmetal