Java中的基础----堆与栈的介绍、区别
来源:互联网 发布:神魔布袋戏 知乎 编辑:程序博客网 时间:2024/06/04 17:59
堆和栈都是Java中常用的存储结构,都是内存中存放数据的地方。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~我是可爱的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
堆:(对象)
引用类型的变量,其内存分配在堆上或者常量池(字符串常量、基本数据类型常量),需要通过new等方式来创建。
堆内存主要作用是存放运行时创建(new)的对象。
(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)
栈:(基本数据类型变量、对象的引用变量)
基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放。
栈内存的主要作用是存放基本数据类型和引用变量。栈的内存管理是通过栈的"后进先出"模式来实现的。
(主要用来执行程序,存取速度快,大小和生存期必须确定,缺乏灵活性)
图例如下:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~我是可爱的分割线~~~~~~~~~~~~~
PS:
JVM:
是基于堆栈的虚拟机,每个Java程序在一个独立的JVM实例上运行,每个JVM实例对应一个堆,
同个java程序内的多线程运行在同个JVM实例上,多个线程之间共享堆内存(多线访问堆时,要实现数据的同步)。
----------------------------------------------------------------------------------wo ye shi ke ai de fen ge xian-------------------------------------------------------
为什么又栈内存和堆内存之分?
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法定义的变量将会放到这块栈内存里,随着方法的结束,这个方法的内存栈也将自动销毁。(不需要GC回收)
因此,所有在方法中定义的局部变量放在栈内存中;
当我们在程序中创建一个对象时,这个对象会被保存到运行时数据区中,以便反复利用(复用,因为创建对象的成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随着方法的结束而销毁,即使方法结束后,这个对象还可能被另外一个引用变量所引用(在方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量去引用它时,系统的垃圾回收器(GC)才会在合适的时候回收它。
为什么上面说创建对象的开销(成本)比较大?
来看看如何创建对象、创建对象的过程:
创建对象的根本途径是构造器,通过new关键字来调用某个类的构造器即可创建这个类的实例。但对象不是完全由构造器来负责创建的,实际上,当程序员调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,这个对象已经产生了---这些是在构造器执行之前就完成的,也就是说,当系统开始执行构造器的执行体之前,系统已经创建了一个对象,只是这对象还不能被外部程序访问,只能在构造器中通过this来引用。当构造器的执行体执行结束后,这个对象作为构造器的返回值被返回,通常还会赋给另外一个引用类型的变量,从而让外部程序可以访问。(当然可以通过设置构造器的访问权限private,阻止其他类创建该类的实例)
作者: Emira_J
- Java中的基础----堆与栈的介绍、区别
- Java中的基础----堆与栈的介绍、区别
- Java中的基础----堆与栈的介绍、区别
- Java中的基础----堆与栈的介绍、区别
- Java中的基础----堆与栈的介绍、区别
- Java中的基础----堆与栈的介绍、区别
- Java中的基础----堆与栈的介绍、区别
- Java中的基础----堆与栈的介绍、区别
- Java中的基础----堆与栈的介绍、区别
- 【超清晰详细】堆与栈的区别 | Java 基础
- JAVA中的内存分配及栈与堆的区别
- 区别Java中的堆与栈
- Java中的栈和堆的区别
- Java中的堆和栈的区别
- Java中的堆和栈的区别
- Java中的堆和栈的区别
- Java中的堆和栈的区别
- Java中的堆和栈的区别
- 更换pip源
- 关于matplotlib的那些事
- Sublime Text + CTags + Cscope (部分替代Source Insight)
- vs和vc智能指针(smart_ptr)框架源码剖析
- Java基础教程28-多态
- Java中的基础----堆与栈的介绍、区别
- 并发队列-无界阻塞优先级队列
- 值传递、引用传递、地址传递辨析
- Android服务Service详解(作用,生命周期,AIDL)系列文章--远程服务AIDL&IPC
- WebService体系之——CXF+SPRING文件上传
- 数据库恢复的三种方式
- Java练手程序之模拟售货机
- 效应 定律
- windows中定时关闭并延时打开某个运行程序