内存有关的基础知识(堆与栈)

来源:互联网 发布:涉密网络三员考试 编辑:程序博客网 时间: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的垃圾收集器会自动的收走这些不再使用的数据。

原创粉丝点击