【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,便于垃圾回收机制的识别,加快回收速度。

时间: 2024-08-11 05:26:09

【Java基础】——浅谈堆栈内存的相关文章

JAVA基础细谈

JAVA基础细谈 一. 源文件和编译后的类文件     源文件的本质就是程序文件,是程序员编写,是人看的.而编译后的类文件是给电脑看的文件.一个类就是一个文件,无论这个类写在哪里,编译以后都是一个文件.源文件通过java编译生成类文件,后缀名为”.java“的是源文件,后缀为“.class”的为类文件.如图 这就是一个源文件和一个和它同名的类文件,文件名和类名一样,方便开发中的文件管理. 二. 语句    java程序的组成是类文件,类文件的组成是方法,方法的组成语句.语句是任何程序的基本单位,

java serialize 浅谈

对象的串行化(Serialization) 一.串行化的概念和目的 1.什么是串行化             对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(persistence).对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) .串行化的主要任务是写出对象实例变量的数值.如果交量是另一对象的引用,则引用的对象也要串

浅谈堆栈

栈 由系统自动分配释放 向下分配,先进后出(FILO),压栈弹栈 速度快 小(1.2M) 编译时即确定内存大小 java由jvm管理堆栈,程序员无需插手 java中基础数据类型存储在栈中,immutable(不可变的),对象类型存储在堆中 String类型比较特殊 String str = "abc"; -- 存储在栈中 -- immutable(不可变的) String str - new String("abc"); -- 存储在堆中 C++占用内存分为五个部分

java多线程浅谈

经常看到,一个对象的synchronized方法被一个线程调用后,那么其他线程还能调用该线程的其他方法吗? 网上给出各种答案,其中一种是:不能. 但是,我们有没有自己动手去写一个简单的程序来验证一下?从这个问题浅谈一下我对java多线程的理解. 要理解java的多线程,首先的理解jvm. 参见http://blog.csdn.net/kyfg27_niujin/article/details/7942006

Java基础——再谈面向对象

去年的这个时候,心血来潮写了篇<简述面向对象技术>,先在看来不由的会想:这都是写的什么跟什么啊?(ps:虽然现在写的博客依然不咋地)但是,Java的学习中又一次不得不再一次面向对象,所以,奉上一篇<再谈面向对象>,做为新年的一盘开胃菜. 面向对象是相对于面向过程而言,是一种思想. 区别于面向过程: 面向过程是以函数为基础,完成各种操作,强调的是过程,而面向对象是以对象为基础,强调的是对象. 比如说把大象装进冰箱分为几步,宋丹丹是这样说的:三步呗, 第一步:打开冰箱门, 第二步:把大

java基础-浅复制与深复制的理解

浅复制与深复制在很多编程语言中都有出现,那么什么是浅复制,什么是深复制呢? 要区分浅复制与深复制,首先我们要明确什么是复制,怎样才算是复制.复制的例子在生活中也随处可见,如复印一份文档,复制一段文字等.我们可以发现,复制操作后可以得到两份相同的东西,即复制由一变为二了.下面来看一个例子: public class User{ private int age; public int getAge(){ return age; } } User user1 = new User(); User us

Java基础系列10:内存操作流,管道流,合并流,压缩流以及回退流

前言:这篇文章将对几个"非主流"的IO流进行简单的介绍 一 内存操作流 内存操作流的主要作用是完成内存的输入和输出.比如说在某些情况下需要生成一些临时信息,而将这些临时信息保存在文件中不仅要进行文件的读写而且在功能完成之后还需要删除这个临时文件,因此比较麻烦,这时或许就需要用到内存操作流了. 需要用到的API是:ByteArrayInputStream和ByteArrayOutputStream,分别表示输入流和输出流,示例代码如下: package javase.io; import

浅谈JVM - 内存结构(二)- 虚拟机栈|凡酷

2.1 定义 Java Virtual Machine Stacks(Java虚拟机栈) Java 虚拟机栈描述的是 Java 方法执行的内存模型,用于存储栈帧,是线程私有的,生命周期随着线程启动而产生,线程结束而消亡 线程启动时会创建虚拟机栈,每个方法在执行时会在虚拟机栈中创建一个栈帧(Stack Frame),用于存储局部变量表.操作数栈.动态连接.方法返回地址等信息.每个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中的入栈(压栈)到出栈(弹栈)的过程 每个线程只能有一个活动栈帧,

java笔试浅谈

从第一份笔试到现在已经有差不多一个月了,记得自己第一份笔试就是腾讯的.那时就是抱着量力而为的心情去参加的,果然,整份试题有不少知识自己是没见过的,有一些知识是学过但忘记了的,所以,那次笔试就是去做"炮灰"了.接下来又陆续参加了不少名企校招的笔试,但结果都不尽人意!特别是跟同班两位朋友一起去参加高新兴的java工程师,结果他们都过了笔试,而我却没过!那时,感觉到挺沮丧的,记得当时是在中大参加笔试的,然后自己再教室外面静静等待他们面试!那等待的一个多小时,自己静静反省了好多,得出了原来自己