Java heap 内存溢出(java.lang.OutOfMemoryError: Java heap space)

Heap overflow堆溢出(一) 堆溢出介绍: 堆溢出是指程序向某个堆块中写入的字节数超过了堆块本身可使用的字节数(之所以是可使用而不是用户申请的字节数,是因为堆管理器会对用户所申请的字节数进行调整,这也导致可利用的字节数都不小于用户申请的字节数),因而导致了数据溢出,并覆盖到物理相邻的高地址...... 阅读详情

产生原因:

  • 代码中使用大对象:Java8的JVM会将大对象直接分配到Old Generation中,Old Generation的数据只会在FULL GC的时候被回收;Full GC执行机制(暂不清楚);未执行Full GC的情况下,如果再次创建大对象,那么大对象还会导致JVM去申请新的Old Generation空间;但Old Generation不会无限增大(应该有上限吧:个人经历:32G Ubuntu系统,未指定任何JVM参数,Eden、From、To各1G左右大小,Old Generation 5G大小);当大对象和大对象的垃圾数据(没有被回收的实际不用的大对象)总量超过上限的时候就会引发heap内存溢出

现象:

使用Parallel GC 看到的现象

  • 环境:Ubuntu 16.04.3;jdk1.8.0_65;默认的虚拟机(从jmap结果看使用的GC机制是Parallel GC)
  • 现象
    查看现象的命令:jmap -heap 进程pid
root@xxxxx:~# jmap -heap 10134
Attaching to process ID 10134, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01

