Вы должны учитывать порядок событий в вашем примере.
Вы создаете экземпляр экземпляра Test и присваиваете его эталонному объекту. В вашем примере, t1 является переменной экземпляра Test, поэтому пространство выделяется в куче для экземпляра Test2 одновременно с созданием объекта obj. Чистый эффект заключается в том, что при назначении obj выделяется все пространство кучи.
Когда вы вызываете println, вы используете существующую ссылку на obj, поэтому не происходит выделения ни для obj, ни для ссылки t1 через нее.