Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象引用有多大?_Java_Android_Pointers_Reference_Size - Fatal编程技术网

Java 对象引用有多大?

Java 对象引用有多大?,java,android,pointers,reference,size,Java,Android,Pointers,Reference,Size,Android的Java虚拟机中引用的大小是多少 更多信息: 我的意思是,如果我们有 String str = "Watever"; String str = null; 我需要的是str所需要的,而不是“Watever”“Watever”是保存在str指针(或引用)指向的位置的内容 还有,如果我们有 String str = "Watever"; String str = null; 它消耗了多少内存?它与另一个str相同吗 现在,如果我们有:

Android的Java虚拟机中引用的大小是多少

更多信息: 我的意思是,如果我们有

String str = "Watever";
String str = null;
我需要的是
str
所需要的,而不是
“Watever”
<代码>“Watever”是保存在
str
指针(或引用)指向的位置的内容

还有,如果我们有

String str = "Watever";
String str = null;
它消耗了多少内存?它与另一个
str
相同吗

现在,如果我们有:

Object obj[] = new object[2];
obj
消耗了多少,以及
obj[1]
obj[2]
消耗了多少


提出这个问题的原因如下:(以防有人推荐)

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

当在图库中显示这些图片时,我通常会在列表中搜索图片(慢),然后,如果没有图片,我会显示临时下载的图片,直到图片被下载

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

正如我之前所解释的,这个搜索发生在UI线程中(我不能改变这一点)。因此,如果冲突开始减慢线程速度,那么冲突可能会成为一个问题

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

在确定哈希表的大小之前,我想知道它将消耗多少内存,以避免出错

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


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


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

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

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


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

-XX:+UseCompressedOops支持使用压缩指针(对象引用表示为32位偏移量,而不是64位指针)来优化64位性能,Java堆大小小于32gb


我想这是你问题的核心

在确定哈希表的大小之前,我想知道它将消耗多少内存,以避免出错

如果分配初始大小较大的
HashMap
Hashtable
,大部分空间将被哈希数组占用。这是一个引用数组,因此大小将为
3+initialSize
32位字。这不太可能有意义。。。除非你估计的尺码大错特错


但是,我认为您可能对性能有不必要的担忧。如果将对象存储在默认分配的
HashMap
Hashtable
中,则该类将在哈希表变大时自动调整其大小。因此,如果您的对象有一个合适的散列函数(不要太慢,不要将所有内容散列为少量值),那么散列表就不应该是直接的CPU性能问题。

引用几乎是免费的。与图像相比更是如此

在地图上有一些碰撞不是一个真正的问题。解决冲突的速度远远快于通过项目列表进行线性搜索。也就是说,通过排序的项目列表进行二进制搜索将是降低内存使用率的好方法(与地图相比)

我可以保证地图初始尺寸更小的有效性——我最近编写了一个程序,使Trie结构包含170000个英语单词。当我将初始大小设置为26时,当我找到以R开头的单词时,我的内存就会用完。将它减少到5,我可以创建没有内存问题的地图,并且可以在短时间内搜索树(有许多冲突)


[编辑]如果一个引用是32位(4字节),而您的平均图像大约是2兆字节,那么您可以将500000个引用放入单个图像所占用的相同空间中。你不必担心推荐人。

非常感谢。我给Stephen C的答案是因为他回答了确切的问题,但我给你a+1是因为你证实了我的想法,并在哈希表上给了我一个很好的例子(我从未创建过一个)。我想这个问题对我也同样有帮助。而且,我的平均图像大小是60k,所以大约7500个32位的引用可以容纳。太好了,谢谢你。这就解决了我的问题。但只是为了更好地理解这一点。你能在数组里再解释一下吗。如果我有一个数组,比如说Object[2],它将占用每个对象3个单词+2个单词(3+2*2=7个单词)??否。它将占用数组头3个单词+1个单词作为每个元素;i、 五个字。(数组包含对对象的引用,而不是实际对象。)谢谢你或第二部分以及评论,I'v