实战项目中Java heap space错误的解决

【Java问题大纲】Java heap space问题的出现以及解决 单个系统所涉及到的数据量大概在100W左右,之前都是使用脚本同步的,这次因为换数据库了所以采用了程序的方式来同步数据到其他系统。所以在多线程查数据库数据时产生了这个问题,日常启动项目的大小设置的是。IDEA遇到了,可以设置IDEA的大小,设置Xms和Xmx就行啦!以上列出的几个是最常遇到的,也有可能其他导致出现哦!,因此问题就产生了!...... 阅读详情

 

java高级面试 2018-09-07 20:19:23

部标GPS通讯系统在上线之后,经过不断调试,终于稳定运行一段时间,后来又遇到了Java heap space错误异常!日志如下:

实战项目中Java heap space错误的解决

 

说明系统中有未释放的对象。如何找出这些未释放对象以及监控JVM堆内存,优化代码释放内存对象呢?还有JVM的垃圾回收机制是如何运作的呢?

首先在系统启动运行的时候打开记录GC详细信息,运行脚本如下:

实战项目中Java heap space错误的解决

 

看看GC详细日志,当GC到13400多次的时候新生代和老生代的堆内存几乎用满了,频繁触发Full GC (Ergonomics) ,直到没有内存空间给新生对象了。所以JVM抛出了内存溢出错误!进而导致程序崩溃。

实战项目中Java heap space错误的解决

 

首先简单了解下JVM垃圾回收机制:

实战项目中Java heap space错误的解决

 

从上图可以看出 GC 的主要收集区域,包括 PSYoungGen(年轻代)、ParOldGen(老年代)、Metaspace(元数据区)。

新生代:新创建的对象都是用新生代分配内存,Eden空间不足时,触发Minor GC,这时会把存活的对象转移进幸存者Survivor区。

老年代:老年代用于存放经过多次Minor GC之后依然存活的对象。

新生代的GC(Minor GC):新生代通常存活时间较短基于Copying算法进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和FromSpace或ToSpace之间copy。

新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从Eden到Survivor,最后到老年代。

老年代的GC(Major GC/Full GC):老年代与新生代不同,老年代对象存活的时间比较长、比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,

回收后对用空出的空间要么进行合并、要么标记出来便于下次进行分配,总之目的就是要减少内存碎片带来的效率损耗。

附上堆结构图:

实战项目中Java heap space错误的解决

 

至此,在已经尝试了将Java虚拟机中Xms(初始堆大小-2G)和Xmx(最大堆大小-4G)参数调大之后也无果,只能从代码入手, 对象一直堆积于老年代未被释放,应该是代码中对象未被释放。

为了找出代码中未被释放的对象,这里运用到了内存监控工具jconsole和内存堆对象统计工具jmap。

jconsole.exe位于bin目录下,用法也挺简单的,用于调优后的监控还不错,这里留个图不做介绍了

实战项目中Java heap space错误的解决

 

这里运用jmap(jdk自带的jvm内存分析的工具),将程序堆对象统计出来的结果如下:

实战项目中Java heap space错误的解决

 

发现到代码问题:应该是解析协议的时候CanDataItem对象不断被new出来,使用完了以后并未被GC回收留在老生代,

实战项目中Java heap space错误的解决

 

找到CanDataItem使用完成的地方做了如下修改:

实战项目中Java heap space错误的解决

 

修改代码再将T808Message等类用完了的地方做了释放,之后终于解决了问题!修改代码以后再次使用jmap统计如下,正常了!

实战项目中Java heap space错误的解决

 

附 - jmap输出中class name非自定义类的说明:

