JAVA深入java核心java内存分配原理精讲


  内存分配与管理是java的核心技术之一, 之前我们曾引见过java的内存管理与内存泄露以及java渣滓回收方面的知识, 今天我们再次深入java核心, 详细引见一下java在内存分配方面的知识。 普通java在内存分配时会涉及到以下区域:

  JAVA◆存放器:我们在顺序中无法控制

  ◆栈:存放根本类型的数据和对象的引用, 但对象本身不存放在栈中, 而是存放在堆中

  ◆堆:存放用new产生的数据

  ◆静态域:存放在对象中用static定义的静态成员

  ◆常量池:存放常量

  ◆非ram存储:硬盘等永久存储空间

  java内存分配中的栈

  在函数中定义的一些根本类型的变量数据和对象的引用变量都在函数的栈内存中分配。

  当在一段代码块定义一个变量时, java就在栈中为这个变量分配内存空间, 当该变量加入该作用域后, java会自动释放掉为该变量所分配的内存空间, 该内存空间可以立即被另作他用。

  java内存分配中的堆

  堆内存用来存放由new创立的对象和数组。 在堆中分配的内存, 由java虚拟机的自动渣滓回收器来管理。

  在堆中产生了一个数组或对象后, 还可以在栈中定义一个特殊的变量, 让栈中这个变量的取值等于数组或对象在堆内存中的首地址, 栈中的这个变量就成了数组或对象的引用变量。pba黑头终结液好吗 引用变量就相当于是为数组或对象起的一个名称, 以后就可以在顺序中使用栈中的引用变量来访问堆中的数组或对象。 引用变量就相当于是为数组或者对象起的一个名称。

  引用变量是普通的变量, 定义时在栈中分配, 引用变量在顺序运行到其作用域之外后被释放。 而数组和对象本身在堆中分配, 即便顺序运行到使用new产生数组或者对象的语句所在的代码块之外, 数组和对象本身占据的内存不会被释放, 数组和对象在没有引用变量指向它的时候, 才变为渣滓, 不能在被使用, 但依然占据内存空间不放, 在随后的一个不确定的时间被渣滓回收器收走(释放掉)。 这也是java比较占内存的缘由。

  实践上, 栈中的变量指向堆内存中的变量, 这就是java中的指针!

  常量池指的是在编译期被确定, 并被保存在已编译的. class文件中的一些数据。 除了包括代码中所定义的各种根本类型(如int、long等等)和对象型(如string及数组)的常量值(final)还包括一些以文本形式呈现的符号引用, 比如:

  ◆类和接口的全限定名;

  ◆字段的名称和描画符;

  ◆方法和名称和描画符。

  虚拟机必需为每个被装载的类型维护一个常量池。 常量池就是该类型所用到常量的一个有序集和, 包括直接常量(string, integer和floatingpoint常量)和对下一页

posted on 2011-05-18 06:44  jiyizhen3721  阅读(311)  评论(0编辑  收藏  举报