java错误处理:java.lang.OutOfMemoryError: Java heap space

搜集整理关于java错误处理:java.lang.OutOfMemoryError: Java heap space

java.lang.OutOfMemoryError: Java heap space

资料整理


标题:java.lang.OutOfMemoryError: Java heap space
作者:小楼听风雨
原文网址:http://blog.vonno.com/33993/viewspace_1245

2007-04-16 17:50:57 / 个人分类:知识总结

原因:
使用Java程序从数据库中查询大量的数据时出现异常:
java.lang.OutOfMemoryError: Java heap space
在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。
解决办法:
tomcat_home/bin下catalina.bat(win)或catalina.sh(linux)执行代码前加上:
set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m 

 


标题:java.lang.OutOfMemoryError: Java heap space
作者:Render in Opera
原文网址:http://my.opera.com/render/blog/show.dml/449643

 

Thursday, 7. September 2006, 08:31:58


tomcat
遇到TOMCAT出错:java.lang.OutOfMemoryError: Java heap space,于是查了资料,找到了解决方法:
If Java runs out of memory, the following error occurs:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Java heap size can be increased as follows:

java -Xms<initial heap size> -Xmx<maximum heap size>
Defaults are:
java -Xms32m -Xmx128m

如果你用win
/tomcat/bin/catalina.bat 加上下面的命令:
set JAVA_OPTS=-Xms32m -Xmx256m

如果你用unix/linux
/tomcat/bin/catalina.sh 加上下面的命令:
JAVA_OPTS="-Xms32m -Xmx256m"

 


标题:java.lang.OutOfMemoryError: Java heap space
作者:幽客独往
原文网址:http://blog.youkuaiyun.com/casularm/archive/2006/10/04/1320345.aspx

 

java.lang.OutOfMemoryError: Java heap space
使用Java程序从数据库中查询大量的数据时出现异常:
java.lang.OutOfMemoryError: Java heap space
在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。
例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar
如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。
Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。

 幽客独往发表于 2006年10月04日 11:52:00


 标题:java垃圾回收学习      2006-6-9 17:01:00:
 作者:cscript
 原文网址:http://bbs.itdb.cn/forums/thread/2103.aspx
 
 经过一个晚上的努力终于完成了一个文件替换指定字符串的程序,但是由于我要替换的全站程序html文件太多,所以eclipse下边老是在一个目录结束后报出java.lang.OutOfMemoryError: Java heap space的异常,然后就崩溃了。

 

我一想肯定是频繁操作造成来不及回收,于是在每个循环之后加上一个Thread.sleep(1000),发现还是到那个目录下就死掉,于是把1000改成5000,还是到那里死掉,我想可能不是来不及回收这么简单,或许sun 的JVM里边刚好对于这种情况不释放也有可能。
接着我又把启动的参数添上一个 -Xmx256M,这回就可以了。

想一想,还是对于垃圾回收的原理不太了解,就在网上查了一下,发现了几篇不错的文章。

http://java.ccidnet.com/art/3539/20060314/476073_1.html
http://www.pconline.com.cn/pcedu/empolder/gj/java/0509/701281.html


还有:Java堆的管理—垃圾回收提到一下几点,很不错,或许可以作为写程序时候的准则:

  (1)不要试图去假定垃圾收集发生的时间,这一切都是未知的。比如,方法中的一个临时对象在方法调用完毕后就变成了无用对象,这个时候它的内存就可以被释放。

  (2)Java中提供了一些和垃圾收集打交道的类,而且提供了一种强行执行垃圾收集的方法--调用System.gc(),但这同样是个不确定的方法。Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。

  (3)挑选适合自己的垃圾收集器。一般来说,如果系统没有特殊和苛刻的性能要求,可以采用JVM的缺省选项。否则可以考虑使用有针对性的垃圾收集器,比如增量收集器就比较适合实时性要求较高的系统之中。系统具有较高的配置,有比较多的闲置资源,可以考虑使用并行标记/清除收集器。

  (4)关键的也是难把握的问题是内存泄漏。良好的编程习惯和严谨的编程态度永远是最重要的,不要让自己的一个小错误导致内存出现大漏洞。

  (5)尽早释放无用对象的引用。大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null,暗示垃圾收集器来收集该对象,还必须注意该引用的对象是否被监听,如果有,则要去掉监听器,然后再赋空值。