BaseType CharacterTypeInterpretationBbytesigned byteCcharUnicode characterDdoubledouble-precision floating-point valueFfloatsingle-precision floating-point valueIintintegerJlonglong integerL;referencean instance of classSshortsigned shortZbooleantrue or false[referenceone array dimension,[I表示int[]

总结导致java.lang.OutOfMemoryError异常的常见原因有以下几种:

  • 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  • 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
  • 代码中存在死循环或循环产生过多重复的对象实体-----(本例中);
  • 使用的第三方软件中的BUG;
  • 启动参数内存值设定的过小;

至此问题总算解决了,通常情况下,Java开发人员并不需要去关心JVM是如何运行的。即使不理解JVM的工作原理,也不会给开发人员带来过多困惑。Java程序员更容易忽视基础技术。

“蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇蟮之穴无可寄托者,用心躁也”。对于技术人员来说,如果长期忽略自身技术的根基而去一昧地追求高层框架技术,这无疑是舍本求末的做法。

JVM的出现,为程序员屏蔽了操作系统与硬件的细节,使得程序员从诸如内存管理这样的繁琐任务中解放出来。但这不并等同于允许Java程序员放弃对基础的重视。

事实上,任何平台的程序员都应当了解平台的基本特性、实现机制以及接口,这是提高自身修养的必经之路。对于Java程序员来说,我们还是需要多多了解JVM。

了解JVM的基本实现机制,不仅对于解决实际应用中诸如GC等虚拟机问题时有直接帮助,还有利于我们更好地理解语言本身。

Docker和JVM应用OOM那些事 Java 应用运行过程中你是否遇到以下类似问题为什么 Java 应用所在的 Docker 容器内存使用量不会减少?发生 OOM 后程序还能运行吗?Java 应用所在的容器为什么宕机或者自动重启了?三个问题有一定关联性,在回答以上问题前,我们先了解下“OOM”和“JVM 内存管理”。 阅读详情

相关推荐

Java heap space 问题解决

错误通常意味着 Java 虚拟机(JVM)在堆内存中无法为新对象分配足够的空间。堆内存是 JVM 用于存储对象实例的区域,当程序创建的对象过多或者对象过大,导致堆内存耗尽时,就会抛出这个错误。以下是可能导致。

m0_56088675的博客 2146

后台程序 报错内容:java.sql.SQLException: Java heap space

3、JVM启动时,JVM堆会自动设置heap size值,值太小导致;2、是由于mysql单个字段存储的内容过大导致堆内存溢出;1、查询没有通过参数,而是直接查询出所有的记录;

龍承leo 3913

解决idea出现的java.lang.OutOfMemoryError: Java heap space的问题

解决idea出现的java.lang.OutOfMemoryError: Java heap space和java.lang.OutOfMemoryError: PermGen space的问题。

念兮为美 1万+

java项目记一次内存溢出Java heap space

一、具体报错信息: Caused by: java.sql.SQLException: Java heap space at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQ

lris——jihua 6942

OpenFOAM-多孔介质模型(porous media)

文章目录一、多孔介质(porous media)二、使用步骤1.达西定律2.Darcy-Forchheimer3.OpenFOAM fvOptions4.paraview动画每帧显示时间(Annotate Time)5.参考内容总结 一、多孔介质(porous media) 在流体力学中,流体流经多孔介质是指流体流经多孔介质时的行为方式,如海绵或木材,或使用沙子或其他多孔材料过滤水。 我们将展示如何设置多孔层,并使用OpenFOAM模拟流体通过该介质。 二、使用步骤 1.达西定律 达西定律最初是由达西通.

zq93538196的博客 9938

保姆级教程:用Python+OpenCV搞定Orbbec Gemini深度与彩色流对齐(附完整代码)

本文提供了一份详细的Orbbec Gemini深度与彩色流对齐教程,涵盖从环境配置到完整代码实现的每一步。通过解析深度流对齐原理,对比不同对齐模式,并提供工业级应用中的问题排查方法,帮助开发者快速掌握Orbbec Gemini相机的使用技巧。文章还包含进阶应用如点云生成与三维重建的实战代码。

weixin_29090917的博客 470

Java heap space

出现这种情况,一般是数据量太大导致 jvm 虚拟机内存溢出,即你返回的数据量太多 解决方式: 第一步: 通过将sql语句打印到控制台,或者将sql打印到日志上,查看日志中的sql 第二步: 将sql语句放到,Navicat 等数据库连接工具上进行执行,看返回的结果是多少条,(我的sql返回量是60多万条数据) 第三步: ①调整sql,使用 limit(适用于跨数据库平台即在mysql...

yang_zzu的博客 2620

基于UCD3138的数字控制硬开关全桥DC-DC电源设计实战解析

在开关电源设计中,数字控制技术正逐步取代传统模拟方案,以其卓越的灵活性、可编程性和强大的数据处理能力,成为应对复杂动态响应与智能化需求的关键。其核心原理在于通过高精度模数转换器(ADC)实时采样电压、电流信号,经由数字信号处理器(如ARM内核)运行PID等控制算法,动态调整数字脉宽调制(DPWM)输出,从而实现对功率级的精确控制。这种技术价值体现在能够轻松实现高级算法(如输入电压前馈、非线性补偿)、灵活配置保护参数,并通过PMBus等接口实现智能化监控与管理。其典型应用场景包括通信基站、服务器电源以及工业设

1312

java from space_实战项目中Java heap space错误的解决

部标GPS通讯系统在上线之后,经过不断调试,终于稳定运行一段时间,后来又遇到了Javaheap space错误异常!日志如下:说明系统中有未释放的对象。如何找出这些未释放对象以及监控JVM堆内存,优化代码释放内存对象呢?还有JVM的垃圾回收机制是如何运作的呢?首先在系统启动运行的时候打开记录GC详细信息,运行脚本如下:看看GC详细日志,当GC到13400多次的时候新生代和老生代的堆内存几乎用满了...

weixin_29155599的博客 360

VIL-SLAM论文翻译:Stereo Visual Inertial LiDAR Simultaneous Localization and Mapping

文章目录写在前面摘要1.引言2.相关工作3.系统概述4.视觉前端5.双目视觉惯性里程计A. IMU预积分因子B. 非结构化视觉因子C. 优化和边缘化6. 激光建图A. LiDAR扫描去畸变B. 帧到地图配准7. LiDAR增强的闭环A. 回环检测B. 回环约束C. 全局位姿图优化D. 重定位8. 实验结果A.平台和软件B.测试和结果C. EuRoCMAV数据集测试9.结论 写在前面 写作参考: robot L 开源代码: 开源代码链接 论文原文: 原文链接 摘要 SLAM是移动和空中机器人的一项基本任务

JaydenQ的博客 2321

斯坦福大学CS224d基础1:线性代数知识

本文为斯坦福CS229的内容,也是CS224d课程的背景数学知识。概括了在机器学习和深度学习中用到的大部分线性代数知识。为了便于大家查漏补缺,这里根据英文版本整理了一个中文版本。

龙心尘 2万+

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

部标GPS通讯系统在上线之后,经过不断调试,终于稳定运行一段时间,后来又遇到了Javaheap space错误异常!日志如下:说明系统中有未释放的对象。如何找出这些未释放对象以及监控JVM堆内存,优化代码释放内存对象呢?还有JVM的垃圾回收机制是如何运作的呢?首先在系统启动运行的时候打开记录GC详细信息,运行脚本如下:看看GC详细日志,当GC到13400多次的时候新生代和老生代的堆内存几乎用满了...

weixin_33587161的博客 472

【温室气体数据集】全球总碳柱观测网络 TCCON

【温室气体数据集】全球总碳柱观测网络 TCCON

WW、forever的博客 437

成功解决java.lang.OutOfMemoryError: Java heap space错误

这个错误会在JVM(Java Virtual Machine,Java虚拟机)的堆内存空间不足以满足程序新对象实例创建需求时产生。简单说,它就表示我们的程序已经消耗尽了所有可用的堆内存。

小明的Java问道之路 12万+

【Bug已解决】Codex CLI 报错 You‘ve hit your usage limit 解决方案

Codex CLI 密集使用时触发 You've hit your usage limit 限流报错,本质是订阅套餐额度机制在正常发挥作用。文中给出等待滚动重置、拆分大任务、主动管理上下文、升级套餐、团队排队机制等完整解决方案。

博客 1万+

【点云概述】什么是点云、来源、种类、特点、处理?

【点云概述】什么是点云、来源、种类、特点、处理?点云(point cloud)是空间中点的数据集,可以表示三维形状或对象,通常由三维扫描仪获取。点云中每个点的位置都由一组笛卡尔坐标 ( X , Y , Z ) (X, Y, Z) (X,Y,Z)描述,有些可能含有色彩信息 ( R , G , B ) (R, G, B) (R,G,B)或物体反射面强度(Intensity)信。

智慧空间实验室 9818

【已解决】java.lang.OutOfMemoryError: Java heap space错误

【已解决】java.lang.OutOfMemoryError: Java heap space错误

weixin_42326851的博客 9796

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JAVA HEAP SPACE解决方法和JVM参数设置

JAVA HEAP SPACE解决方法和JVM参数设置JAVA HEAP SPACE解决方法和JVM参数设置原因分析设置异常分析Java堆的管理—垃圾回收提到一下几点,很不错,或许可以作为写程序时候的准则:jvm 内存查看与分析工具 JAVA HEAP SPACE解决方法和JVM参数设置 在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError: Java heap space

weixin_43714426的博客 3万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java heap space 什么意思_java heap space是什么意思?

因为程序要从数据读取近10W行记录处理,当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误。java heap space的意思为“java堆空间”。在网上一查可能是JAVA的堆栈设置太小的原因。跟据网上的答案大致有这两种解决方法:1、设置环境变量set JAVA_OPTS= -Xms32m -Xmx512m可以根据自己机器的...

weixin_33791941的博客 2万+

java heap space怎么解决_java heap space错误的解决方法是什么

java heap space错误的解决方法是:1、设置环境变量,代码为【set JAVA_OPTS= -Xms32m -Xmx512m】;2、在执行JAVA类文件时加上相关参数,参数为【java -Xms32m -Xmx800m cl】。java heap space错误的解决方法是:1、设置环境变量set JAVA_OPTS= -Xms32m -Xmx512m可以根据自己机器的内存进行更改,但...

weixin_29172201的博客 9251

idea编译出现 java.lang.OutOfMemoryError Java heap space

idea 编辑项目提示 内存溢出

寂夜了无痕的博客 4072
上一篇: Clipboard.js实现复制文本到剪贴板功能
下一篇: hbase60010端口无法访问web页面 HBASE1.0之后的版本web端访问的接口变更为16010
王树民
博客等级 码龄10年 912粉丝 560原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值