【问题标题】:Java Object Array null Element MemoryJava 对象数组空元素内存
【发布时间】:2015-03-04 02:47:07
【问题描述】:

目前我正在使用以下数据结构:

MyObject[] arr = new MyObject[100]

现在 Array 中的大多数字段实际上都是空的(比如说 97%)

据我所知,JVM 为每个字段保留了MyObject 的一个实例所需的内存,因此保留了大量内存,即使它从未真正使用过。

有没有办法节省内存?像只按需分配空间给MyObject? 有比简单数组更好的数据结构吗? (需要既高效又快速)

【问题讨论】:

  • jvm 为 MyObject 引用(很可能是指针)保留内存。那些不会占用太多空间。
  • 你可以使用arraylist。您可以根据需要添加任意数量的元素(其容量是动态的)。
  • 我真的在想你为什么要做这么多优化。

标签: java arrays memory jvm


【解决方案1】:

据我所知,JVM 为每个字段保留了 MyObject 的一个实例所需的内存,因此即使从未真正使用过,也会保留大量内存。

不,它没有。它为 100 个对象引用保留了足够的内存,而不是 100 个 MyObject 实例。对象引用不大(32 位或 64 位,详见this answer)。 ASCII-art 下面。

现在,如果您甚至对保留 100 个大小为 intlong 的插槽感到困扰,您可以使用 ArrayList,它将根据需要重新分配一个后备数组(但这会增加内存碎片),一个LinkedList,它根本不使用数组(但它确实拥有的条目具有更高的内存开销),甚至是一个结构,例如Map 't(必要)根本不使用数组(但每个条目的开销也更高)。

100 位数组的 ASCII 艺术和详细信息:

因此,当您第一次创建该数组时,这就是您在内存中的内容:

+-----------+ | arr | +-----------+ +------------+ |参考 |------>|我的对象[] | +-----------+ +------------+ |空 | |空 | |空 | | (96 更多) | |空 | +------------+

然后你分配一个实例,比如说:

arr[1] = new MyObject();

这给了你

+-----------+ | arr | +-----------+ +------------+ |参考 |------>|我的对象[] | +-----------+ +------------+ |空 | +-------------------+ |参考 |---->| MyObject 实例 | |空 | +-------------------+ | (96 更多) | |一些领域 | |空 | |一些其他领域 | +------------+ | ... | +-------------------+

...那么也许你可以添加另一个:

+-----------+ | arr | +-----------+ +------------+ |参考 |------>|我的对象[] | +-----------+ +------------+ |空 | +-------------------+ |参考 |---->| MyObject 实例 | |参考 |--+ +--------------------------------+ | (96 更多) | | |一些领域 | |空 | | |一些其他领域 | +------------+ | | ... | | +-------------------+ | | +-------------------+ +->| MyObject 实例 | +-------------------+ |一些领域 | |一些其他领域 | | ... | +-------------------+

...当您在数组中存储更多实例时,依此类推。

【讨论】:

  • @t-j-crowder,你说“**即使是一个根本不使用数组的结构,例如 Map **”。据我所知,Java 中的任何 Map 实现都使用支持数组。例如:HashMap 和 HashTable 都使用后端数组来存储地图整体。这是真的吗?。
  • @RavinderReddy:特定的实现可能使用一个或多个数组。或不。这是一个实现细节。
  • @Ravinder Reddy: TreeMap,例如,不使用数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2020-07-28
  • 2020-06-27
相关资源
最近更新 更多