Java引用变量管理?

标签 java reference java-ee-6

我想了解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/

相关文章:

java - Apache http 客户端 -> 本地地址绑定(bind) -> 一段时间后发生 BindException

java - 我该如何用扫描仪(java)处理它?

C++ 编译错误 - undefined reference

c - 结构指针分配未分配预期值 - 链表

java-ee-6 - CDI - 观察容器事件

java - 在 List 中使用通配符时出现编译时错误

java - Android:ListView 不显示项目

javascript - 对象引用问题

java - JSF 中的值转换究竟发生在什么时候?

jakarta-ee - JEE6 : What can be injected with @Resource?