Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

1、Java 堆存储空间

堆内存(堆存储空间)会在Java运行时分配给对象(Object)或者JRE的类。只要咱们建立了一个对象,那么在堆中确定会分配一块存储空间给这个对象。而咱们熟知的Java垃圾回收就是在堆存储空间上进行的,用以释放那些没有任何引用指向自身的对象。任何在堆中分配的对象都有全局访问权限,并且能够从应用的任何地方被引用。堆内存用于存放由new建立的对象和数组。 2、Java 栈存储空间 Java 栈存储空间用来供线程执行时使用。栈空间中包含特别的变量如:短生命周期和指向其余在堆中对象的引用。这里栈存储空间知足后进先出的顺序。当一个函数被调用时,会在栈中分配一块新的存储空间,用来存放函数的基本数据(【Java心得总结一】Java基本类型和包装类型解析)以及在函数中对其它对象的引用。一旦函数执行结束,存储空间就会被释放供下一个函数使用。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。java

3、举例

Memory.java数组

public class Memory {
 
    public static void main(String[] args) { // Line 1
        int i=1; // Line 2
        Object obj = new Object(); // Line 3
        Memory mem = new Memory(); // Line 4
        mem.foo(obj); // Line 5
    } // Line 9
 
    private void foo(Object param) { // Line 6
        String str = param.toString(); //// Line 7
        System.out.println(str);
    } // Line 8
 
}

下图展现了堆栈存储空间是如何存储基本类型、对象以及指向变量的引用 输入图片说明函数

程序执行过程:线程

  1. 一旦咱们开始运行程序,它会将全部运行时类装载入堆存储空间。当程序运行至第一行main()函数,Java Runtime会为主函数线程分配栈存储空间。
  2. 咱们在第二行建立了基本数据类型,因此它会被存储在主函数线程的栈存储空间;
  3. 由于咱们在第三行建立了Object对象,它会在堆中被建立,而且栈空间中保存有指向它的引用。同理第四行建立Memory对象。
  4. 当咱们在main()主函数第五行调用foo()函数时,在栈空间顶部会分配一块空间给foo()函数使用。由于Java是值传递(Java 为值传递而不是引用传递),在foo函数第六行中会有一个新的引用被建立指向堆中的Object对象
  5. 在第7行建立了一个字符串,它会被放在堆空间的字符串池中(String Poll),并且在栈空间中会保存一个指向它的引用
  6. 在第8行foo函数执行完毕,此时其栈空间会被释放
  7. 在第9行main函数执行完毕,栈中分配给main函数的空间会被释放。同时程序也在这一行执行完毕,所以Java运行时(Java Runtime)会释放全部内存空间而且终止程序的执行。
相关文章
相关标签/搜索