JVM的OOM分为多种情况,下面会针对java.lang.OutOfMemoryError: Java heap space这种情况讲解一下发生的原因与解决方案。

在JAVA应用启动时,会限制应用的使用空间。也就说,任何一个JAVA应用,都只能使用有限的内存空间。

JAVA的内存空间在JDK7及以前划分为堆与永久代。在JDK8之后移除了永久代,采用元空间来代替。

在启动时,通过指定JVM参数:`-Xmx` 来设置可使用的最大堆大小。如果没有显式的设置,则系统上默认为物理内存的1/4(根据物理内存的不同情况有不同的分配规则。但是普遍可以认为是1/4)。

发生java.lang.OutOfMemoryError: Java heap space异常时,代表着应用尝试从堆上申请一个区域时,堆没有可配的空间。(注:可能有可使用的物理内存,但是没有已经达到了JAVA应用可分配的内存大小)

JVM是很智能的,在即将发生OOM时,会进行一次FullGC以回收可回收的对象来释放空间。如果FullGC之后还是没有可满足大小的空间分配,才抛出java.lang.OutOfMemoryError: Java heap space。

java.lang.OutOfMemoryError: Java heap space正常是怎么发生的呢?

  • 突发高峰期:程序在正常的用户量和一定数据量时运行正常。但是,在某个高峰时导致超出预期阈值,内存存活对象使用空间的量超出最大堆,并且无法回收。
  • 内存泄露: 由于编程错误导致应用程序不再需要的对象(数据)一直被持有引用,导致无法被回收。随着时间的推移,泄露的内存对象占用了所有的可用堆空间。

分配合理的足够内存

最简单的解决方法就给JVM分配足够大的内存来满足运行程序的需求。

但是,需要注意在内存泄漏的情况下,分配再大的内存也只是推迟了java.lang.OutOfMemoryError: Java heap space的发生。

而且,加大了JVM堆内存,也会增加在GC时的暂停时间(STW),影响程序的吞吐量,增加延迟。

如何分配一个合理的内存空间,是需要针对GC进行优化的。也就是常说的JVM调优。

JVM调优可以参考:「JVM」GC——调优介绍

那么,如何调整通过分配JAVA堆空间来解决问题呢?

首先,需要了解以下这些问题:

  1. 哪些对象占用了大量的堆空间
  2. 在哪些代码中创建了这些对象

上述的问题可以通过JVM自身的jmap来dump出运行时的堆栈信息。然后通过如:MAT,JProfiler,jconsole等空间来进行内存对象占用的跟踪。

MAT使用可以参考:[JVM] MAT进阶使用

当然,这种方式是比较原始的方式。建议通过如:Plumbr等JVM监控工具来跟踪问题。

Plumbr的报告信息

以上图的监控举例简要说明一下如何适当的进行堆空间的大小分配。

上图所示中,可以得到如下信息:

  • 所有相关对象的整个GCRoot引用
  • 内存消耗最多的对象:
  • 这些对象在代码中的分配位置:

根据上述的信息, 我们可以得到这样的猜想:

这个程序的需要的运行空间超过248MB,并且是无法在一定时间内释放被回收。那么,按JVM调优的思路,建议分配的最大堆大小为:老年代活跃数据大小 * 3~4倍。

所以,我们第一次调整时,可以分配:248 * 4 = 992。

由于堆大小的无法确认,所以第一次调整直接调整为:-Xmx1024m。

单位:

-Xmx1024 即配置1024b = 1kb

-Xmx1024k 即配置1mb

-Xmx1024m 即配置1gb

-Xmx1g 即配置1gb

建议:

在配置-Xmx时,应该将-Xms也配置成相同大小。避免JVM需要动态调整堆空间大小带来的性能影响。

本文由java架构笔记原创,欢迎关注,带你一起长知识!

