Java中堆与栈的介绍及区别

堆和栈都是Java中常用的存储结构,都是内存中存放数据的地方。

堆:(对象)

引用类型的变量,其内存分配在堆上或者常量池(字符串常量、基本数据类型常量),需要通过new等方式来创建。

堆内存主要作用是存放运行时创建(new)的对象。

(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)


栈:(基本数据类型变量、对象的引用变量)

基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放。

栈内存的主要作用是存放基本数据类型和引用变量。栈的内存管理是通过栈的"后进先出"模式来实现的。

(主要用来执行程序,存取速度快,大小和生存期必须确定,缺乏灵活性)

    class 鸭子{       
        private int age;  
        private int weight;  
        public 鸭子(int age,int weight){  
             this.age=age;  
             this.weight=weight;  
        }  
    }  
    public class Test{  
        public static void main(String[] args){  
            //int i=0;      //基本数据类型变量  
            鸭子 duck =new 鸭子(1,1000);   //duck是对象的引用变量,存在栈;鸭子(1,1000)是实际的对象,存在堆。  
        }  
    }  

图例如下:

PS:

JVM:

是基于堆栈的虚拟机,每个Java程序在一个独立的JVM实例上运行,每个JVM实例对应一个堆,

同个java程序内的多线程运行在同个JVM实例上,多个线程之间共享堆内存(多线访问堆时,要实现数据的同步)。


为什么又栈内存和堆内存之分?

当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法定义的变量将会放到这块栈内存里,随着方法的结束,这个方法的内存栈也将自动销毁。(不需要GC回收)

因此,所有在方法中定义的局部变量放在栈内存中;

当我们在程序中创建一个对象时,这个对象会被保存到运行时数据区中,以便反复利用(复用,因为创建对象的成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随着方法的结束而销毁,即使方法结束后,这个对象还可能被另外一个引用变量所引用(在方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量去引用它时,系统的垃圾回收器(GC)才会在合适的时候回收它。

为什么上面说创建对象的开销(成本)比较大?

来看看如何创建对象、创建对象的过程:

创建对象的根本途径是构造器,通过new关键字来调用某个类的构造器即可创建这个类的实例。但对象不是完全由构造器来负责创建的,实际上,当程序员调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,这个对象已经产生了---这些是在构造器执行之前就完成的,也就是说,当系统开始执行构造器的执行体之前,系统已经创建了一个对象,只是这对象还不能被外部程序访问,只能在构造器中通过this来引用。当构造器的执行体执行结束后,这个对象作为构造器的返回值被返回,通常还会赋给另外一个引用类型的变量,从而让外部程序可以访问。(当然可以通过设置构造器的访问权限private,阻止其他类创建该类的实例)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,参数传递涉及到了这两种内存区域的使用。在Java中,主要用于存储方法的调用信息,包括方法参数、返回地址等,而主要用于存储对象实例和数组等数据结构。因此,在Java中,参数传递的方式和数据类型都会影响到的使用。 1. 基本数据类型的参数传递 在Java中,基本数据类型的参数传递是通过将参数的值复制到中进行传递的。这意味着,当一个方法被调用时,它的参数值会被复制到上,而不是在上创建新的对象。因此,对于基本数据类型的参数传递,是更加高效的选择。 2. 对象类型的参数传递 与基本数据类型不同,对象类型的参数传递是通过将对象的引用复制到中进行传递的。这意味着,在传递对象参数时,只有对象的引用被复制到上,而对象本身仍然存在于中。因此,对于对象类型的参数传递,中存储的是对象引用,而中存储的是实际的对象。 3. 引用数据类型的参数传递 对于引用数据类型,如数组等,在传递参数时,实际传递的是对象的引用地址。与对象类型的参数传递相似,引用数据类型的参数传递也是通过将对象的引用复制到中进行传递的。 需要注意的是,在Java中,对象和数组都是通过引用来操作的。因此,在传递对象或数组参数时,实际上是传递了对象或数组的引用,而不是对象或数组本身。这也是Java中所谓的“对象引用传递”的原因。 综上所述,Java中的在参数传递上的区别主要体现在传递的数据类型和方式上。基本数据类型的参数传递使用更加高效,而对象和引用数据类型的参数传递则需要使用两种内存区域共同协作完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值