Java内存分析

来源:互联网 发布:unity3d max模型 编辑:程序博客网 时间:2024/05/16 10:52

一、概述

    内存是计算机中重要的部件之一,他是与CPU进行沟通的桥梁,是CPU能直接寻址的存储空间。计算机中所有的程序运行都是在内存中进行的,因此内存的性能对计算机的影响很大。那么,怎样才能保证计算机合理的利用内存,即一方面不浪费内存的存储空间,使其利用最大化,另一方面又能保证运行速度快而平稳呢?

二、分类

    从编译原理的角度去考虑,程序运行时的内存分配包括静态存储分配,动态存储分配:栈式存储分配和堆式存储分配。

(1)静态存储分配

    在编译时能确定一个程序在运行时所需存储空间的大小,因而在编译时就可以给他们分配固定的内存空间,并确定某个数据项的单元地址,即静态分配是编译器中完成的。这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组) 的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求。

(2)动态存储分配

   栈式存储分配:程序对数据区的需求在编译时是完全未知的,要求在过程的入口处必须知道所有的存储要求。比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个"大小多少"是在编译时确定的,不是在运行时。栈的存储空间是由系统自动分配,速度较快,但程序员是无法控制的。

堆式存储分配:专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例。堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之 后才能确定,这样也可以理解为堆主要用来存放对象的。

堆和栈的区别可以用下面的例子来比喻:

使用栈就像我们去菜馆里吃饭,只管点菜(即发出申请)、付钱、品尝(即使用内存空间),吃饱了就可以走,而不必去理会切菜、洗菜等准备工作和洗碗刷锅等打扫工作,则它的好处就是快捷方便,但是自由度小。使用堆就好像我们自己动手做喜欢吃的菜肴,比较麻烦,但是比较麻烦,但是比较符合自己的口味,而且自由度大。

三、比较

    注意这里所理解的是操作系统下的堆栈,而数据结构中也有堆栈这些概念。虽然名字相同,但是他们却不能简单的理解为是一回事。在系统中,堆区是采用了堆的数据结构管理,栈区是采用了栈的数据结构管理。举个通俗的例子来讲,红烧肉这道菜采用的烹饪方法是红烧的,而栈区采用的技术思想是栈的先进后出原则,前者是具体的事物,后者是一种思想。

0 0
原创粉丝点击