解决fullgc_「OOM」Java heap space原因与解决相关推荐

  1. Eclipse 报 “Exception in thread main java.lang.OutOfMemoryError: Java heap space ”错误的解决办法

    Eclipse 报 "Exception in thread "main" java.lang.OutOfMemoryError: Java heap space &qu ...

  2. Eclipse 报 “Exception in thread main java.lang.OutOfMemoryError: Java heap space ”错误的解决办法...

    Eclipse 报 "Exception in thread "main" java.lang.OutOfMemoryError: Java heap space &qu ...

  3. was java heap space_实战项目中Java heap space错误的解决

    部标GPS通讯系统在上线之后,经过不断调试,终于稳定运行一段时间,后来又遇到了Java heap space错误异常!日志如下: 说明系统中有未释放的对象.如何找出这些未释放对象以及监控JVM堆内存, ...

  4. java.lang.OutOfMemoryError: Java heap space 错误及解决办法

    java.lang.OutOfMemoryError: Java heap space =================================================== 使用Ja ...

  5. java程序启动报错 “java.lang.OutOfMemoryError: Java heap space”问题的解决办法(IDEA开发工具)

    项目执行 mvn clean install 成功 在idea 进行debug启动一直报错, 报编译错: maven-resources-production:xxx java.nio.file.in ...

  6. kafka 出现Java heap space的解决方法

    问题: 测试环境异常,经过查看server.log日志,发现:java.lang.OutOfMemoryError: Java heap space,具体如下: server.log: [2021-0 ...

  7. java heap space 什么意思_java内存溢出之Java heap space

    作为一个java程序员,大家都应该认识JVM.JVM作为java的核心,实在太重要了.而内存溢出又是程序员常遇到的错误之一,如果你对JVM的原理足够了解,那么解决这样的问题就不在是一件困难的事情. 关 ...

  8. 定位java heap space_页面报OutofMemoryError:Java heap space问题定位及优化

    背景:服务器是windows server 2008 R2系统,点击一个导出报表功能按钮,页面报如下错: tomcat控制台里也报类似的错误,下面说一下定位和调优方法---- 定位: 1.打开cmd控 ...

  9. Android gradle编译错误OOM:java heap space的解决办法

    Android开发中,在编译较大规模项目时,出现内存溢出错误: OutOfMemeryError OOM:java heap space; 尝试解决办法: 1. 开发项目根项目下增加/demo/gra ...

最新文章

  1. 不能解决,复选框在request对象获取的信息后显示在用户信息里面为中文的选项名...
  2. 【java开发系列】—— spring简单入门示例
  3. 统一过程(UP)定义了初启阶段、精化阶段、构建阶段、移交阶段和产生阶段,每个阶段以达到某个里程碑时结束,其中()的里程碑是生命周期架构。 A.初启阶段 B.精化阶段 C.构建阶段 D.移交阶段
  4. Angular的后院:组件依赖关系的解决
  5. 深入理解equals和hashCode关系和区别
  6. 根据Ping(ICMP协议)得到TTL并分析
  7. Hadoop MapReduce(WordCount) Java编程
  8. 发明了计算机科学中的 bug 一词的是,为什么经常把计算机中存在的问题叫bug?...
  9. Python项目实践:天天向上的力量
  10. creator图片循环显示_Cocos creator 游戏背景循环滚动--Javascript编写
  11. python selenium 如何选中iframe中的元素?
  12. Hello, world!
  13. (10)进程---Manager数据共享
  14. phpstorm内网远程debug
  15. 三菱凌云3故障代码_三菱凌云III电梯通讯故障处理
  16. 鸿蒙系统怎么在桌面添加小程序,从微信小程序到鸿蒙JS开发-menutoastdialog
  17. excel冻结窗口_Excel之小功能
  18. ptp输出内容包含什么_解剖PTP协议
  19. 马士兵MCA架构师读书笔记
  20. 怎么理解Web 3.0?

热门文章

  1. 解决eclipse中java代码注释变成乱码的问题
  2. 错误ORA-04091: table is mutating, trigger/function may not see it的原因以及解决办法
  3. WCF开发的几个频骤
  4. 微软为何痛失移动操作系统?
  5. 在命令行下执行php程序
  6. Golang类型转化方法汇总
  7. ELK报错expected block end, but found BlockMappingStart
  8. c 窗体程序 mysql_C\C++开发MySQL程序简介(下)
  9. MySQL常用SQL语句(CURD,建表,加字段,查改参数)
  10. js md5 过滤表情 数据签名