Java基础——浅谈堆栈内存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础——浅谈堆栈内存相关的知识,希望对你有一定的参考价值。

    关于内存这一部分的处理,在程序中是极为重要的,这不仅关乎程序运行的速度而且还会对程序能否正常运行,以及对支持程序运行的硬件设备也是同样有需求的。小编也是把自己最近接触到的写出来,如有错误之处,恳请大家斧正。

    在程序的运行过程中,会把内存分割成很多部分,这篇文章主要讲解堆栈的问题。

    何为栈?

    运行时对象区,就是所有在方法中定义的变量,变量的存放区,则为栈内存。随着方法的结束,栈内存也会自然摧毁。

    何为堆?

    运行时数据区,就是所有在方法中创建对象时,这个对象存放的地方,则为堆内存。在堆内存的对象可以被反复利用,不会伴随方法的结束而销毁。

 

图中讲解的主要是定义变量和给变量赋值时关于内存分析的处理。技术分享

技术分享

    值传递和址传递

随带说一下值传递(值类型)和址传递(引用类型)结合内存分析一下。

值传递

  1. public class Value  
    {  
          
        public static void main(String[] args)  
        {  
            int a = 6;  
            int b = 9;  
            swap(a,b);  
            System.out.println("交换之后 a的值是:" + a + ";b的值是:" + b);  
        }  
        public static void swap(int a,int b)  
        {  
            int temp = a;  
            a = b;  
            b = temp;  
            System.out.println("swap方法里 a的值是:" + a + ";b的值是:" + b);  
        }  
    }  

运行结果

 

     技术分享

内存分析

    技术分享技术分享

址传递 

  1.  1 public class address{  
     2    
     3     public static void swap(DataWrap dw){  
     4         int temp = dw.a;  
     5         dw.a = dw.b;  
     6         dw.b = temp;  
     7         System.out.println("swap方法里 a的值是:" + dw.a + ";b的值是:" + dw.b);  
     8     }  
     9     public static void main(String[] args){  
    10         DataWrap dw = new DataWrap();  
    11         dw.a = 6;  
    12         dw.b = 9;  
    13         swap(dw);  
    14         System.out.println("交换之后 a的值是:" + dw.a + ";b的值是:" + dw.b);  
    15     }  
    16 }  
    17    class DataWrap{  
    18         int a;  
    19         int b;  
    20     }  

运行结果

    技术分享

内存分析

技术分享技术分享

    上边两个方法不同之处在于一个传的是值类型的,而另一个传递是引用类型,后者伴随方法的结束,其保存数据的栈也被销毁,指向堆区域的指针消失了。而前者的数据保存在当前方法的栈用,依旧存在。

【总结】

    主要是何时会产生栈和堆内存,深入的内存还得慢慢学习啊。关于内存的回收,Java中垃圾回收机制,当对象不再被引用,建议把对象设为null,便于垃圾回收机制的识别,加快回收速度。

以上是关于Java基础——浅谈堆栈内存的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Java中的栈和堆

浅谈栈帧

浅谈堆栈队列

「JAVA」Java基础之堆栈方法区类加载器——JVM内存模型分析

C++ 堆栈内存没有被释放

java集合框架:浅谈如何使用LInkedList实现队列(Queue)和堆栈(Stack)