java基础 堆 和 栈序列1
来源:互联网 发布:qq邮箱smtp设置 端口25 编辑:程序博客网 时间:2024/05/21 10:29
前辈原文:http://blog.csdn.net/emira_j/article/details/51232611
堆和栈都是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,阻止其他类创建该类的实例)
- java基础 堆 和 栈序列1
- java基础 堆和栈
- java基础:栈内存和堆内存
- Java基础-浅谈堆和栈
- Java基础——java堆和栈
- (2011年java基础)java内存分析(1)----堆和栈
- Java基础之堆和栈、引用值
- Java基础7(栈内存和堆内存)
- 黑马程序员-----java基础之数组及堆和栈
- java基础Haep(堆)和Stack(栈)区别
- Java编程基础:栈&堆
- 【转】java基础:堆&栈
- Java栈和堆
- java 堆和栈
- JAVA堆和栈
- JAVA堆和栈
- Java 堆和栈
- java堆和栈
- 程序人生
- hadoop2配置文件详解
- prim算法(未优化版)
- 根据开始日期和结束日期获取所有日期的方法
- RabbitMQ
- java基础 堆 和 栈序列1
- 综合变换
- [ArcGIS] 焦点统计应用 提取山顶点 地形起伏度
- bzoj3674 可持久化并查集加强版 (主席树 & 并查集)
- 自定义类型部分知识写一篇博客。 知识点: >结构体类型创建 >结构体初始化 >结构体内存对齐 >位段,位段计算机大小。 >枚举+联合。
- TensorFlow学习笔记1:Hello TensorFlow!
- 分布式锁之数据库锁
- LeetCode 300. Longest Increasing Subsequence
- 透视投影