《欧柏泰克JAVA培训:Java内存原型》.pdf

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《欧柏泰克JAVA培训:Java内存原型》.pdf

深度解析Java 内存原型 java虚拟机内存原型 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈 中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放常量 非RAM存储:硬盘等永久存储空间 Java 内存分配中的栈 栈的基本单位是帧(或栈帧): 每当一个java线程运行的时候, java虚拟机会为该线程分配一个java栈。该线程在执行某个java 方法的时候, 向java栈压入一个帧, 这个帧用于存储参数、局部 变量、操作数、中间运算结果等。当这个方法执行完的时候, 帧会 从栈中弹出。Java栈上的所有数据是私有的,其他线程都不能该线 程的栈数据。 在函数中定义的一些基本类型的变量数据和对象的引用变量都 在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中 为这个变量分 配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变 量所分配的内存空间,该内存空间可以立即被另作他用。 Java 内存分配中的堆 java虚拟机中的堆用来存放由new创建的对象和数组。在堆中 分配的内存,由Java虚拟机的自动的垃圾回收机制来管理堆的内存。 简单的说和栈相对,堆主要是用来存放java对象的,栈主要是用 来存放对象引用的...在堆中产生了一个数组或对象后,还可以 在栈 中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆 内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引 用变量就相当于是 为数组或对象起的一个名称,以后就可以在程序 中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于 是为数组或者对象起的一个名称。 引用变量是普通的变量,定义时在栈中分配,引用变量在程序运 行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程 序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数 组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指 向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不 放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因。 实际上,栈中的变量指向堆内存中的变量,这就是Java 中的指 针! Java 的堆是一个运行时数据区,类的(对象从中分配空间。这些 对象通过new、newarray、 anewarray和multianewarray等指令建 立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的, 堆的优势是可以动态地分配内存 大小,生存期也不必事先告诉编译 器,因为它是在运行时动态分配内存的,Java 的垃圾收集器会自动 收走这些不再使用的数据。但缺点是,由于要在运行时动态 分配内 存,存取速度较慢。 栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共 享。但缺点是,存在栈中的数据大小与生存期必须是 确定的,缺乏 灵活性。栈中主要存放一些基本类型的变量数据(int,short, long, byte, float, double, boolean, char)和对象句柄(引用)。 栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设 我们同时定义: int a=3; int b=3; 编译器先处理int a = 3;首先它会在栈中创建一个变量为a 的 引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来, 然后将a指向3。接着处理int b = 3;在创建完b 的引用变量后,因 为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b 同时均指向3的情况。 这时,如果再令 a=4;那么编译器会重新搜索栈中是否有4值,如 果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a 指向这个地址。因此a值的改变不会影响 到b 的值。 要注意这种数据的共享与两个对象的引用同时指向一个对象的 这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由 编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个 对象的内部状态,会影响到另一个对象引用变量。 常量池 (constantpool) 常量池指的是在编译期被确定,并被保存在已编译的.cl

文档评论(0)

mwap + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档