如何修复outOfMemoryException?

时间:2019-02-06 10:44:23

标签: java websphere

Spring + WebSphere 8.5.5.13上有一个Java应用程序

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

因此,当管理员重新启动预生产服务器时,会出现OutOfMemoryException错误。 但是在开发服务器上没有这种问题。

  • 您是否有算法可以解决此类问题?

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

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

3 个答案:

答案 0 :(得分:1)

当您超过堆大小时,您将拥有OutOfMemoryError(不是OutOfMemoryException

  

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

如果您在开发环境而不是在生产前环境中遇到此错误,我可以想象这是由于数据而不是分配给JVM的内存所致。

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

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

答案 1 :(得分:1)

OutOfMemoryException可能是由几件不同的事情引起的:

  • 堆内存不足
  • 堆碎片导致的大对象连续内存不足
  • GC无法足够快地释放内存,例如如果消息显示为GC overhead limit exceeded
  • ,则由于分配不变
  • 如果消息显示为Unable to create new native thread,则文件描述符不足

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

答案 2 :(得分:1)

当没有足够的空间来分配堆内存中的对象时,抛出

java.lang.OutOfMemoryError。在这里,垃圾收集器无法释放足够的空间来分配新对象,并且堆内存已固定且无法扩展。当大部分时间都花在垃圾回收上且释放的内存很少时,以及当内存不足以加载java类甚至偶数时,都可能引发此错误。

您必须查看抛出java.lang.OutOfMemoryError时打印的堆栈跟踪,因为可能有很多原因。以下是一些

线程thread_name中的异常:java.lang.OutOfMemoryError:Java堆空间 线程thread_name中的异常:java.lang.OutOfMemoryError:超出了GC开销限制 线程thread_name中的异常:java.lang.OutOfMemoryError:元空间 线程thread_name中的异常:java.lang.OutOfMemoryError:请求大小字节是有原因的。交换空间不足? 线程thread_name中的异常:java.lang.OutOfMemoryError:原因stack_trace_with_native_method

基于错误,我们可以相应地调整JVM设置。增加JVM可能永远无法解决问题,因为可能还有其他问题,例如内存泄漏。