java.lang.OutOfMemoryError及解决方案

本文详细介绍了三种常见的 Java OutOfMemoryError 错误,包括 Java 堆空间溢出、永久代空间溢出及 GC 开销限制超出,并提供了相应的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要有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 -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 set MAINCLASS=org.apache.catalina.startup.Bootstrap
2 set ACTION=start
3 set SECURITY_POLICY_FILE=
4 set DEBUG_OPTS=
5 set JPDA=

     在后面加上一行(数字根据自己的需要调整):

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 -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 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 java -XX:-UseGCOverheadLimit JavaApp

      其次,你也可以尝试去加大Heap Size:

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 to CATALINA_OPTS.

 

                                              转载自:https://www.cnblogs.com/penghongwei/p/3603326.html

### 解决 IntelliJ IDEA 中 `java.lang.OutOfMemoryError` 的方案 #### 修改 JVM 堆内存设置 当应用程序尝试分配更多的内存量给对象,而这些量超出了JVM所允许的最大堆空间时,会触发`java.lang.OutOfMemoryError: Java heap space` 错误[^1]。为了处理这个问题,在IntelliJ IDEA中可以调整运行配置下的JVM参数来增加可用的堆大小。 对于IDE本身以及构建过程中的编译器等工具而言,可以在启动选项里指定更大的最大堆尺寸: ```bash -Xmx2048m -XX:ReservedCodeCacheSize=512m -ea -Dsun.io.useCanonCaches=false -Djna.nosys=true -Djb.vmOptionsFile ... ``` 上述命令通过 `-Xmx` 参数指定了最大的Java堆为2GB;如果需要更多,则可适当提高此数值直到满足需求为止[^4]。 另外一种情况是在执行特定任务比如测试或部署期间发生的内存溢出异常。此时应该针对具体的应用程序模块单独设定其所需的额外资源限额。这可通过编辑项目的Run/Debug Configurations完成——找到对应条目并加入合适的JVM flags: ```xml <component name="ProjectRunConfigurationManager"> <configuration default="false" type="Application" factoryName="Application"> <!-- Other settings --> <option name="VM_PARAMETERS" value="-Xms512m -Xmx4g"/> <!-- More configurations --> </configuration> </component> ``` 这里展示了如何利用XML形式定义了一个新的运行配置文件片段,其中设置了初始最小堆(`-Xms`) 和最大堆 (`-Xmx`) 大小分别为512MB和4GB[^3]。 #### 调整 Gradle 或 Maven 构建工具的内存限制 某些时候即使增加了IDE本身的内存也不会解决问题,因为实际消耗大量内存的是Gradle/Maven这类外部依赖管理与自动化构建系统。因此还需要考虑它们各自的环境变量或者属性文件内的相应字段来进行优化。 以Maven为例,可以通过`.mvn/jvm.config` 文件向Mvn传递自定义参数从而影响整个生命周期内的性能表现: ```properties # .mvn/jvm.config -Xms256m -Xmx2048m -XX:+UseG1GC ``` 而对于采用Kotlin DSL脚本编写build.gradle.kts的情况来说,可以直接在根目录下新建名为`gradle.properties`的文字档,并在里面声明如下几项内容以便于控制子进程的行为模式: ```properties org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 ``` 以上措施能够有效缓解由不同原因引起的`OutOFMemoryErrors`现象,但最终效果取决于具体的业务逻辑复杂度和个人开发习惯等因素共同作用的结果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值