值类型相关函数与对象类型相关函数内存调用过程

值类型相关函数内存调用:

先来看这样一段代码,你认为它的运行结果是多少呢?

20和11还是20和10?

package org.example;

public class Main {
    public static void main(String[] args) {
        int a=10;
        add(a);
        System.out.println(a);
    }
    public static void add(int a){
        int b=10;
        System.out.println(a+b);
        a=11;
    }
}

答案是20和10,如果你猜对了请先不要窃喜,不妨继续往下看,检测一下自己是真的会还是仅仅猜对了

在Java中局部变量最终会被放在栈中,如下所示:

值类型相关函数与对象类型相关函数内存调用过程_第1张图片

当add方法执行完毕,会将add方法所占用的栈的空间删除掉,如下所示:

值类型相关函数与对象类型相关函数内存调用过程_第2张图片

因此最终输出的a的值其实是main函数中的a的值

对象类型相关函数内存调用:

Java的基础数据类型都是值类型,指针也是值类型,因而是直接存到内存,不是存地址去寻址

值类型相关函数与对象类型相关函数内存调用过程_第3张图片

当add函数执行完毕,左侧栈所占用的内存就会被释放掉,但是右边堆所占用的内存并不会被随着函数调用结束而清空,因为我们无法确定是否还有其他的线程也引用堆中的对象,而需要使用GC垃圾回收机制完成

值类型相关函数与对象类型相关函数内存调用过程_第4张图片

你可能感兴趣的:(JVM,java,jvm,开发语言,缓存)