1 / 10
文档名称:

java的内存分配.doc

格式:doc   页数:10页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

java的内存分配.doc

上传人:xgs758698 2016/6/23 文件大小:0 KB

下载得到文件列表

java的内存分配.doc

相关文档

文档介绍

文档介绍:java 的内存分配今天看了一下 java 的内存分配,分享一下: 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。引用数据类型,需要用 new 来创建, 既在栈空间分配一个地址空间, 又在堆空间分配对象的类变量。方法的引用参数, 在栈空间分配一个地址空间, 并指向堆空间的对象区,当方法调用完成后从栈空间回收。局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后, 栈空间立刻被回收,堆空间区域等待 GC 回收。方法调用时传入的 literal 参数,先在栈空间分配,在方法调用完成后从栈空间分配。字符串常量在 DATA 区域分配, this 在堆空间分配。数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小! 哦对了,补充一下 static 在 DATA 区域分配。其实是有规律的,只要你理解了这些个基本的原理: 堆空间的话: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表, 寻找第一个空间大于所申请空间的堆结点, 然后将该结点从空闲结点链表中删除, 并将该结点的空间分配给程序, 另外, 对于大多数系统, 会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的 delete 语句才能正确的释放本内存空间。另外由于找到的堆结点的大小不一定正好等于申请的大小, 系统会自动的将多余的那部分重新放入空闲链表中。是由 new 分配的内存, 一般速度比较慢, 而且容易产生内存碎片, 不过用起来最方便,另外,在 WINDOWS 下,最好的方式是用 VirtualAlloc 分配内存, 他不是在堆, 也不是在栈是直接在进程的地址空间中保留一快内存, 虽然用起来最不方便。但是速度快, 也最灵活。是向高地址扩展的数据结构, 是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的, 自然是不连续的, 而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见, 堆获得的空间比较灵活,也比较大。栈空间的话:在 Windows 下, 栈是向低地址扩展的数据结构, 是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS 下, 栈的大小是固定的( 是一个编译时就确定的常数) ,如果申请的空间超过栈的剩余空间时,将提示 overflow 。因此, 能从栈获得的空间较小。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。由系统自动分配,速度较快。但程序员是无法控制的。 ok, 头会不会有点小晕,不会的话继续吧: JVM 中的堆和栈 JVM 为每个新创建的线程都分配一个堆栈. 也就是说, 对于一个 Java 程序来说, 它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。 JVM 对堆栈只进行两种操作: 以帧为单位的压栈和出栈操作。我们知道, 某个线程正在执行的方法称为此线程的当前方法. 我们可能不知道, 当前方法使用的帧称为当前帧。当线程激活一个 Java 方法,JVM 就会在线程的 Java 堆栈里新压入一个帧。这个帧自然成为了当前帧. 在此方法执行期间, 这个帧将用来保存参数, 局部变量, 中间计算过程和其他数据. 这