我想了解Java中引用变量的精确管理。 他们的内存是如何管理的?对于 32 位或 64 位操作系统,引用变量本身占用多少内存。
下面的两个代码怎么样?根据上述问题哪个会更好
创建引用变量一并将其分配给新对象(我猜是享元模式??)。
StringBuilder strReference = null;
for(int i = 0;i < 1000000; i ++) {
strReference = // assiging some object from somewhere say from DB list
// doing some operation on object with strReference
}
现在每次都创建引用变量
for(int i = 0;i < 1000000; i ++) {
StringBuilder strReference = // assiging some object from somewhere say from DB list
// doing some operation on object with strReference
}
我可以通过分析器查看以上两条代码语句的确切效果吗?
最佳答案
Java 规范并未强制规定引用的确切大小(您可以查看强制规定的内容 here )。这个大小完全取决于Java虚拟机的实现,因此在某些系统中它可以是32位,在其他系统中可以是64位。
关于示例代码,两者对于 JVM 来说完全相同(尽管如此,请参见脚注 #1)。请记住,在函数内部创建的变量的空间保留在 Stack 中。因此,在进入函数之前,JVM 将为该变量 (strReference) 腾出空间。来源:here .
因此,这不是关于您在哪里/如何创建引用文献的问题,而是关于您在哪里/如何创建引用文献中的数据的问题。
如果您想了解更多信息,请尝试编译代码,然后使用 javap
查看生成的字节码。这样您就可以看到实现是否真的发生了变化。
脚注#1:每个方法中的前 4 个变量/参数/this 在字节码内都有特殊的管理,因此如果您在代码中尽早声明引用,在这种情况下可能会有所不同。这种差异与字节码的大小和速度有关,因为前 4 个变量具有特殊的“操作码”。
关于Java引用变量管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23019260/