台湾资讯门户网

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

3ec24c1f0f7c45de87cb362453d02bb9

使用Java程序从数据库查询大量数据时发生异常。

java.lang.OutOfMemoryError: Java堆空间

当JVM占GC的98%时间且可用堆大小小于2%时,抛出此异常。

JVM堆的设置是指JVM在运行java程序期间可以使用的内存空间的设置。

JVM在启动时自动设置堆大小的值。它的初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以使用JVM提供的-Xmn -Xms -Xmx等选项进行设置。

例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar

如果“堆大小”设置太小,除了这些异常之外,您会发现程序的响应速度较慢。 GC占用更多时间,应用程序分配的执行时间更短。

堆大小不应超过可用物理内存的80%。通常,-Xms和-Xmx选项应设置为相同,-Xmn是-Xmx值的1/4。

堆大小的-Xms -Xmn设置不应超过物理内存的大小。否则,将提示“在VM初始化期间发生错误无法为对象堆提供足够的空间”。

e8d88f083bc04a8d8e70d74e0aa9a9b2

经过一夜的努力,我终于完成了用文件替换指定字符串的过程,但由于我必须过多地替换整个站程序的html文件,eclipse总是在结束后报告java.lang.OutOfMemoryError: Java一个目录。堆空间异常,然后崩溃。

我认为它必须是由频繁的操作引起的,所以我在每次循环后添加了一个Thread.sleep(1000),发现我仍然死在那个目录中,所以我把1000改为5000,或者死在那里。我认为回收利用可能为时不晚。也许Sun JVM还没准备好发布这种情况。

然后我在启动参数中添加了-Xmx256M,这次没关系。

还有: Java堆管理 - 垃圾收集提到了几点,非常好,可能在编写程序时作为指导:

(1)不要试图假设垃圾收集发生的时间,这一切都是未知的。例如,方法中的临时对象在调用方法后变为无用对象,此时可以释放其内存。

(2)Java提供了一些用于处理垃圾收集的类,并提供了一种强制垃圾收集的方法 - 调用System.gc(),但这也是一种不确定的方法。 Java不保证每次调用此方法时,都能够启动垃圾回收。它只会向JVM发出这样的应用程序。它是否实际执行垃圾收集是一个未知的数字。

(3)选择适合你的垃圾收集器。通常,如果系统没有特殊且要求严格的性能要求,则可以使用JVM的默认选项。否则,请考虑使用目标垃圾收集器。例如,增量收集器更适合具有更高实时要求的系统。系统具有更高的配置,并且有更多的空闲资源。考虑使用并行标记/清除收集器。

(4)要掌握的关键和难点问题是内存泄漏。良好的编程习惯和严谨的编程态度始终是最重要的。不要让自己的小错误导致记忆中存在大量漏洞。

(5)尽早释放对无用对象的引用。

大多数程序员使用临时变量使引用变量在退出范围后自动设置为null,这意味着垃圾收集器收集对象,并且还必须注意是否正在侦听引用的对象。如果是,请删除侦听器,然后分配空值。

也就是说,对于频繁应用内存和释放内存的操作,最好自己控制它,但System.gc()方法可能不适用。最好使用finalize强制执行或编写自己的finalize方法。

1d13864eb43641b69f687a0a80229f16

Tomcat的

遇到TOMCAT错误:java.lang.OutOfMemoryError: Java堆空间,所以检查了信息并找到了解决方案:

如果Java内存不足,则会发生以下错误:

线程'main'中的异常java.lang.OutOfMemoryError: Java堆空间

Java堆大小可以增加如下:

Java -Xms -Xmx

默认值为:

Java -Xms32m -Xmx128m

如果你使用胜利

/tomcat/bin/catalina.bat加上以下命令:

设置JAVA_OPTS=-Xms32m -Xmx256m

如果你使用unix/linux

/tomcat/bin/catalina.sh加上以下命令:

JAVA_OPTS=' - Xms32m -Xmx256m'

2a9244d01d904412a8c03e4382b63686

原因是:

使用Java程序从数据库查询大量数据时发生异常。

java.lang.OutOfMemoryError: Java堆空间

当JVM占GC的98%时间且可用堆大小小于2%时,抛出此异常。

JVM堆的设置是指JVM在运行java程序期间可以使用的内存空间的设置。 JVM在启动时自动设置堆大小的值,其初始空间(即-Xms)是物理内存的1/64。最大空间(-Xmx)是物理内存的1/4。可以使用JVM提供的-Xmn -Xms -Xmx等选项进行设置。