就是说,对于频繁申请内存和释放内存的操作,还是自己控制一下比较好,但是System.gc()的方法不一定适用,最好使用finallize强制执行或者写自己的finallize方法。

### 解决 Java 程序中出现的 OutOfMemoryError 错误(Java 堆空间不足) Java 应用程序中的 `java.lang.OutOfMemoryError: Java heap space` 错误通常表明应用程序尝试分配的对象内存超出了 JVM 堆空间的限制。以下是详细的解决方案: #### 1. 增加 JVM 堆内存大小 可以通过调整 JVM 启动参数来增加堆内存的大小。使用 `-Xms` 和 `-Xmx` 参数分别设置初始堆大小和最大堆大小。例如: ```bash java -Xms512m -Xmx2048m YourApplication ``` 上述命令将初始堆大小设置为 512MB,最大堆大小设置为 2048MB[^1]。 #### 2. 检查内存泄漏问题 如果应用程序存在内存泄漏,可能导致堆内存被不必要的对象占用。可以使用以下工具分析内存使用情况并定位泄漏点: - **VisualVM**:一个内置的 JVM 工具,用于监控和分析内存使用。 - **Eclipse MAT(Memory Analyzer Tool)**:专门用于分析堆转储文件,帮助识别内存泄漏的根本原因。 - **JProfiler** 或 **YourKit**:商业级性能分析工具,提供更强大的功能[^3]。 #### 3. 优化代码以减少内存消耗 检查程序中是否存在一次性加载大量数据的情况。例如,避免在内存中处理过大的集合或文件。可以通过以下方式优化: - 分页处理数据库查询结果。 - 使用流式 API(如 Java 8 的 Stream)逐步处理大数据集。 - 替换大对象为更高效的实现(如使用 `StringBuilder` 替代字符串拼接)[^2]。 #### 4. 调整垃圾回收器配置 不同的垃圾回收器对内存管理有不同的影响。可以选择适合应用场景的垃圾回收器,并调整相关参数。例如: - 使用 G1 垃圾回收器: ```bash java -XX:+UseG1GC -Xms512m -Xmx2048m YourApplication ``` - 调整新生代与老年代的比例: ```bash java -Xmn512m -Xms2048m -Xmx2048m YourApplication ``` #### 5. 配置 IntelliJ IDEA 的堆内存(适用于开发环境) 如果错误发生在开发环境中(如 IntelliJ IDEA),可以调整 IDE 的堆内存配置: - 修改 `idea.vmoptions` 文件(位于 IntelliJ IDEA 安装目录下),添加或修改以下内容: ```properties -Xms512m -Xmx2048m ``` - 或者通过 IDE 内部设置调整: - 打开 `Help -> Edit Custom VM Options`。 - 添加上述参数并保存[^2]。 --- ### 示例代码:分页处理大数据集 以下是一个简单的分页处理示例,避免一次性加载过多数据: ```java import java.util.ArrayList; import java.util.List; public class PaginationExample { public static void main(String[] args) { int pageSize = 1000; // 每页记录数 List<String> largeData = generateLargeData(10000); // 模拟生成大数据集 for (int i = 0; i < largeData.size(); i += pageSize) { int endIndex = Math.min(i + pageSize, largeData.size()); List<String> page = largeData.subList(i, endIndex); processPage(page); // 处理每一页的数据 } } private static List<String> generateLargeData(int size) { List<String> data = new ArrayList<>(); for (int i = 0; i < size; i++) { data.add("Item " + i); } return data; } private static void processPage(List<String> page) { System.out.println("Processing page with " + page.size() + " items."); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值