- 栈是用来保存局部变量、对象的引用和方法调用的现场;
- 堆是用来保存对象的实例,它也是垃圾收集器管理的主要区域,由于现在的垃圾收集器都是采用分代收集算法,所以堆空间还分为新生代和老年代,其中新生代又进一步分为Eden、Survivor,而Survivor分为from Survivor和to Survivor,老年代为Tenured;
- 方法区主要用来存放类的信息、常量、静态变量。堆和方法区都是线程共享的,程序中的字面量如直接书写的100、“Hello”和常量都存放在常量池中,并且常量池是方法区的一部分。
- 栈空间操作起来最快,但是空间很小,通常大量的对象都是存放在堆中,栈和堆的大小都可以通过JVM的启动参数进行设置,栈空间用光了会产生StackOverflowError,堆和常量池空间不足会导致OutOfMemoryError。
String str = new String("hello");
上面的语句中变量str放在栈上,new创建出来的字符串对象放在堆上,而“Hello”这个字面量是放在方法区的。