1、结构图 2、堆 2.1、Java堆的特征
- 几乎所有的对象都存放在堆上。并且java堆是完全自动化管理的,通过垃圾回收机制,垃圾对象会被自动清理。可能出现 OutOfMemoryError 异常。java堆最为常见结构是将整个java堆分为新生代和老年代。
- 新生代存放新生对象或者年龄不大的对象老年代则存放老年对象。新生代有可能分为eden区(8)、from区(1)、to区(1),from和to区是大小相同、可以互换角色的内存空间。
- TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。
- 在绝大多数情况下,对象首先分配在eden区,在一次新生代回收之后,如果对象还存活,则进入from或者to,每经过一次新生代回收,对象如果存活,它的年龄就会加1。当对象的年龄达到一定条件(默认年龄15)后,就会被认为是老年对象,从而进入老年代。默认比例:年轻代:老年代=1:2
SimpleHeap实例本身分配在堆中,描述SimpleHeap类的信息存放在方法区,main函数中的s1 s2局部变量存放在java栈上,并指向堆中两个实例。
2.5、堆溢出代码案例public class TestHeap {
// 分配128Kb的内存给数组,方便堆内存溢出
byte[] bis = new byte[128 * 1024];
public static void main(String[] args) {
List list = new ArrayList<>();
//增加堆内存
while (true) {
list.add(new TestHeap());
}
}
}
结果:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.fei.zhou.day1.TestHeap.(TestHeap.java:8)
at com.fei.zhou.day1.TestHeap.main(TestHeap.java:14)
2.6、总结:
- 堆中存的是对象。
- 对象的大小是不可估计的,或者说是可以动态变化的
- 一个对象引用大小是4btye。