using thread-local object allocation.
Parallel GC with 13 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 8434745344 (8044.0MB)
   NewSize                  = 176160768 (168.0MB)
   MaxNewSize               = 2811232256 (2681.0MB)
   OldSize                  = 352321536 (336.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 937426944 (894.0MB)
   used     = 378428264 (360.8973159790039MB)
   free     = 558998680 (533.1026840209961MB)
   40.36882729071632% used
From Space:
   capacity = 936902656 (893.5MB)
   used     = 37279688 (35.55268096923828MB)
   free     = 899622968 (857.9473190307617MB)
   3.9790353630932604% used
To Space:
   capacity = 936902656 (893.5MB)
   used     = 0 (0.0MB)
   free     = 936902656 (893.5MB)
   0.0% used
PS Old Generation
   capacity = 5623513088 (5363.0MB)
   used     = 4640311792 (4425.346176147461MB)
   free     = 983201296 (937.6538238525391MB)
   82.51624419443336% used

这个现象可以已经执行过某些GC了,不是报错当时的jmap信息

使用Concurrent Mark-Sweep GC 看到的现象

待补充

解决办法

  • 修改逻辑将使用大对象的处理逻辑修改成不使用大对象的逻辑(个人感觉根治的办法)
  • 临时处理办法,增加heap的大小;因为电脑的内存实际有32G且仅使用一个服务;所以使用-Xmx16G增加了heap的大小
  • 执行完代码逻辑后执行Full GC(如何执行暂未尝试,待更新)
  • 尝试使用其他GC机制(Concurrent Mark-Sweep GC)
    开启方式 -XX:+UseConcMarkSweepGC

相关内容

如何手动执行Full GC
使用命令:jcmd 进程pid GC.run

  • 执行前现象:
root@xxxxx:~# jmap -heap 12090
Attaching to process ID 12090, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01

using thread-local object allocation.
Parallel GC with 13 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 8434745344 (8044.0MB)
   NewSize                  = 176160768 (168.0MB)
   MaxNewSize               = 2811232256 (2681.0MB)
   OldSize                  = 352321536 (336.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 2552758272 (2434.5MB)
   used     = 1785468960 (1702.7558898925781MB)
   free     = 767289312 (731.7441101074219MB)
   69.94273525950209% used
From Space:
   capacity = 132120576 (126.0MB)
   used     = 36294088 (34.61273956298828MB)
   free     = 95826488 (91.38726043701172MB)
   27.470428224593874% used
To Space:
   capacity = 126353408 (120.5MB)
   used     = 0 (0.0MB)
   free     = 126353408 (120.5MB)
   0.0% used
PS Old Generation
   capacity = 1842872320 (1757.5MB)
   used     = 1086944064 (1036.5906372070312MB)
   free     = 755928256 (720.9093627929688MB)
   58.980975090016% used

38675 interned Strings occupying 4184088 bytes
  • 执行命令:
root@xxxxx:~# jcmd 12090 GC.run
12090:
Command executed successfully
  • 执行后现象:
root@xxxxx:~# jmap -heap 12090
Attaching to process ID 12090, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01

using thread-local object allocation.
Parallel GC with 13 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 8434745344 (8044.0MB)
   NewSize                  = 176160768 (168.0MB)
   MaxNewSize               = 2811232256 (2681.0MB)
   OldSize                  = 352321536 (336.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 2552758272 (2434.5MB)
   used     = 18458080 (17.602996826171875MB)
   free     = 2534300192 (2416.897003173828MB)
   0.7230641538784914% used
From Space:
   capacity = 126353408 (120.5MB)
   used     = 0 (0.0MB)
   free     = 126353408 (120.5MB)
   0.0% used
To Space:
   capacity = 120061952 (114.5MB)
   used     = 0 (0.0MB)
   free     = 120061952 (114.5MB)
   0.0% used
PS Old Generation
   capacity = 1842872320 (1757.5MB)
   used     = 37773024 (36.023162841796875MB)
   free     = 1805099296 (1721.4768371582031MB)
   2.0496820962615576% used

38275 interned Strings occupying 4151424 bytes.

执行Full GC之后可以明显看出各个区的占用变小

问题

下列问题如果有清楚的大牛请在留言处给与讲解先谢过了
Full GC执行机制
Heap有默认上限?还是每个space有默认上限?默认上限如何计算出来的?
参见Java Doc的Default Heap Size讲解部分
此处说明heap是有上限的,物理内存小于192MB的时候,默认上限是物理内存的一半,当物理内存>=1G的时候,heap的上限是物理内存的1/4

多大的对象会被认为是大对象?
如何计算一个对象的大小?

java.lang.OutOfMemoryError: Java heap space JVM内存溢出(堆溢出) 我先演示一下jvm内存溢出错误。 package com.sk.jvm; import java.util.ArrayList; import java.util.List; public class Test003 { /** * 运行这段代码必须堆内存10m以上 * 因为for循环循环了10次,每次生成了1m堆内存大小 * * @param args */ p... 阅读详情

相关推荐

idea编译jdk8源代码出现Error:java: OutOfMemoryError: insufficient memory解决办法

idea编译jdk8源代码出现Error:java: OutOfMemoryError: insufficient memory解决办法

TrueDei 4562

Java heap error 解决

Java heap error 解决 首先说明,这个是Eclipse 的heap 内存问题原因。如下为Eclipse官方解释: 网址:http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F FAQ How do I increase the heap size available to Eclipse? Some JVMs put restrictions on the total amount

leonardorlq的博客 730

eclipse内存溢出报错:java.lang.OutOfMemoryError:Java heap space

今天运行了一个比较大的程序,处理的数据达到126MB数据,将数据导入数据库中,用eclipse 来访问时候,总是出现java.lang.OutOfMemoryError:Java heap space的错误,上网查了一些资料,原来是堆栈溢出的状况,eclipse默认的情况下,堆栈的空间应该是64MB, 所以有时候处理的数据的时候,容易出现堆栈溢出的情况,下面总结了几种方法,解决这个问题。

Sunshine 2954

堆(heap)系列_0x0A:3种方法一次性解决堆溢出问题

概述:本篇文章主要介绍堆问题中最常见的堆溢出问题的排查思路:常规思路 + 页堆思路 + 应用程序验证器思路 前提:可以看到懂得DPH(点击查看)和会使用应用程序验证器(点击查看)和WinDbg

可乐松子的博客 2834

手把手教你用DSP28335的PWM移相功能搞定双有源桥DAB(附完整代码)

本文详细解析了DSP28335的PWM移相功能在双有源桥DAB中的应用,包括ePWM模块的配置、移相时序原理及实战代码。通过精确的移相控制,实现DAB的高效运行和软开关,适用于车载充电机、储能系统等场景。附完整代码,助力开发者快速掌握硬件级移相技术。

weixin_30632089的博客 420

NUS-WIDE-10K数据集制作

NUS-WIDE是一个多标签数据集,数据集中一共包含26,9648个样本,可以分为81个类。最近在做跨模态检索项目,发现有很多论文里面都用到了NUS-WIDE-10K数据集,但是在网上也没有搜索到相关的数据集下载链接或者是数据集制作代码,所以自己动手写了一个NUS-WIDE-10K数据集的制作代码。 1.介绍 我在网上找到的最早关于NUS-WIDE-10K数据集描述的论文是:Cross-modal Retrieval with Correspondence Autoencoder。描述如下:作者选择了N

weixin_44012382的博客 4200

抛出java.lang.OutOfMemoryError: Java heap错误的解决方法

eclipse 有启动参数里设置jvm大小,因为eclipse运行时自己也需要jvm,所以eclipse.ini里设置的jvm大小不是具体某个程序运行时所用jvm的大小,这和具体程序运行的jvm大小无关。   那么怎么才能设置某个程序的jvm大小呢?(当然控制台运行的话不会存在这个问题,如:java -Xms256m -Xmx1024m classname,这样就可以把当前程序的jvm大小给设定

SabrinaLuZhang的专栏 611

《UDS协议从入门到精通》系列——图解0x85:控制DTC的设置

如何让ECU停止或恢复DTC状态位更新?有哪些注意点?图解+示例教你快速上手UDS 0x85服务!!

车载系统攻城狮 3861

eclipse java内存溢出_解决eclipse maven install 造成JVM 内存溢出(java.lang.OutOfMemoryError: Java heap space)...

maven install 报错信息:The system is out of resources.Consult the following stack trace for details.java.lang.OutOfMemoryError: Java heap spaceat java.util.HashMap.createEntry(HashMap.java:897)at java.uti...

weixin_42354972的博客 510

【Python机器学习】决策树与随机森林:解释性与鲁棒性的平衡

本文深入探讨了决策树和随机森林在解释性与鲁棒性之间的权衡。决策树以其完美的可解释性、快速的推理速度和无需特征标准化等优势,在许多场景中仍然是首选算法。一个经过合理剪枝的决策树,其每个决策路径都可以转化为业务规则,这在金融风控、医疗诊断等对透明度有严格要求的领域无可替代。然而,单棵决策树的高方差和容易过拟合的特性限制了其泛化能力。随机森林通过集成学习的思想,巧妙地解决了这个矛盾。它维持了相对较好的解释性(通过特征重要性、OOB估计等方式),同时通过多棵树的投票或平均,大幅降低了模型的方差。

nmdbbzcl的博客 626

基于STM32、HAL库的 CH9102X USB转UART收发器 驱动程序设计

/ 或 UART_HWCONTROL_RTS_CTS。// 其他函数实现类似,使用HAL_UART_Transmit_IT, HAL_UART_Receive_IT等。UART_TXD <---> USARTx_RX (STM32接收)UART_RXD <---> USARTx_TX (STM32发送)* @param huart: UART句柄指针。* @param huart: UART句柄指针。* @param huart: UART句柄指针。* @param huart: UART句柄指针。

corlin6688的博客 506

java.lang.OutOfMemoryError: Java heap space 内存溢出错误

KETTLE工具spoon执行操作(迁移)大数据量时报错:内存溢出错误 一、错误信息 java.lang.OutOfMemoryError: Java heap space kettle 二、处理方法 1、在KETTLE安装目录中找到spoon.bat程序,用记事本等程序打开,找到 if “%PENTAHO_DI_JAVA_OPTIONS%”"" set PENTAHO_DI_JAVA_OPTIONS="-Xmx512m" “-XX:MaxPermSize=256m” 部分,将其调整(一般调整为256的倍数

weixin_38919176的博客 437

redhawk:使用rh_setup.pl产生gsr模板

必须加的option工具会在rh_setup.pl给出提示,按照要求填写即可,另外工具会把所有填写的输入文件和信息放到rh_setup.init文件中,拷贝这个文件可在任何平级运行目录下,直接rh_setup.pl产生gsr以及run sta/dyn/em的脚本。rhsetup.pl -top top_cell_name -vdd_nets VDD 1.2 VDD2 1.2 -vss_nets VSS -frequency 100e6 (100m是默认值)更多学习内容请关注「拾陆楼」知识星球。

m0_61544122的博客 1053

tomcat内存溢出java.lang.OutOfMemoryError: Java heap space 的解决

最近在熟悉一个开发了有几年的项目,需要把数据库从mysql移植到oracle,首先把jdbc的连接指向mysql,打包放到tomcat里面,可以跑起来,没有问题,可是当把jdbc连接指向oracle的时候,tomcat就连续抛java.lang.OutOfMemoryError的错误,上网google了一下,了解了一下tomcat的运行机制,也解决了问题,share出来,以备查。 1、首先是

coney_12的专栏 625

PCL 利用RANSAC改进的ICP算法

本文介绍了一种基于RANSAC改进的ICP点云配准算法。算法原理部分阐述了在ICP迭代过程中使用RANSAC剔除错误匹配点对的方法。

点云侠的博客 195

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

内存溢出java.lang.OutOfMemoryError: Java heap space,分析排查步骤(超详细)

如果文件变更监听需要保留,但默认的 Spring Boot DevTools 监听机制占用过多资源,可以使用自定义的文件监听工具(如)替换。= null) {查看日志和堆转储文件定位占用内存的对象或线程。检查文件监听配置确保 DevTools 只监控必要的文件夹。优化 JVM 参数增加堆内存,适应实际需要。工具分析内存泄漏使用 MAT 或 VisualVM 检查是否存在未释放的对象引用。优化后可以显著改善内存溢出的问题,同时提升应用的稳定性和性能。

qq_42631788的博客 3817

pscad IEEE标准系统搭建说明

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

JMeter内存溢出:java.lang.OutOfMemoryError: Java heap space解决方法

一、问题原因 用JMeter压测,有时候当模拟并发请求较大或者脚本运行时间较长时,JMeter会停止,报OOM(内存溢出)错误。 原因是JMeter是一个纯Java开发的工具,内存由java虚拟机JVM管理,当内存回收不及时,堆内存不足时,就会报内存溢错误。 概念补充: 内存泄露:应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源。 内存溢出:应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致崩溃。 通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出

xiaona0523的专栏 8701

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

JVM内存溢出分析java.lang.OutOfMemoryError: Java heap space

JVM内存溢出查询java.lang.OutOfMemoryError: Java heap space查出具体原因分为几个预备步骤 1、在运行java程序是必须设置jvm   -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump_OOME.hprof 当内存溢出时 会输出在/tmp/dump_OOME.hprof...

weixin_30410119的博客 1134

java.lang.OutOfMemoryError: Java heap space内存溢出问题解决实战

     Tomcat提示错误为:java.lang.OutOfMemoryError: Java heap space,出现这个问题时从表面来看是属于内存溢出,去到现场环境时CPU的使用率为99%,内存容量还剩三分之一(8G内存的PC),初始想法是tomcat给JVM的内存空间分配少了,打开catalina.bat文件,发现分配的内存空间为1G,应该也不算小,后询问开发人员,提到此内存溢出的情况...

RobinsStruggle的博客 1万+

[问题解决]springboot项目上传文件出现内存溢出java.lang.OutOfMemoryError: Java heap space

java程序上传文件出现内存溢出的解决方式

YiQieFuCong的博客 1万+

内存溢出 ava.lang.OutOfMemoryError: Java heap space

有三种可能导致OutOfMemoryError。首先是,此JVM有真实的内存泄漏,导致此JVM堆在内部实现时产生了一个Bug。这极不可靠。所有JVM都经过充分的测试,并且,如果有人发现这种bug,它将绝对是最高的优先级。因此你可以非常宽心地排除这种可能性。   第二种可能的OutOfMemoryError原因只不过是,你没有为你的应用程序运行时给予足够多的可用内存。这种情况,有两种可能的方案,

renkui的专栏 869

java.lang.OutOfMemoryError: Java heap space 内存溢出问题排查

最近一直排查系统中的内存溢出问题。 不管是用jmap指令还是用比较直观的jvisualvm工具。都可以看到堆内存中各个对象的数量以及占用的内存大小。 一般只要找到有大量的自定义对象一直无法释放,那么距离定位到问题就不远了。 来看一个例子吧: 就像图里看到的这样 一般都是这些对象数量巨大内存大部分也都是他们占用的。 今天明确了一个问题,这里统计的String对象指所有的String对象...

天天的专栏 1万+

KETTLE在执行中出现 java.lang.OutOfMemoryError: Java heap space 内存溢出错误

最近在通过KETTLE调试生成报表数据的时候,当抽取大数据量表数据时,发现执行报错,查看KETTLE执行过程的日志记录,主要错误信息如下: java.lang.OutOfMemoryError: Java heap space kettle一、错误信息 java.lang.OutOfMemoryError: Java heap space kettle二、处理方法 1、在KETTLE安装目录中找到spoon.bat程序,用记事本等程序打开,找到 if "%PENTAHO_DI_JAVA_OPTIONS%"=

LOVE_Me__的博客 3379

IDEA 启动项目时报错 java.lang.OutOfMemoryError: Java heap space 内存溢出!

起初是电脑重装系统之后,安装IDEA发现之前的项目启动不起来了,报错java.lang.OutOfMemoryError: Java heap space 内存溢出。 以下是解决方法: 1.依次点击 File --> Settings --> Build,Execution,Deployment --> Compiler 将 Shared build process heapsize (Mbytes): 参数由700设置为1400 即可。 APPLY --> OK 项目是启动起来

职业秃头程序猿 1万+
下一篇: memcache入门
owisho_java
博客等级 码龄14年 0粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值