java - 使用方法的返回值和保留它们有什么区别?

标签 java memory return-value

下面,您会看到两个非常简单的 Java 程序。在第一个程序中,我没有使用 returnTrue() 方法的返回值,在第二个程序中,我将其分配给静态字段。

第一个程序:

package test;
public class Test {
    public static void main(String[] args) {
        returnTrue();
        System.out.println("Finished!");
    }

    public static boolean returnTrue() {
        return true;
    }
}

第二个程序:

package test;
public class Test {
    public static boolean Result;

    public static void main(String[] args) {
        Result = returnTrue();
        System.out.println("Finished!");
    }

    public static boolean returnTrue() {
        return true;
    }
}

两者都工作正常,并在输出中打印了“完成!”

现在,我想知道如果我将带有 returnTrue() 的行放入无限循环中,内存中会发生什么?据我所知,在第二程序中,它无限地将true分配给内存中的特定地址(即Result的地址)。 (对吗?)

但我对第一个计划一无所知。在这种情况下会发生什么? JRE是否选择一个随机地址并将所有返回值分配给同一个地址?或者它将每个返回值分配给特定的地址?或者甚至留下它并且不将其分配给任何地址?

最佳答案

当方法返回时,返回值通常保留在内存中的线程堆栈上,无论调用代码停止在何处。一个stack是常用于此目的的重要数据结构。

假设我们有一些如下代码:

void m1() {
    int i;
    int j;
    boolean b = m2();
}

boolean m2() {
    float f;
    float g;
    return true;
}

m1开始执行时,堆栈开始扩展以为局部变量保留空间:

int
int
boolean

m2 被调用,堆栈再次扩展:

int
int
boolean
    float
    float

m2 返回,堆栈按相反顺序展开:

int
int
boolean

请注意,堆栈上的最后一个空间是 m2 返回值的局部变量,其中存储 true

当您将返回值分配给某些内容时,原始值或对象引用将从堆栈复制到您分配给它的位置(在本例中为静态字段)。

如果您不将其分配给任何内容,则返回值将被忽略。

[…] what happens in memory if I put the line with returnTrue() in an infinite loop?

它重复执行上述步骤。

Does the JRE select a random address and assign all the return values to the same address? Or it assigns each return value to a specific address?

参见上文,它被放入堆栈中。

关于java - 使用方法的返回值和保留它们有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29467589/

相关文章:

java - java字节码astore_1和astore_2有什么区别

c - C语言中如何返回一个数组?

c - 如何正确检查传递给 malloc() calloc() realloc() 的大小及其返回值?

java - 无法使 XPath 与复杂的命名空间一起使用

java - 从 xhtml 文件创建 jsf View /组件树

java - 不同依赖包中有两个同名类时,如何指定期望的java类?

java 8 中的 Java 内存区域

android - "mnt/sdcard"总是 Android 中的外部存储吗?

c - 为什么在 Linux 上字符串文字的内存地址与其他的如此不同?

c - 返回值取决于函数中有多少个 printf