- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想确切地知道在内存中为一个对象分配的实际空间。
我试着用一些例子来解释:使用 64 位 JVM,指针大小应该是 8 个字节,所以:
Object singletest = new Object();
将占用 8 个字节来引用 Object 加上 Object 的大小Object arraytest = new Object[10];
会占用8个字节来引用数组存储的位置加上8*10个字节来存储数组加上每个Object的大小int singleint = new int;
将只占用 2 个字节,因为 int 是原始类型int[] arrayint = new int[10];
将占用 8 个字节来引用位置和 10*2 个字节用于元素此外,这也是Java允许这样写代码的原因:
int[][] doublearray = new int[2][];
int[0][] = new int[5];
int[1][] = new int[10];
真正发生的是数组会像对象一样产生一个引用(又名指针),所以在声明时第二个维度的大小并不重要(维度可以不同,两者之间没有联系他们)。那么所占用的空间将是:对doublearray的引用(8字节),第一维只是对第二维的引用,所以其他8字节* 2(第一维大小),最后是2字节* 5 加 2 个字节 * 10.
所以,最后,如果有这样一个真正的类:
class Test {
int a, b;
int getA() {return A};
void setA(int a) {this.a = a;}
int getB() {return B};
void setB(int b) {this.b = b;}
}
当我调用一个 new 实例化时,将使用一个 8 字节的指针(或将其命名为引用,因为它是 Java)加上 2+2 字节来将整数存储到类中。
问题是:我是对的还是我写的完全是胡说八道?而且,当我不实例化一个对象而只是声明它时,是否会分配8个字节供进一步使用?如果我分配一个空值怎么办?
与此同时,对于原始类型,我非常确定只要声明它就会分配请求的空间(如果我声明一个“int i”,那么我可以立即调用 i++ 因为没有使用引用,只有一部分内存被设置为“0”)。
我在互联网上搜索没有聪明的回应......我知道我写了很多问题,但任何帮助将不胜感激! (也许我不是唯一感兴趣的人)
最佳答案
using a 64 bit JVM, pointer size should be 8 bytes,
实际上它通常是 32 位的,除非您的最大堆大小为 32 GB 或更多堆。这是因为 Java 使用引用,而不是指针(每个对象都在 8 个字节,而不是 1 个边界上)
JVM 可以根据您使用的 JVM 和最大堆大小来更改引用的大小。
Object singletest = new Object(); will take 8 bytes to reference the Object plus the size of the Object
该对象将使用大约 16 字节的堆。它可能会或可能不会使用 4 个字节的堆栈,但它可以只使用一个寄存器。
Object arraytest = new Object[10];
这将使用大约 16 个字节作为 header ,加上 10 倍的引用大小(总共大约 56 个字节)
int singleint = new int; will take just 2 bytes, because int is a primitive type
int
始终是 32 位位,您不能创建 new
原语。由于它在堆栈上的概念,它可能使用 4 个字节的堆栈或者它可能只使用一个寄存器。
int[] arrayint = new int[10]; will take 8 bytes to reference the position and 10*2 bytes for the elements
同样,该对象的大小可能与 new Object[10]
相同(56 字节)
int[][] doublearray = new int[2][];
int[0][] = new int[5];
int[1][] = new int[10];
我不会称它为双数组,因为它可能会与 double[]
但是对于 doublearray
和 16 + 5*4 + 4(用于填充)和 16 + 10 * 4,大小可能约为 16 + 2 * 4。
堆上分配的内存与 8 字节边界对齐。
I call a new to instantiate, a pointer (or name it reference, because it's Java) of 8 bytes will be used plus 2+2bytes to store the integers into the class.
引用在堆栈上,通常不包括在内。
该对象有一个大约 16 个字节的 header ,int 值占用 2 * 4 个字节。
when I don't instantiate an object but I just declare it
Java 不允许您声明对象,只能声明基元和引用。
what if I assign a null value?
这可能会改变引用的值,但除此之外什么也不会发生。
if I declare an "int i" then I can immediately call i++ because no reference are used, just a portion of memory is setted on "0"
不会使用堆,也可能不会使用栈(可能是 4 个字节)。如果 JIT 编译器什么都不做,它可能会删除代码。
maybe I'm not the only one interested
...但并不害怕问。 ;)
关于对象、数组和原始类型的 Java 和精确引用大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10386696/
感觉我在这里遗漏了一些明显的东西,所以提前道歉。无论如何,这是我尝试转换的一些数据a: acct_num year_prem prem exc 001 20
我正在尝试将表中的模式与用户话语 匹配。 string userUtterance = "I want identification number for number of customers";
当尝试在 Precise 上链接 gccgo 时,出现此链接错误: matt@matt-1005P:~/src/gopath/src/meme$ gccgo cmd/meme/main.go -o m
假设我有以下数据和命令: clc;clear; t = [0:0.1:1]; t_new = [0:0.01:1]; y = [1,2,1,3,2,2,4,5,6,1,0]; p = interp1(
假设我有以下数据和命令: clc;clear; t = [0:0.1:1]; t_new = [0:0.01:1]; y = [1,2,1,3,2,2,4,5,6,1,0]; p = interp1(
我总是想给精确匹配比只匹配前缀的分数更高的分数(例如,“ball”在与“ball*”匹配时应该比“ballistic”得到更高的分数)。 我当前(详细)的方法是在创建 PrefixQuery 时始终执
有什么解决方法可以让我在 Android 中使用 long 或 double 来寻找音频文件中的位置吗?目前 seekTo 只接受 ints 参数。我想更精确(比如在十分之一秒内) int resID
我的 replacingOccurrences 函数有问题。我有一个这样的字符串: let x = "john, johnny, johnney" 我需要做的只是删除“john” 所以我有这段代码:
我正在使用 BeautifulSoup 进行网页抓取。我有这段代码来提取 a 标签的值,但它似乎不起作用。显示错误: AttributeError: 'int' object has no attri
我要在带有标记顶点和标记有向边的图上寻找一种不精确的图匹配算法。我的任务是检测两个图表的变化以将它们显示给开发人员(想想颠覆差异)。我已经实现了基于禁忌搜索 ( this ) 的优化算法,但我无法让该
我有两个网站: example.com 和 yyy.com 他们都有类似的网络应用程序,但在不同的服务器上。我想让 Apache 将所有路径请求重定向到 example.com 与 完全相同的方式yy
因此,我尝试合并两个公司信息数据库(从现在起表 A 和表 B),其中最常见(且可靠)的单一引用点是网站 URL。表 A 已更新,表 B 待更新。 我已经从表 A 中提取了 URL,并使用 PHP 清理
我正在 http://classicorthodoxbible.com/new.html 上制作效果主要描述中的 Angular 色,包裹在自己的跨度中,从他们通常的休息地点移动到随机位置,然后通过指
我目前正在使用我的 Raspberry Pi 及其内置 UART 输入编写 MIDI 合成器。 在某个时间点,为了启用 MIDI 输入的实时回放,我必须设置一种环形缓冲区以与 OpenAL 一起使用,
在 C 中,当设置了一个 float 时, int main(int argc, char *argv[]) { float temp = 98.6f; printf("%f\n",
实现 MP3 无间隙循环的最佳可能性是什么?目前我正在使用 AVAudioPlayer 并将 .numberOfLoops() 属性设置为 -1 但可以听到,轨道重新启动。情况并非如此,例如使用 Tr
我想创建不一定是“正确”矩阵的“类矩阵”对象。但是,确切地说,“类矩阵”是什么意思? 示例 1 > image(1:9) Error in image.default(1:9) : argument
给定一个像这样的 XML 文档: john &title; 我想解析上面的 XML 文档并生成其所有实体已解析的副本。因此,给定上述 XMl 文档,解析器应输出: john
需要说明的是,这种方法不是我要找的: 事实上,此方法会调整 ImageField 的大小。我想将 Image 对象的大小调整为特定且精确的无比例分辨率。有什么办法吗? --编辑-- 对我来说,Ima
我正在尝试使用 TF2.0 eager 模式执行精确的 GP 回归,基于来自 https://colab.research.google.com/github/tensorflow/probabili
我是一名优秀的程序员,十分优秀!