桥下红药

机器应该工作、人类应该思考

Java的虚拟机内存分配

总分类 0 评

ps:Java的内存分配算是基础的东西,介于很多人都是直接从应用层开始学习的,导致基础原理很薄弱。这对于小公司重点在于实现功能是没问题的,但是到大公司怕是要被卡在面试关,了解这些知识对学习Java有很大的好处,知其然知其所以然。

  • 计数器:我们在程序中无法控制,记录程序运行的位置,以及实现条件分歧的。
  • 栈:存放基本类型的数据和对象的引用(就是指向堆里面的地址 比如: 0x0000000a),对象本身不存放在栈中,而是存放在堆中。
  • 堆:存放用new产生的数据。(如:对象和数组)
  • 静态域:存放在对象中用static定义的静态成员。
  • 常量池:存放常量 比如 String。

Java内存分配中的栈

在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。


Java内存分配中的堆

  1. 堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

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

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

上一篇

发表评论