1. 问题描述:
我设置了JVM的最大堆内存为2M,然后写了一个简单的测试程序,不断的创建对象并加入List中,观察GC情况(我重写了对象的finalize()方法,所以回收的时候可以做一些监控),可是我发现对象的总容量远小于2M的时候,却抛了OutOfMemaryError。
2. 测试代码
虚拟机设置堆的最大容量
Animal类重写finalize()方法
Test创建Animal对象进行测试
问题?
我这里创建了20000个Animal实例并放到了list里面,一个Animal的大小应该等于 mark word + class pointer(类型指针) + instance data(示例数据,因为Animal里面有个String) + padding(对齐) = 8 + 4 + 4 + 0 = 16B。
一个Animal实例16B,那么堆最大为2M,如果不触发GC,那么最多分配2*1024*1024B/16B = 131072个实例,我这里分配了20000个就抛了OutOfMemaryError,这才刚刚占用了五分之一呀。