当前位置: 首页 > 知识库问答 >
问题:

java中变量的内存分配

长孙星汉
2023-03-14

我有一个关于java如何处理未使用变量的问题。

假设我有以下代码:

int notUsedVariable = aMethodThatExecutesSomethingImportantAndReturnsInt(someParameter);

那么我就不会在代码中使用notUsedVariable。该变量是否会被存储,或者java是否足够聪明,可以在编译时忽略该变量?

谢谢

共有3个答案

翟志新
2023-03-14

javac不执行很多优化。另一方面,准时制确实如此

退房http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/

这是一个qoute。

更重要的是,javac编译器不执行简单的优化,比如循环展开、代数简化、强度缩减等。为了获得这些好处和其他简单的优化,程序员必须在Java源代码上执行它们,而不是依赖javac编译器来执行它们。

还有另一个线程将详细介绍这一点。Java编译器的优化

公西俊德
2023-03-14

视情况而定。

如果notUsedVariable是一个局部变量,那么JIT编译器可能会忽略该赋值(但我们讨论的是一个寄存器读/写,即现代桌面处理器上的亚纳秒级)。如MattBall所示,字节码将保留分配。

如果notUsedVariable是该类的成员,则需要存储结果,因为稍后可能会访问该字段,并且编译器可能无法证明其他情况(例如,可能会加载一个尚不存在的新类)。

缪朝
2023-03-14

我的观察是,javac可能会省略未使用的变量的存储操作,如果:

  1. 变量被标记为最终变量,并在声明中初始化;
  2. 不使用本地变量调试信息进行编译(-g: vars

如果使用-g:vars进行编译,javac会将变量加载并存储在tact中,以便于调试。它似乎不考虑非最终变量作为合格的去除。

自己测试一下。下面是我对JDK 7的测试结果。结果与JDK 8 EAP一致。

输入:

class MyTest {
    public static void main(String... args) {
        int a = 1;
    }
}

输出:

public static void main(java.lang.String... p0);
  Flags: PUBLIC, STATIC, VARARGS
  Code:
    stack=1, locals=2, arguments=1
         0: iconst_1
         1: istore_1
         2: return

输入:

class MyTest {
    public static void main(String... args) {
        final int a = 1;
    }
}

输出:

public static void main(java.lang.String... p0);
  Flags: PUBLIC, STATIC, VARARGS
  Code:
    stack=1, locals=2, arguments=1
         0: return

正如其他人所说,在这两种情况下,我都希望JIT优化器忽略任何不必要的存储操作。

 类似资料:
  • 本文向大家介绍浅谈java+内存分配及变量存储位置的区别,包括了浅谈java+内存分配及变量存储位置的区别的使用技巧和注意事项,需要的朋友参考一下 Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我

  • 问题内容: 我知道Java有其自己的垃圾收集器,但有时我想手动删除垃圾。有什么办法可以做这样的工作吗?考虑到我声明了许多变量的很长或很长,这是在使用函数而不是在函数末尾自动收集后立即删除未使用的内存的好主意吗?如果手动删除垃圾,是否会影响应用程序的速度?感谢您的帮助! 问题答案: 在Java中没有直接和立即的释放内存的方法。您可以尝试使用众所周知的方法 说服 垃圾收集器带走一些对象: 但是不能保证

  • 问题内容: 类B继承了类A。现在,当我们创建类型B的对象时,为B分配的内存是多少?是否包括A和B或任何其他内存分配过程? 问题答案: 当创建对象B时,假设调用了默认构造函数 然后,JVM分配具有更多或更少内容的对象: 在B中显式声明的每个字段都有足够的内存(每个字段通常大约4-8字节,但是类型和主机系统之间有很大差异) 对于A及其祖先继承的每个最终字段,都有足够的内存 足够的内存来包含对调度向量的

  • 我有一个一直在思考的问题。以这个特殊的类为例 假设我有一个B类,它拥有一个使用listOne读取详细信息的方法。要查看数组列表,我需要首先获取列表的大小,以便我的代码知道数组列表何时结束。有两种方法可以做到这一点,一种是 或者我也可以用 在内存和效率方面,哪种方法更好?此外,假设我正在递归地读取一个非常大的数组。为了简单起见,让我们假设递归读取此数组将导致堆栈溢出异常。在这种情况下,第一个方法在理

  • 本文向大家介绍对象,方法和变量在Java的内存中存储在哪里?,包括了对象,方法和变量在Java的内存中存储在哪里?的使用技巧和注意事项,需要的朋友参考一下 有五个主要内存区域,用于各种Java元素。以下是相同的列表。 类区域-该区域包含类的静态成员。 方法区域-此区域包含方法定义和可执行代码。 堆区域-该区域包含动态分配/取消分配的对象。如果某个对象不再被任何实时引用引用,则将其释放。 堆栈区域-

  • 问题内容: 我想说明 先发生的 关系如何与 volatile 变量一起使用。让我们有以下变量: 和线程A: 和线程B: 根据Java内存模型(JMM),以下语句正确吗? 如果没有,正确的解释是什么? 总是在 发生之前 __仅在JMM中实际发生时才 发生- 在JMM中 __ 如果实际上发生在时间之前,则发生在JMM中-before -before (并且将可预测地分配) 否则,和之间的顺序不确定,并