OutOfMemoryError内存不足

java.lang.OutOfMemoryError内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。

造成此错误的原因有一下几个:

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。

解决方法:数据库查询尽量采用分页的方式查询。(MySQL中可以通过limit关键字实现)

2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

解决方法:调用集合的.clear()方法清空,系统会自动回收;

3.代码中存在死循环或循环产生过多重复的对象实体;

解决方法:检查循环

例:报错:Caused by: java.lang.IllegalStateException: The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook

createCellStyle放在循环外,可以重复调用

4.启动参数内存值设定的过小;

解决方法:不建议作为首选

类似的StackOverflowError :

如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出 StackOverflowError 异常。

例:递归没有边界条件或者递归的边界条件永远不能达到

如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出 OutOfMemoryError 异常。

时间: 2024-10-26 14:21:56

OutOfMemoryError内存不足的相关文章

Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识. 在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识.jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域).Heap space(堆区域).Java Stacks(Java栈).其中永久保存区域主要存放Class

(转)Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

面试时面试关问了有关内存溢出的出现情况和解决方法,网上百度了下,在此感谢 作者liqianbnu总结. 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识.在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识.jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域).H

Java中OutOfMemoryError(内存溢出)的情况及解决办法

java.lang.OutOfMemoryError: Java heap space // TODO Auto-generated method stub Vector v = new Vector(10); for (int i = 1; i<1000000000; i++) {Object o = new Object(); v.add(o); o = null; } 因为每一次生成一个新的对象,都会放入到堆区(heap)里面,所以堆区的空间肯定就不够了. 那就只能去修改循环的次数

Java中OutOfMemoryError(内存溢出)的

修改Tomcat 文件 catalina.bat rem Guess CATALINA_HOME if not defined set JAVA_OPTS=-Xms32m -Xmx512m   增加这个 set "CURRENT_DIR=%cd%"

java虚拟机涉及内存溢出

Java语言写的代码是.java文件,它会被特定程序编译(javac.exe,它会被Eclipse之类的IDE调用)成字节码(bytecode),字节码不能直接在CPU上运行,需要另一个程序读取并执行,这个部件就是java虚拟机,它像机器一样运行编译好的java字节码,就像机器直接执行机器码一样……java虚拟机的外部接口在windows下主要是jvm.dll这个文件…… 就是能让.class文件执行的工具 虚拟机参数配置 http://blog.163.com/magicc_love/blog

JVM内存区域

JVM 内存划分 栈 虚拟机栈 本地方法栈 堆 方法计数器 方法区 对象的分配 指针碰撞 空闲列表 (√) 分配内存 线程安全问题: 分配动作处同步---实际上采用CAS保证分配的原子性 TLAB 本地线程分配缓存 对象内存中的信息布局 对象头 Mark word (根据对象状态复用此部分空间) hashcode GC分代信息 锁状态信息 线程持有的锁 偏向线程ID 偏向时间戳 ..... 类型指针(对象指向它的类元数据的指针,虚拟机可以通过这个指针来确定这个对象是哪一个类的实例) 实例数据 对

运行时数据区域(堆 栈 方法区 常量池)和内存分配策略

内存管理 内存分配和内存释放 内存分配由程序完成,内存释放由GC完成 运行时数据区域 (1)程序计数器(program counter register) 一块较小的内存空间 当前线程所执行的字节码的行号指示器,字节码解释器在工作的时候就是通过改变程序计数器的值来选取下一跳要执行的指令 多线程环境下,线程轮流切换执行,程序计数器保证线程切换之后能恢复到正确的位置 每个线程都有一个独立的程序计数器 线程私有 没有任何异常 java方法,程序计数器的值为当前正在执行的虚拟机字节码指令的地址 nati

【JVM】-- JVM内存结构

目录 1.程序计数器(Program Counter Register) 2.Java虚拟机栈(VM Stack) 有关Java虚拟机栈的问题 3.本地方法栈(Native Method Stack) 4.堆(heap) 定义 堆内存溢出 5.方法区(Method Area) 组成 方法区的内存溢出 方法区内存溢出实例 6.运行时常量池 7.StringTables 特性: 8.直接内存 引入直接内存的原因 直接内存的内存溢出 直接内存的内存回收 JVM的内存结构一般指Java的运行时数据区:

Java报错原因汇总

1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序 遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片 未经初始化,或者图片创建时的路径错误等等.对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初 始化混淆起来了.数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是