liuyubupt 2020-10-11 12:32 采纳率: 0%
浏览 72

Java堆内对象所占内存远小于最大堆内存,但是抛出了OutOfMemaryError

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,这才刚刚占用了五分之一呀。

  • 写回答

2条回答 默认 最新

  • Happywzy~ 2020-10-12 09:19
    关注

    java虚拟机不用内存?

    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?