Java中的内存主要分为栈、堆、常量池、静态域这几部分。
1栈主要存放基本类型数据(int、double、……)和对象的引用(类似C语言的指针)。
2堆主要存放对象实体。而Java的对象是数据处理的核心,因而堆又具体划分为如下几个部分:
2.1 新生带(new generation),使用的垃圾收集器是MinorGC,而新生带又划分为Eden Space(伊甸区)、2个SurvivorSpace幸存者区(FromSpace和ToSpace),幸存者区主要是用于MinorGC做对象复制时使用的。
2.2 老年带(old generation),使用的垃圾收集器是FullGC。当FullGC满了的时候可能会出现outofmemory的异常。
关于对象在堆中的移动:
新创建的对象都放在新生带中,当新生带中的对象年龄达到一定程度后(由年龄计数器控制,默认15岁以后的算老年)会放到老年带中。对象晋升到老年带的阈值,可以通过参数-XX:MaxTenuringThreshold 来设置。
年龄计数器的计算机制:如果对象在 Eden 出生并经过第一次 Minor GC 后仍然活着并且幸存者区也放得下,则把对象移动到幸存者区,并且年龄置为1。之后的对象每熬过一次MinorGC就长大一岁。年龄达到阈值就移动到老年区。
GC调优的一些说明:
当FullGC过于频繁说明老年带很快就被占满了。