java.lang.OutOfMemoryError:
Javaheapspace错误及处理办法
文章分类:Java编程
基础知识
(stack)栈是存放函数返回地址、参数、局部变量的。stack是后进先出,一个可变的指针指向stack的顶部
(heap)堆是
程序可以自由操作的内存,使用时先申请,用完之后释放,如何使用完全由程序代码控制。
栈在汇编代码中表示成PUSHPOP,用的是ESS段,SP寄存器
而堆不是,是在内存中读写,EDS段,
C++包括两种被应用程序管理的内存区域:一种称为栈(stack),另一种称为堆(heap)。
stack是函数被调用时自动分配的一块内存区域,它主要用于保留函数内使用的变量及函数调用位置处下一条代码的地址。
stack是后进先出,一个可变的指针指向stack的顶部。
本质上,当一个函数被程序调用时,当前的执行地址被放入stack,如果有参数传递到函数内,这些参数也被压入stack,如果函数内有变量,它们也被压入stack,如果函数执行时调用另一个函数,重复上面的过程。
当从函数返回时,stack指针指向存放先前执行地址的位置,也就是说,stack空间内分配的元素已被删除。这就是为什么函数内的变量此时无效,因为它们已经被推出了stack,另外要注意的是,声明一个静态变量,它没有进入stack中。
另一种由应用程序管理的内存区域是堆(heap),heap是储存应用程序的内存分配需求,并且分离于程序代码和stack,heap中分配的对象的总的空间受限于
计算机系统中有效的虚拟内存。
C程序通常使用malloc和free分配和回收heap内存,在C++中,使用new和delete.
函数里的变量一般是stack,用new和malloc分配的是heap
stack是有大小限制的,heap的大小与系统虚拟内存差不多
stack运算比heap快
stack由编译器来管理,heap由程序员new,malloc,delete,free
堆和栈合起来才是堆栈,对是从低到高扩展的,栈是从高到低扩展的。局部变量都在栈里,通过malloc分配的内存都是在堆里的。
用AffineTransform进行坐标投影时会消耗大量的堆内存,如果内存不足,会
报告java.lang.OutOfMemoryError:Javaheapspace错误
//***************************************************
java.lang.OutOfMemoryError:Javaheapspace错误及处理办法
java.lang.OutOfMemoryError:Javaheapspace
使用Java程序从数据库中
查询大量的数据时出现异常:
java.lang.OutOfMemoryError:Javaheapspace
在JVM中如果98%的时间是用于GC且可用的Heapsize不足2%的时候将抛出此异常信息。
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.
JVM在启动的时候会自动设置Heapsize的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn-Xms-Xmx等选项可进行设置。
例如:java-jar-Xmn16m-Xms64m-Xmx128mMyApp.jar
如果HeapSize设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。