如何修复 outOfMemoryException?
How to fix outOfMemoryException?
在 Spring + WebSphere 8.5.5.13
上有一个 java 应用程序
我在带有 WebSphere 的开发服务器上和没有数据的远程预生产服务器上有此应用程序的实例。
因此,当管理员重新启动预生产服务器时 - 出现 OutOfMemoryException
错误。
但是在开发服务器上没有这样的问题。
你们有解决此类问题的算法吗?
增加 jvm 大小是否可以解决此问题?
如何增加 was 上应用程序的 jvm 大小?
当您超过堆大小时,您有一个 OutOfMemoryError
(不是 OutOfMemoryException
):
Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector
如果您在开发环境而不是预生产环境中遇到此错误,我可以想象这是由于数据而不是分配给 JVM 的内存造成的。
与 OutOfMemoryError 相关的最常见问题可能是:
- 缓存数据:如果缓存对象,dev中的缓存数据可能比预生产环境中的要小
- 文件加载: 检查是否加载文件。可能是前期制作文件比较大
- 数据库加载:如果您从数据库加载数据,在预生产中记录的数量可能太多,无法将所有记录保存在内存中。在这种情况下你需要分页
- 算法问题:例如你可以创建一条路径连接到图中的节点,但如果算法做得不好,路径可能无限大。在开发中它可以工作,因为你有不同的数据。
OutOfMemoryException
可能由几种不同的原因引起:
- 堆内存不足
- 堆碎片导致大对象连续内存不足
- GC 释放内存的速度不够快,例如由于不断分配,如果消息显示为
GC overhead limit exceeded
- 文件描述符不足,如果消息显示为
Unable to create new native thread
假设应用程序和数据相同,而您的 DEV 和 PRE-PROD 环境配置不同。这是根本原因,应该解决,因为开发人员无法在 DEV 上重现该问题。
java.lang.OutOfMemoryError 当没有足够的 space 可用于在堆内存中分配对象时抛出。这里垃圾收集器无法释放足够的 space 用于新对象分配,并且堆内存是固定的并且无法扩展。当大部分时间花在垃圾收集上并且释放的内存非常少时,以及当没有足够的内存来加载 java class 甚至
时,都会抛出此错误。
您必须查看抛出 java.lang.OutOfMemoryError 时打印的堆栈跟踪,正如所说,这可能有很多原因。下面是几个,
线程 thread_name 异常:java.lang.OutOfMemoryError:Java 堆 space
线程 thread_name 中的异常:java.lang.OutOfMemoryError:超出 GC 开销限制
线程 thread_name 中的异常:java.lang.OutOfMemoryError:Metaspace
线程 thread_name 中的异常:java.lang.OutOfMemoryError:请求大小字节的原因。交换空间不足 space?
线程 thread_name 中的异常:java.lang.OutOfMemoryError:原因 stack_trace_with_native_method
根据错误,我们可以相应地调整 JVM 设置。增加 JVM 可能始终无法解决问题,因为可能存在其他问题,例如内存泄漏。
在 Spring + WebSphere 8.5.5.13
上有一个 java 应用程序我在带有 WebSphere 的开发服务器上和没有数据的远程预生产服务器上有此应用程序的实例。
因此,当管理员重新启动预生产服务器时 - 出现 OutOfMemoryException
错误。
但是在开发服务器上没有这样的问题。
你们有解决此类问题的算法吗?
增加 jvm 大小是否可以解决此问题?
如何增加 was 上应用程序的 jvm 大小?
当您超过堆大小时,您有一个 OutOfMemoryError
(不是 OutOfMemoryException
):
Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector
如果您在开发环境而不是预生产环境中遇到此错误,我可以想象这是由于数据而不是分配给 JVM 的内存造成的。
与 OutOfMemoryError 相关的最常见问题可能是:
- 缓存数据:如果缓存对象,dev中的缓存数据可能比预生产环境中的要小
- 文件加载: 检查是否加载文件。可能是前期制作文件比较大
- 数据库加载:如果您从数据库加载数据,在预生产中记录的数量可能太多,无法将所有记录保存在内存中。在这种情况下你需要分页
- 算法问题:例如你可以创建一条路径连接到图中的节点,但如果算法做得不好,路径可能无限大。在开发中它可以工作,因为你有不同的数据。
OutOfMemoryException
可能由几种不同的原因引起:
- 堆内存不足
- 堆碎片导致大对象连续内存不足
- GC 释放内存的速度不够快,例如由于不断分配,如果消息显示为
GC overhead limit exceeded
- 文件描述符不足,如果消息显示为
Unable to create new native thread
假设应用程序和数据相同,而您的 DEV 和 PRE-PROD 环境配置不同。这是根本原因,应该解决,因为开发人员无法在 DEV 上重现该问题。
java.lang.OutOfMemoryError 当没有足够的 space 可用于在堆内存中分配对象时抛出。这里垃圾收集器无法释放足够的 space 用于新对象分配,并且堆内存是固定的并且无法扩展。当大部分时间花在垃圾收集上并且释放的内存非常少时,以及当没有足够的内存来加载 java class 甚至
时,都会抛出此错误。您必须查看抛出 java.lang.OutOfMemoryError 时打印的堆栈跟踪,正如所说,这可能有很多原因。下面是几个,
线程 thread_name 异常:java.lang.OutOfMemoryError:Java 堆 space 线程 thread_name 中的异常:java.lang.OutOfMemoryError:超出 GC 开销限制 线程 thread_name 中的异常:java.lang.OutOfMemoryError:Metaspace 线程 thread_name 中的异常:java.lang.OutOfMemoryError:请求大小字节的原因。交换空间不足 space? 线程 thread_name 中的异常:java.lang.OutOfMemoryError:原因 stack_trace_with_native_method
根据错误,我们可以相应地调整 JVM 设置。增加 JVM 可能始终无法解决问题,因为可能存在其他问题,例如内存泄漏。