- 1、本文档共136页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[互联网]ch3 Java语言基础
数据类型 内存管理原理 程序运行前:Java程序不负责创建内存空间,是由JVM完成。当程序准备执行时,由JVM向操作系统请求一定的内存空间,称为初始内存空间。程序执行过程中所需的内存都由Java虚拟机从这片内存空间中划分。 程序运行中 Java程序一直向Java虚拟机申请内存,当程序所需内存空间超出初始内存空间时,Java虚拟机会再次向操作系统申请更多的内存供程序使用。 内存溢出 程序接着运行,当Java虚拟机已申请的内存达到了规定的最大内存空间,但程序还需要更多的内存,这时会出现内存溢出的错误。 内存空间逻辑划分 JVM会把申请的内存从逻辑上划分为三个区域 方法区 堆 栈 Java虚拟机对内存空间的管理 Java程序中的哪些内容会占用内存空间呢? 类的结构、 对象中的数据 变量(包括基本类型和引用类型)等都会占用内存空间 Java虚拟机对内存空间的管理(续) Java虚拟机的三个区域“方法区”、“堆区”和“栈区”都有大小限制,任何一个区域内存溢出都会导致程序出现错误,栈内存溢出会发生StackOverflowException错误,堆内存溢出会发生OutOfMemoryError错误。 方法区中的内存分配:方法区默认最大容量为64M,Java虚拟机会将加载的java类存入方法区,保存类的结构(属性与方法),类静态成员等内容。编写中小型程序时,一般不会造成方法区的内存溢出。 内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略 静态的 栈式的 堆式的 静态的 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间。 这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的. 和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。 静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放. 堆和栈的比较 堆主要用来存放对象的 栈主要是用来执行程序的 这种不同又主要是由于堆和栈的特点决定的 堆的特点 堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中,要求创建一个对象时,只需用 new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!这也正是导致我们刚才所说的效率低的原因. 栈的特点 在编程中,例如C/C++中,所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶 向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候,修改栈指针就可以把栈中的内容销毁.这样的模式速度最快, 当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个大小多少是在编译时确定的,不是在运行时. 栈有一个很重要的特殊性,就是存在栈中的数据可以共享 栈存储举例1 int a = 3; int b = 3; int a=4; 栈存储举例2 Integer?a=new?Integer(3);//(1) ?? Integer?b=new?Integer(3);//(2)?? ?? JVM中的堆和栈 JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个
您可能关注的文档
- [理学]第八讲 序列相关性.ppt
- [理学]第六章 UNIX操作系统.ppt
- [理学]第六章 化学热力学初步.ppt
- [理学]第六章 资本结构决策.ppt
- [理学]第六章 运输保险.ppt
- [理学]第六章_水力分级.ppt
- [理学]第六章保形映射正式版.ppt
- [理学]第六章在磁场中的原子.ppt
- [理学]第六讲:方程求根.ppt
- [理学]第十一章 应用电化学.ppt
- 艺术疗法行业商业机会挖掘与战略布局策略研究报告.docx
- 智能家庭娱乐系统行业商业机会挖掘与战略布局策略研究报告.docx
- 医疗纠纷预防和处理条例与医疗事故处理条例的思考分享PPT课件.pptx
- 新冀教版(2025)七年级数学下册《6.1 二元一次方程组》习题课件.pptx
- 新冀教版(2025)七年级数学下册精品课件:6.2.3 二元一次方程组的解法代入、加减消元法的综合应用.pptx
- 导演节目行业市场发展趋势及投资咨询报告.docx
- 制作和服培训行业风险投资态势及投融资策略指引报告.docx
- 医疗转诊的行政服务行业消费市场分析.docx
- 文件装订行业市场发展趋势及投资咨询报告.docx
- 在线语言艺术教育行业分析及未来五至十年行业发展报告.docx
文档评论(0)