解决方案:

在执行代码之前,catalina.bat(win)或catalina.sh(linux)下的Tomcat_home/bin:

设置JAVA_OPTS=%JAVA_OPTS%-Xms128m -Xmx512m

Eclipse java.lang.OutOfMemoryError: Java堆空间解决方案

Eclipse java.lang.OutOfMemoryError: Java堆空间解决方案

Eclipse在启动参数中设置了jvm大小,因为eclipse本身在运行时需要jvm,因此eclipse.ini中设置的jvm大小不是特定程序使用的jvm的大小,这与jvm大小无关具体方案。

那么我们如何设置程序的jvm大小(当然,控制台将运行没有这个问题,例如:java -Xms256m -Xmx1024m classname,这样你可以设置当前程序的jvm大小)?

因为eclipse中程序的默认jvm配置是:-Xms8m -Xmx128m,所以我们需要在处理相对较大时手动调整内存,这样就没有内存溢出。具体设置方法是:

选择要运行的类,单击菜单'Run as - > Open Run Dialog .',在(x)=Argument选项卡下的vm arguments框中选择-Xmx512m,保存运行并确定

14746ff80391405aa4aa66faec899de1

java.lang.OutOfMemoryError: Eclipse中的Java堆空间

错误2007-06-12 11: 53java.lang.OutOfMemoryError: Java堆空间错误

在tomcat的catalina.bat中

设置JAVA_OPTS=-Xms256m -Xmx512m -Djava.awt.headless=true

256和512分别是MIN和MAX存储器

在日食中

Windows->偏好设置.-> tomcat-> jvm .-> jvm那个文本框,添加-Xms256m -Xmx512m

而已!

Eclipse中的VM设置方法 - [] - 标签:java.lang.OutOfMemoryError: Java堆空间

右键单击,选择run .弹出窗口如下图所示,在vm输入框中填入相应的内存值。

在日食中,黄线是一个警告。

Private Log log=LogFactory.getLog(AddCateAction.class); //小黄线在日志上。

此处的黄线表示您已定义私有变量日志,但未使用此变量。

V.add(O); //此时,eclipse下方出现一条黄色小线,表示它仍被引用?

这是指不建议使用add方法。

OutOfMemoryError与可疑引用无关。可能是循环创建了一个导致Java内存不足的对象。

使用参数指定java虚拟机的内存。

Java -Xms256m -Xmx1024m -XX: MaxPermSize=256M

2.如果在引导过程中出现内存溢出问题,请抛出类似于以下内容的异常消息:

java.lang.OutOfMemoryError: Java堆空间

你可以尝试:

A.修改Tomcat/bin/catalina.bat并添加以下内容

设置JAVA_OPTS=-Xms256m -Xmx512m -Djava.awt.headless=true [-XX: MaxPermSize=128M]

在B.eclipse-> windows->首选项.-> tomcat-> jvm .-> jvm文本框中,添加-Xms256m -Xmx512m

C.eclipse-> preference-> java-> instal jres->编辑,增加参数:-Xms256m -Xmx512m

引用原因:如果JVM中98%的时间可用于GC且可用,则当堆大小小于2%时将抛出此异常。

JVM堆的设置是指JVM在运行java程序期间可以使用的内存空间的设置。 JVM在启动时自动设置堆大小的值,其初始空间(即-Xms)是物理内存的1/64。最大空间(-Xmx)是物理内存的1/4。

可以使用JVM提供的-Xmn -Xms -Xmx等选项进行设置。堆大小不应超过可用物理内存的80%。通常,-Xms和-Xmx选项应设置为相同,-Xmn是-Xmx值的1/4。

堆大小的-Xms -Xmn设置不应超过物理内存的大小。否则,将提示“在VM初始化期间发生错误无法为对象堆提供足够的空间”。

22f517be2bdc4f4c83250f41e10efad2

我的问题:

使用Spring + Hibernate从数据库中读取大量数据,在单例模式下使用AppContext的getBean,并在内存中缓存大量实体Bean .

仍然没有有效的解决方案,通过增加JVM内存大小和修改数据读取方式(例如,只读取有用信息)来缓解这种情况。

修改数据读取方法:

例如,EntityBean具有以下字段:id,name,age,address,description。如果只在程序中使用此bean的id和name字段,则只从数据库中读取两个字段,而不是整个bean和关联的bean。