内存有关的基础知识(堆与栈)
来源:互联网 发布:涉密网络三员考试 编辑:程序博客网 时间:2024/06/07 21:04
我们在平时的开发过程中,难免会遇到很多的与内存有关的问题,如何避免并解决这些内存问题,是很值得研究也是蛮有挑战性的一个话题。
一、首先我们先了解一些概念性的知识
1.内存:即RAM(radom access memory)随机存取存储器。
内存里面又分为:栈、堆、静态域、寄存器、常量池和非RAM存储(硬盘永久存储)
①栈 :存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。(例如:局部变量、引用、方法、返回值等)
②堆:堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器(GC)来管理。(例如:JAVA对象,数组,全局变量等)
③静态域:静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数据,Java在内存中专门划分了一个静态存储区域来管理一些特殊的数据变量如静态的数据变量
④寄存器:速度最快的存储场所,因为寄存器位于处理器内部,我们在程序中无法控制
⑤常量池:常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值,还包含一些以文本形式出现的符号引用,比如:类和接口的全限定名;字段的名称和描述符;方法的名称和描述符。
二、堆和栈的对比
1.栈
(1)当变量创建的时候,java会为该对象在栈中分配一个内存空间,当该变量离开该作用域的时候,java会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作他用。
(2)存取速度比堆要快,仅比寄存器要慢,但存在栈中的数据大小与生命周期必须是确定的,灵活性差。
(3)存在栈中的数据是共享的,它是由寄存器进行编译的,有利于节省空间。
2.堆
(1)当堆中的new产生数组和对象超出其作用域后,它们不会释放内存,只有在没有引用变量指向该对象时才会变成垃圾,不会被使用,即使这样,所占内存也不会立即释放,而是等待被垃圾回收器收走,这也是Java比较占用内存的原因。
(2)堆是一个运行时数据区,可以动态的分配内存的大小,因此存取速度比较慢。也正是因为这个特点,堆的生存期不必事先告诉编译器,而且java的垃圾收集器会自动的收走这些不再使用的数据。
- 内存有关的基础知识(堆与栈)
- 栈与堆的超基础知识
- 堆内存与栈内存的理解
- 栈内存与堆内存的区别
- 栈内存与堆内存的区别
- 堆内存与栈内存的区别
- 堆内存与栈内存的区别
- 栈内存与堆内存的问题。
- 栈内存与堆内存的区别
- 堆内存与栈内存的区别
- 栈内存与堆内存的区别
- 栈内存与堆内存的区别
- java基础知识:栈内存和堆内存
- 栈内存与堆内存(Java)
- 栈内存与堆内存(Java)
- java 堆内与堆外内存;java的栈内存和堆内存
- 有关于Java中栈与堆的思考
- 内存:栈与堆
- Hoof, Paper, Scissors
- POJ 3984 & [kuangbin带你飞]专题一 简单搜索 K
- SubLime Text从控制台输入问题
- [kuangbin带你飞]专题一 简单搜索 L
- 阿里云ecs centos 7.2 远程连接
- 内存有关的基础知识(堆与栈)
- nginx 日志分析及性能排查
- error CS1061: Type `UnityEngine.Mesh' does not contain a definition for `GetTriangleStrip' and no ex
- RH124-第十四节-软件安装
- 【剑指offer】面试题35:复杂链表的复制
- Some Problems About Frame Synchronization Framework
- 重读UNP(UNIX网络编程)13章到31章笔记整理(结合TLPI和APUE两书的笔记整理)
- JS中最经典的全局变量和局部变量问题
- 莫名的_locals属性