The heap stores all of the objects created by your Java program. The heap's contents is monitored by the garbage collector, which frees memory from the heap when you stop using an object (i.e. when there are no more references to the object.
This is in contrast with the stack, which stores primitive types like ints and chars, and are typically local variables and function return values. These are not garbage collected.
The perm space refers to a special part of the heap. See this SO answer for an explanation:
What is perm space?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…