3年前 (2021-01-17)  jvm |   抢沙发  889 
文章评分 0 次,平均分 0.0

OutOfMemoryError:java堆空间内存泄露

java.lang.OutOfMemoryError错误是的子类java.lang.VirtualMachineError. 当JVM由于内存不足而无法分配对象,并且垃圾收集器无法提供更多内存时,它抛出。OutOfMemoryError对象可能由虚拟机构造,就好像禁用了抑制或堆栈跟踪不可写一样。

Java中OutOfMemoryError的类型

主要有两类java.lang.OutOfMemoryError错误在Java中:

  • java.lang.OutOfMemoryError: Java heap space
  • java.lang.OutOfMemoryError: PermGen space

尽管这两种情况都是由于JVM内存不足而发生的,但它们之间有很大的不同,而且它们的解决方案是相互独立的。

Constructors

  • OutOfMemoryError():构造没有详细信息的OutOfMemoryError。
  • OutOfMemoryError(字符串s):使用指定的详细信息构造OutOfMemoryError。

OutOfMemoryError:Java堆空间示例

在下面的示例中,尝试创建java.lang.OutOfMemoryError错误在无限循环中加上“Saurabh Gupta”这个名字。直到抛出java.lang.OutOfMemoryError错误.

package com.exceptions.errors;
 
public class OutOfMemoryErrorExample {
 
    public static void main(String[] args) {
        StringBuffer str=new StringBuffer("FacingIssuesOnIt");
        int i=0;
        while(i==0)
        {
            str.append("Saurabh Gupta");
            System.out.println(i);
        }
    }
}

OutOfMemoryError堆栈跟踪

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuffer.append(Unknown Source)
    at com.exceptions.errors.OutOfMemoryErrorExample.main(OutOfMemoryErrorExample.java:10)

在上面的示例中,您可以看到一个小程序也可以创建OutOfMemoryError,因为这只是一个小的错误步骤。因为它有一个无限循环,不断地对同一个变量添加测试。你将在下面几段中对此有深入的了解。

java.lang.OutOfMemoryError: PermGen space发生的原因

永久代可通过两种方式发生:

原因1:

如果您熟悉不同代的堆和垃圾收集过程,新的、旧的和永久的堆空间的生成。PermGen意味着堆的永久生成用于存储字符串池以及JVM相关类、方法和其他java原语所需的各种元数据。

大多数JVM默认的Perm空间大小都在“64MB”左右,如果应用程序中有太多的类和大量的字符串,就很容易达到这个大小。

记住:按-Xmx设置堆大小对perm空间中的OutOfMemory没有影响。要增加perm空间的大小,请在JVM选项中指定永久生成的大小,如下所示。

-XX:PermSize”-XX:MaxPermSize

export JVM_ARGS=“-Xmx1024m-XX:MaxPermSize=256m”

原因二:

“另一个原因”java.lang.OutOfMemoryError错误:PermGen“是通过类加载器导致的内存泄漏。一般来说,它发生在web服务器和应用服务器上,比如Glassfish、Weblogic、WebSphere或tomcat。

在应用程序服务器中,使用不同的类加载器加载不同的应用程序,以便在不影响同一服务器上其他应用程序的情况下部署和取消部署一个应用程序。但是在取消部署期间,如果容器以某种方式保留了应用程序类加载器加载的任何类的引用,那么如果您多次部署和取消部署应用程序,那么该类和所有相关类将不会被垃圾收集并快速填充永久空间。

解决方案java.lang.OutOfMemoryError错误

Java.lang.OutOfMemoryError错误是来自JVM的一种错误,因为内存泄漏或对象正在消耗内存但没有释放内存。要找出问题的根本原因需要大量的调查,比如哪个对象占用了内存,占用了多少内存。

解决java.lang.OutOfMemoryError: Java heap space

1. 解决java中OutOfMemoryError的一个简单方法是使用JVM选项增加最大堆大小。为了增加JVM中的堆大小,如果您在java应用程序中设置堆大小,那么最好选择将-Xmx设置为-Xms比率1:1或1:1.5。

export JVM_ARGS=“-Xms1024m-Xmx1024m”

2. 如果应用上述解决方案后仍出现OutOfMemoryError。在这种情况下,可以使用工具来调查内存泄漏和堆转储。例如:

  • Eclipse内存分析器(MAT)来检查堆转储。
  • 像Netbeans或JProbe这样的分析器。

这是一个困难的解决方案,需要一些时间来分析和发现内存泄漏。

解决java.lang.OutOfMemoryError: PermGen space

解决OutOfMemoryError:PermSpace的简单方法是使用JVM选项“-XX:MaxPermSize”增加Perm空间的堆大小。还可以使用“-XX:PermSize”指定Perm空间的初始大小,并保留初始和最大Perm空间,这样可以防止在Perm空间重新调整大小时发生完全垃圾回收。例如:

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

如果应用上述解决方案后仍出现OutOfMemoryError。在这种情况下,可以使用概要文件工具来调查内存泄漏和堆转储。例如:

  • Eclipse内存分析器(MAT)来检查堆转储。
  • 像Netbeans或JProbe这样的分析器。

这是一个困难的解决方案,需要一些时间来分析和发现内存泄漏。

在Tomcat中求解PermGen空间的OutOfMemoryError

Tomcat 6.0以后提供了内存泄漏检测功能,可以从web应用的角度检测许多常见的内存泄漏,例如:

  • ThreadLocal内存泄漏
  • JDBC驱动程序注册
  • RMI
  • LogFactory
  • 由web应用程序等生成的线程。

您可以在上查看完整的详细信息:http://wiki.apache.org/tomcat/MemoryLeakProtection

下面是java空间提供的两个免费工具,用于分析堆和OutOfMemoryError的罪魁祸首。

调查工具java.lang.OutOfMemoryError错误

1. Eclipse内存分析器(MAT):它通过分析java堆转储dump文件来帮助分析类加载器泄漏和内存泄漏。它还有助于减少内存的消耗,并确定内存泄漏的确切嫌疑人。

2. Visual gc(可视垃圾收集器监视工具):将此工具连接到您的工具热点JVM。它以图形方式直观地显示所有关键数据,包括垃圾收集、类加载器和JVM编译器性能。

3. Jhat(堆分析器工具):在JDK-6之后,它现在是JDK新版本的一部分。我们可以使用该命令行实用程序通过使用“jmap”来分析堆转储文件中的堆转储。当您执行以下命令并将浏览器指向端口7000时,就可以开始分析堆转储中的对象。

命令:jthat-J-Xmx256m heapdump

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1320.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册