`
quyang
  • 浏览: 3291 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

java拾遗录 番外1

阅读更多

java拾遗录 番外1

主题:core java——不得不说的内存


一、在Java中,主要有如下几种类型的内存空间:

  1 栈内存(stack segment):每个线程私有的。
  2 堆内存(heap segment):所有线程公用的。
  3 方法区(Method Area):有点像以前常说的“进程代码段”,这里面存放了每个加载类的反射信息、 类函数的代码、编译时常量等信息。
  4 原生方法栈(Native Method Stack):主要用于JNI中的原生代码。

其中主要的是两个:栈内存(Stack)和堆内存(Heap)

   在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 
   当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 
   堆内存用来存放由new创建的对象和数组。 
   在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 
   在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 

二、内存分配策略 
按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 
静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 
栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。 
静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放. 


除此之外,还要注意以下几点:

    1,基础数据类型直接在栈空间stack分配,方法的形参,直接在栈空间分配,当方法调用完成后从栈空间回收 
  2 引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间heap分配对象的类变量。 
  3.方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后,从栈空间回收。 
  4.局部变量new出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。 
  5 方法电泳时传入的基本数据类型(literal)参数,现在栈空间分配,在方法调用完成后从栈空间clear。 
  6.字符串常量在data segment区域分配,static在data segment区域分配, 
  7.This在堆空间分配 
  8.数组既在栈空间非配数组名称,又在堆空间分配数组实际的大小

部分内容来自网络

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics