我再次问这个问题,因为我之前的尝试没有成功,因为https://stackoverflow.com/questions/19115526/how-random-is-allocation-of-memory-when-i-say-new-整数 in-java。
当JVM运行与“new Integer”相对应的字节码时,在为变量分配内存块时,JVM使用哪些随机数生成器来确定分配地址?
我再次问这个问题,因为我之前的尝试没有成功,因为https://stackoverflow.com/questions/19115526/how-random-is-allocation-of-memory-when-i-say-new-整数 in-java。
当JVM运行与“new Integer”相对应的字节码时,在为变量分配内存块时,JVM使用哪些随机数生成器来确定分配地址?
使用了哪些算法?
Java 将 TLAB(线程本地分配缓冲区)用于“正常”大小的对象。这意味着每个线程都会抢占一些伊甸园空间,并将抢占的内存转换为单独的对象。因此,小对象通常在该线程的内存中是连续的,除非需要抓取新的内存块。
大型对象(例如大型数组)直接分配到永久空间中,找到足够分配对象的空闲空间(以单线程方式)
JVM 在分配内存块时使用哪些随机数生成器(如果有)来确定分配地址
它不使用任何随机数生成器进行分配。你也不想这样。它会慢得多并增加不必要的复杂性。
对于变量,例如 int a;
不分配变量,只分配对象。变量可以出现在堆栈或对象中,并且通常以最简单的方式布局。
当它运行与'new int()'对应的字节码时?
你不能做new int()
顺便说一句:有一个常见的误解,即如果你打印 anew Object()
并得到类似的东西Object@b7f86352
,十六进制就是一个地址。不是这种情况。对象的地址可以用作生成并存储在标头中的随机数的种子,但该数字与实际内存地址无关,并且不会随着对象在内存中的移动而改变。
不涉及随机生成。只需 JVM 根据标准选择放置您int
的位置,如果不检查内存分配器的内部状态,即使不是不可能也很难预测其位置。从这个意义上说,它是“随机的”。