java - 对象引用有多大?

标签 java android pointers reference size

Android 的 Java VM 中的引用消耗的大小是多少?

更多信息:

我的意思是,如果我们有

String str = "Watever";

我需要的是 str,而不是 "Watever"。 -- "Watever" 是保存在 str 所持有的指针(或引用)所指向的位置的内容。

另外,如果我们有

String str = null;

它消耗多少内存?和其他str一样吗?

现在,如果我们有:

Object obj[] = new object[2];

obj消耗多少,obj[1]obj[2]消耗多少?


问题的原因如下:(以防有人可以推荐一些东西)。

我正在开发一个管理从互联网下载的许多图片的应用程序。 我开始将这些图片存储在“银行”(由图片列表组成)中。

当在画廊中显示这些图片时,我曾经在列表中搜索图片 (SLOW),然后,如果图片不存在,我会显示临时下载图片,直到图片被下载。

由于发生在 UI Thread 上,应用程序变得非常慢,所以我想在银行上实现一个哈希表,而不是我的列表。

正如我之前解释的,此搜索发生在 UI 线程中(我无法更改)。因此,如果冲突开始减慢线程速度,就会成为问题。

我读过“为了平衡时间和空间效率,哈希表应该是半满的”,但这会导致一半时间发生冲突(对于 UI 线程不实用)。这让我想到了拥有一个非常长的哈希表(与保存的图片数量相比)并使用更多的 RAM(拥有更少的空闲 VMHeap)。

在确定哈希表的大小之前,我想知道它会消耗多少内存,以免被夸大。

我知道哈希表的大小与图片可能消耗的内存相比可能非常小,但我想确保我没有消耗过多的内存。


在问这个问题之前,我搜索了其他地方,在

How big is an object reference in Java and precisely what information does it contain?

reference type size in java

Hashing Tutorial

(是的,我知道其中两个地方相互矛盾,这就是问题的部分原因)。

最佳答案

对象或数组引用在 32 位 JVM 或 Davlik VM 上占用一个 32 位字(4 个字节)。 null 占用与引用相同的空间。 (必须如此,因为 null 必须适合引用类型的插槽;即实例字段、局部变量等)

另一方面,一个对象最少占用 2 个 32 位字(8 个字节),而一个数组最少占用 3 个 32 位字(12 个字节)。实际大小取决于对象的字段数量和种类,以及数组的元素数量和种类。


对于 64 位 JVM,引用大小为 64 位,除非您已将 JVM 配置为使用压缩指针:

-XX:+UseCompressedOops Enables the use of compressed pointers (object references represented as 32 bit offsets instead of 64-bit pointers) for optimized 64-bit performance with Java heap sizes less than 32gb.


我想这是你问题的关键。

Before determining the size of the hash table, I wanted to know how much memory would it consume in order not to exagerate.

如果分配一个初始大小较大的HashMapHashtable,大部分空间将被散列数组占用。这是一个引用数组,因此大小将是 3 + initialSize 32 位字。这不太可能很重要……除非您对尺寸的估计严重错误。

但是,我认为您可能不必要地担心性能。如果您将对象存储在默认分配的 HashMapHashtable 中,则该类将在哈希表变大时自动调整其大小。因此,只要您的对象具有良好的哈希函数(不太慢,不会将所有内容哈希为少量值),哈希表不应成为直接的 CPU 性能问题。

关于java - 对象引用有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5839434/

相关文章:

java - 在java中获取操作系统语言

java - Excel 自动化与 Cucumber 框架集成

Android:不使用谷歌服务器的语音识别

c - 如何在 C 的过程中创建动态数组?

java - 什么会导致同步块(synchronized block)内部的 IllegalMonitorStateException?

java - Cassandra 节点工具: Failed to connect to '127.0.0.1:7199'

android - react native (Android): ArrayIndexOutOfBoundsException thrown when requesting for permissions

java - 无法在我的 Activity 中显示微调器

c++ - C++ 中的取消引用运算符

pointers - Golang 使用反射在结构中设置 nil 字符串指针值