主要有3种比较常见的OutOfMemory Error: java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: GC overhead limit exceeded 1. java.lang.OutOfMemoryError: Java heap space Java heap space,Java应用程序创建的对象存放在这片区域,垃圾回收(Garbage Collection)也发生在这块区域。通常一些比较“重型”的操作可能会导致该异常,比如:需要创建大量的对象,层次比较深的递归操作等。 解决方案有两种,一是优化应用,找到消耗大量内存的地方,然后优化代码或者算法。这种方式比较推荐,但是难度比较大,尤其是在产品环境中出现这种问题,开发人员不能很好的重现问题。第二种方案是提升Java heap size,这种方式虽然感觉有点治标不治本,但是可行性非常高,操作简单。 对于一般的应用,采用如下方式即可(数字根据自己的需要调整):
1 2 3 4 |
1 -Xms<size> - Set initial Java heap size 2 -Xmx<size> - Set maximum Java heap size 3 4 java -Xms512m -Xmx1024m JavaApp |
如果是在tomcat中,出现的这种问题,解决办法是在{tomcat_dir}/bin/catalina.bat中找到如下几行:
1 2 3 4 5 |
1 set MAINCLASS=org.apache.catalina.startup.Bootstrap 2 set ACTION=start 3 set SECURITY_POLICY_FILE= 4 set DEBUG_OPTS= 5 set JPDA= |
在后面加上一行(数字根据自己的需要调整):
1 |
1 set CATALINA_OPTS=-Xms512m -Xmx512m |
2. java.lang.OutOfMemoryError: PermGen space Perm Gen Size(Permanent Generation Size),用来存储被加载的类的定义(class definition)和元数据(metadata),比如:Class Object和Method Object等。这是内存中的一块永久保存区域,JVM的垃圾回收不会触及这块区域。通常在加载一个非常大的项目的时候才会出现该异常。 对于一般的应用,采用如下方式即可(数字根据自己的需要调整):
1 2 3 4 |
1 -XX:PermSize<size> - Set initial PermGen Size. 2 -XX:MaxPermSize<size> - Set the maximum PermGen Size. 3 4 java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp |
如果是在tomcat中出现这个问题,解决办法是在{tomcat_dir}/bin/catalina.bat中添加如下一行:
1 |
1 set CATALINA_OPTS=-server -Xms256m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m |
3. java.lang.OutOfMemoryError: GC overhead limit exceeded 这个错误会出现在这个场景中:GC占用了多余98%(默认值)的CPU时间却只回收了少于2%(默认值)的堆空间。目的是为了让应用终止,给开发者机会去诊断问题。一般是应用程序在有限的内存上创建了大量的临时对象或者弱引用对象,从而导致该异常。虽然加大内存可以暂时解决这个问题,但是还是强烈建议去优化代码,后者更加有效。 首先,你可以关闭JVM这个默认的策略:
1 |
1 java -XX:-UseGCOverheadLimit JavaApp |
其次,你也可以尝试去加大Heap Size:
1 |
1 java -Xmx512m JavaApp |
注意:在修改Tomcat的catalina.bat(*.sh)中的内容时,网上有很多都是说直接修改JAVA_OPTS,按照Apache官方的说法是: Note: Do not use JAVA_OPTS to specify memory limits. You do not need much memory for a small process that is used to stop Tomcat. Those settings belong […]
View Details这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个. 1.可以在windows 更改系统环境变量加上JAVA_OPTS=-Xms64m -Xmx512m 2,如果用的tomcat,在windows下,可以在E:\Program Files\apache-tomcat-6.0.29\bin\catalina.bat 中加上: set JAVA_OPTS=-Xms512m -Xmx512m 位置在: rem Guess CATALINA_HOME if not defined 这行的下面加合适. 但后来发现貌似不管用,还是不断的跳出这个错误信息,后来到Myeclipse的Tomcat 6.x里的JDK设置参数就好了,参数如下: -Xms128M -Xmx512M -XX:PermSize=128m -XX:MaxPermSize=128m 3.如果是linux系统 Linux 在{tomcat_home}/bin/catalina.sh的前面,加 set JAVA_OPTS='-Xms512 -Xmx512′ java.lang.OutOfMemoryError: Java heap space 使用Java程序从数据库中查询大量的数据时出现异常: java.lang.OutOfMemoryError: Java heap space 在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。 例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar 如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。 Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。 Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。 from:https://blog.csdn.net/scholar_man/article/details/50903454
View Details