Java 如何修复outOfMemoryException?

Java 如何修复outOfMemoryException?,java,websphere,Java,Websphere,Spring+WebSphere8.5.5.13上有一个java应用程序 我在带有WebSphere的开发服务器和没有数据的远程预生产服务器上都有这个应用程序的实例 因此,当管理员重新启动pre-prod server时,会出现OutOfMemoryException错误。 但是在dev服务器上没有这样的问题 您是否有解决此类问题的算法 增加jvm大小是否可以解决此问题 如何增加was上应用程序的jvm大小 当您超过堆大小时,会出现OutOfMemoryError(不是OutOfMemoryE

Spring+WebSphere8.5.5.13上有一个java应用程序

我在带有WebSphere的开发服务器和没有数据的远程预生产服务器上都有这个应用程序的实例

因此,当管理员重新启动pre-prod server时,会出现
OutOfMemoryException
错误。 但是在dev服务器上没有这样的问题

  • 您是否有解决此类问题的算法

  • 增加jvm大小是否可以解决此问题

  • 如何增加was上应用程序的jvm大小


当您超过堆大小时,会出现
OutOfMemoryError
(不是
OutOfMemoryException
):

当Java虚拟机由于内存不足而无法分配对象,并且垃圾收集器无法提供更多内存时引发

如果在开发环境中而不是在预生产环境中出现此错误,我可以想象这是由于分配给JVM的数据而不是内存造成的

与OutOfMemoryError相关的最常见问题可能是:

  • 缓存数据:如果缓存对象,则dev中的缓存数据可能小于预生产环境中的缓存数据
  • 文件加载:检查是否加载文件。在预生产中,文件的大小可能更大
  • 数据库加载:如果从数据库加载数据,预生产中的记录数量可能太多,无法将其全部保存在内存中。在这种情况下,需要分页
  • 算法问题:例如,您可以创建一条路径来连接到图形中的节点,但如果算法执行得不好,则该路径可能处于无限状态。在dev中,它可以工作,因为您有不同的数据

当您超过堆大小时,会出现
OutOfMemoryError
(不是
OutOfMemoryException
):

当Java虚拟机由于内存不足而无法分配对象,并且垃圾收集器无法提供更多内存时引发

如果在开发环境中而不是在预生产环境中出现此错误,我可以想象这是由于分配给JVM的数据而不是内存造成的

与OutOfMemoryError相关的最常见问题可能是:

  • 缓存数据:如果缓存对象,则dev中的缓存数据可能小于预生产环境中的缓存数据
  • 文件加载:检查是否加载文件。在预生产中,文件的大小可能更大
  • 数据库加载:如果从数据库加载数据,预生产中的记录数量可能太多,无法将其全部保存在内存中。在这种情况下,需要分页
  • 算法问题:例如,您可以创建一条路径来连接到图形中的节点,但如果算法执行得不好,则该路径可能处于无限状态。在dev中,它可以工作,因为您有不同的数据

OutOfMemoryException
可能由以下几种不同的原因引起:

  • 堆内存不足
  • 堆碎片导致大型对象缺少连续内存
  • GC释放内存的速度不够快,例如,如果消息读取<代码>超出GC开销限制,则由于持续分配
  • 如果消息读取的是
    无法创建新的本机线程,则文件描述符不足

假设应用程序和数据与您的DEV和PRE-PROD环境相同,但配置不同。这是根本原因,应该修复,因为开发人员无法在开发人员上重现此问题。

OutOfMemoryException
可能由以下几种不同的原因引起:

  • 堆内存不足
  • 堆碎片导致大型对象缺少连续内存
  • GC释放内存的速度不够快,例如,如果消息读取<代码>超出GC开销限制,则由于持续分配
  • 如果消息读取的是
    无法创建新的本机线程,则文件描述符不足

假设应用程序和数据与您的DEV和PRE-PROD环境相同,但配置不同。这是根本原因,应该修复,因为开发人员无法在开发人员上重现该问题。

java.lang.OutOfMemoryError在堆内存中没有足够的空间分配对象时抛出。在这里,垃圾收集器无法释放足够的空间来分配新对象,堆内存是固定的,无法扩展。当大部分时间都花在垃圾收集上,释放的内存非常少,并且没有足够的内存来加载java类,甚至没有足够的内存时,可能会抛出此错误

您必须查看抛出java.lang.OutOfMemoryError时打印的stacktrace,如前所述,可能有许多原因。下面是一些

线程名为java.lang.OutOfMemoryError:java堆空间中出现异常 线程线程名称中出现异常:java.lang.OutOfMemoryError:超出GC开销限制 线程名为java.lang.OutOfMemoryError:Metaspace时出现异常 线程名称中的异常:java.lang.OutOfMemoryError:原因为请求大小字节。交换空间不足? 线程线程名称中的异常:java.lang.OutOfMemoryError:reason stack\u trace\u with\u native\u方法


根据错误,我们可以相应地调整JVM设置。增加JVM可能始终无法解决此问题,因为可能存在其他问题,如内存泄漏。

java.lang.OutOfMemoryError在堆内存中没有足够的空间分配对象时抛出。在这里,垃圾收集器无法释放足够的空间来分配新对象,堆内存是固定的,无法扩展。当大部分时间花在垃圾收集上,释放的内存非常少,并且内存不足时,可能会引发此错误