Generally, I load resources at the earliest opportunity, subject to memory space.
For example, in a program where all resources can fit in memory at once, I load them at the beginning.
In a program where there isn't enough memory for all resources, and assuming a level-based game, I'd load everything for a level when I enter the level, and delete it when I leave the level (either ready for the next level or dying).
Object instances are something completely different - they don't count as resources (IMO), and should be created / deleted on demand, as they were designed for that purpose.
Others may do something different, but I think those are the most obvious options.