解决Java Out Of Memory 问题的思考

时间:2019-08-05 来源:www.clicadenovo.com

九州娱乐网金百利站

  千锋JAVA开发学院2天前我要分享

java.lang.OutOfMemoryError是java.lang.VirtualMachineError的子类,当JVM由于内存不足而无法分配对象而抛出时,垃圾收集器无法提供更多内存。

虚拟机可能会构造一个OutOfMemoryError对象,就好像堆栈不可写或禁用了抑制一样。

OutOfMemoryError类型:

有两种类型的OutOfMemory:

Thejava.lang.OutOfMemoryError: Javaheapspace

Thejava.lang.OutOfMemoryError: PermGenspace

尽管两种情况都是因为JVM内存不足而发生的,但它们彼此之间存在很大差异,并且它们的解决方案彼此独立。

源代码分析:

我们可以看到OutOfMemoryError有两个构造函数,一个是无参数,另一个是带有详细消息的构造函数。

重现java.lang.OutOfMemoryError: Javaheapspace

下面这段代码可以重现OutOfMemory:

运行此程序,

在上面的例子中,我们可以看到一个小程序可以创建一个OutOfMemoryError,因为它只是一个小错误步骤。因为它有一个无限循环。继续添加相同的变量。

java.lang.OutOfMemoryError: Javaheapspace解决方案

更简单的解决方案是将JVM参数调整为:并增加最大堆大小。将-Xmx和-Xms比率设置为1: 1或1: 1.5,例如:

exportJVM_ARGS=” - Xms1024m-Xmx1024m”

如果调整大小,OutOfMemory也会出现,我们需要使用相应的工具来调查内存泄漏问题,分析程序的HeapDump文件。

常用工具是:

EclipseMemoryAnalyzer(MAT)分析HeapDump

ProfilerlikeNetbeansorJProbe。

java.lang.OutOfMemoryError: PermGenspace的原因

PermGenspace问题有两个主要原因:

1.我们通常知道JVM使用分代垃圾收集,分为新一代,旧代和持久生成。 PermGen是持久化生成,因此永久生成用于存储JVM

类,与各种StringPool相关的方法,各种元数据。

在大多数情况下,持久代的默认大小约为64MB,因此在实践中,此值很容易达到。

然后我们需要调整这个参数:的值

我们设置XMX,这不能解决这个问题,你需要设置“-XX: PermSize”和“-XX: MaxPermSize”

例如。

exportJVM_ARGS=“ - Xmx1024m-XX: MaxPermSize=256m”

第二个原因是: ClassLoader引起的内存泄漏。通常,此错误将发生在GlassFish,Tomcat

等待网络服务器。

应用程序服务器中使用不同的应用程序加载器来加载不同的应用程序以部署和卸载应用程序,而不会影响同一服但是在卸载过程中,如果容器以某种方式保持对应用程序类加载器加载的任何类的引用,那么如果多次部署和卸载应用程序,则不会对类和所有相关类进行垃圾回收并快速填充permGen空间。

java.lang.OutOfMemoryError: PermGenspace的解决方案

如上所述,第一种解决方案是调整参数,

exportJVM_ARGS=“ - XX: PermSize=64M-XX: MaxPermSize=256m”

当然,如果仍然出现同样的问题,则需要分析内存泄漏。

常用工具是:

EclipseMemoryAnalyzer(MAT)分析HeapDump

ProfilerlikeNetbeansorJProbe。

以上,内存泄漏分析和解决方案供参考。

收集报告投诉

java.lang.OutOfMemoryError是java.lang.VirtualMachineError的子类,当JVM由于内存不足而无法分配对象而抛出时,垃圾收集器无法提供更多内存。

虚拟机可能会构造一个OutOfMemoryError对象,就好像堆栈不可写或禁用了抑制一样。

OutOfMemoryError类型:

有两种类型的OutOfMemory:

Thejava.lang.OutOfMemoryError: Javaheapspace

Thejava.lang.OutOfMemoryError: PermGenspace

尽管两种情况都是因为JVM内存不足而发生的,但它们彼此之间存在很大差异,并且它们的解决方案彼此独立。

源代码分析:

我们可以看到OutOfMemoryError有两个构造函数,一个是无参数,另一个是带有详细消息的构造函数。

重现java.lang.OutOfMemoryError: Javaheapspace

下面这段代码可以重现OutOfMemory:

运行此程序,

在上面的例子中,我们可以看到一个小程序可以创建一个OutOfMemoryError,因为它只是一个小错误步骤。因为它有一个无限循环。继续添加相同的变量。

java.lang.OutOfMemoryError: Javaheapspace解决方案

更简单的解决方案是将JVM参数调整为:并增加最大堆大小。将-Xmx和-Xms比率设置为1: 1或1: 1.5,例如:

exportJVM_ARGS=” - Xms1024m-Xmx1024m”

如果调整大小,OutOfMemory也会出现,我们需要使用相应的工具来调查内存泄漏问题,分析程序的HeapDump文件。

常用工具是:

EclipseMemoryAnalyzer(MAT)分析HeapDump

ProfilerlikeNetbeansorJProbe。

java.lang.OutOfMemoryError: PermGenspace的原因

PermGenspace问题有两个主要原因:

1.我们通常知道JVM使用分代垃圾收集,分为新一代,旧代和持久生成。 PermGen是持久化生成,因此永久生成用于存储JVM

类,与各种StringPool相关的方法,各种元数据。

在大多数情况下,持久代的默认大小约为64MB,因此在实践中,此值很容易达到。

然后我们需要调整这个参数:的值

我们设置XMX,这不能解决这个问题,你需要设置“-XX: PermSize”和“-XX: MaxPermSize”

例如。

exportJVM_ARGS=“ - Xmx1024m-XX: MaxPermSize=256m”

第二个原因是: ClassLoader引起的内存泄漏。通常,此错误将发生在GlassFish,Tomcat

等待网络服务器。

应用程序服务器中使用不同的应用程序加载器来加载不同的应用程序以部署和卸载应用程序,而不会影响同一服但是在卸载过程中,如果容器以某种方式保持对应用程序类加载器加载的任何类的引用,那么如果多次部署和卸载应用程序,则不会对类和所有相关类进行垃圾回收并快速填充permGen空间。

java.lang.OutOfMemoryError: PermGenspace的解决方案

如上所述,第一种解决方案是调整参数,

exportJVM_ARGS=“ - XX: PermSize=64M-XX: MaxPermSize=256m”

当然,如果仍然出现同样的问题,则需要分析内存泄漏。

常用工具是:

EclipseMemoryAnalyzer(MAT)分析HeapDump

ProfilerlikeNetbeansorJProbe。

以上,内存泄漏分析和解决方案供参考。