分析和解决java.lang.OutOfMemoryError: Java heap space问题

这篇具有很好参考价值的文章主要介绍了分析和解决java.lang.OutOfMemoryError: Java heap space问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题场景

最近客户反馈在生产环境导入操作时遇到任务一直执行中,并且入库的数据量一直不改变。通过日志查询,终于定位到报错信息如下:

java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Unknown Source) ~[na:1.8.0_221]
	at java.io.ByteArrayOutputStream.grow(Unknown Source) ~[na:1.8.0_221]
	at java.io.ByteArrayOutputStream.ensureCapacity(Unknown Source) ~[na:1.8.0_221]
	at java.io.ByteArrayOutputStream.write(Unknown Source) ~[na:1.8.0_221]
	at com.cxstar.common.utils.DESUtil.decryptFile(DESUtil.java:193) ~[cxstar-common-1.0.0.jar!/:1.0.0]
	at com.cxstar.business.service.impl.ArchiveServiceImpl.upload(ArchiveServiceImpl.java:103) ~[cxstar-business-1.0.0.jar!/:1.0.0]
	at com.cxstar.business.factory.AsyncFactory.importAttachment(AsyncFactory.java:1016) ~[cxstar-business-1.0.0.jar!/:1.0.0]
	at com.cxstar.business.factory.AsyncFactory.access$800(AsyncFactory.java:62) ~[cxstar-business-1.0.0.jar!/:1.0.0]
	at com.cxstar.business.factory.AsyncFactory$7.run(AsyncFactory.java:708) ~[cxstar-business-1.0.0.jar!/:1.0.0]
	at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[na:1.8.0_221]
	at java.util.concurrent.FutureTask.run(Unknown Source) ~[na:1.8.0_221]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source) ~[na:1.8.0_221]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) ~[na:1.8.0_221]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_221]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_221]
	at java.lang.Thread.run(Unknown Source) [na:1.8.0_221]

问题分析与解决

java.lang.OutOfMemoryError: Java heap space (JVM 堆空间溢出)简单来说就是在创建新的对象时, 堆内存中的空间不足以存放新创建的对象,导致此种问题的发生。

1.优化项目代码

根据报错信息定位到内存消耗较大的代码,然后对其进行重构或者优化算法。如果是在生产环境,务必要在内存消耗过大的代码出增加日志信息输出,否则容易像我定位一晚上才找到问题所在
分析和解决java.lang.OutOfMemoryError: Java heap space问题,jvm,java,jvm,开发语言,优化,内存

2.提升Java heap size

增加堆内存空间设置,此种方式容易操作。可以较快解决当前问题,但是总体来说还是需要找到项目代码中的问题才是最优解,毕竟内存总是有限的

客户生产环境的服务器是8g内存,并且操作系统是比较老的windows server 2008服务器。在部署项目时使用winsw工具将jar包安装为服务。因此在项目启动时,增加内存参数,修改后配置如下:

<service>
    <id>app-id</id>
    <name>app-name service</name>
    <description>application descriptions</description>

	<!-- 配置的启动:使用jar -jar方式运行项目 -->
    <executable>java</executable>
    <arguments>-jar -server -Xms4096m -Xmx4096m -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m  "D:\application\api-rest-1.0.0.jar"</arguments>

    <startmode>Automatic</startmode>
    <logpath>%BASE%\logs</logpath>
    <logmode>rotate</logmode>
</service>

3.JVM参数配置

配置参考

服务器内存8G ,所以可以采取以下配置:
set JAVA_OPTS=-server -Xms4096m -Xmx4096m -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m

服务器内存4G ,所以可以采取以下配置:
set JAVA_OPTS=-server -Xms2048m -Xmx2048m -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m

服务器内存2G ,所以可以采取以下配置:
set JAVA_OPTS=-server -Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m

服务器内存1G ,所以可以采取以下配置:
set JAVA_OPTS=-server -Xms512m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M -XX:MaxPermSize=256m

服务器内存512M ,所以可以采取以下配置:
set JAVA_OPTS=-server -Xms256m -Xmx256m -XX:PermSize=256M -XX:MaxNewSize=128m -XX:MaxPermSize=128m

堆区参数配置说明

堆区:通过new的方式创建的对象(一个类的实例)、数组所占的空间。所有的线程共享该区域
堆区还细分为新生代(Eden空间、From Survivor空间、To Survivor空间)、老年代(Tenured Generation空间)

参数名 含义
-Xms java虚拟机初始化时的最小内存
-Xmx java虚拟机可使用的最大内存

通常会将-Xms 与-Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源

参数名 含义
-XX:newSize 表示对象创建初始内存的大小,应小于-Xms的值
-XX:MaxnewSize 表示对象创建可被分配的内存的最大上限,应小于-Xmx的值
-Xmn jdk1.4后对-XX:newSize、-XX:MaxnewSize两个参数同时进行配置

非堆区参数配置说明

非堆区:代码、常量、外部访问(比如流在传输数据时所占用的资源)等,java垃圾回收机制只作用于堆区,非堆区不会被java垃圾回收机制进行处理

参数名 含义
-XX:PermSize 表示非堆区初始内存分配大小(方法区)
-XX:MaxPermSize 表示对非堆区分配的内存的最大上限(方法区)

在配置之前一定要慎重的考虑一下自身软件所需要的非堆区内存大小,因为此处内存是不会被java垃圾回收机制进行处理的地方。并且更加要注意的是最大堆内存与最大非堆内存的和绝对不能够超出操作系统的可用内存。文章来源地址https://www.toymoban.com/news/detail-743736.html

到了这里,关于分析和解决java.lang.OutOfMemoryError: Java heap space问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • kafka消费报错卡死:内存溢出OutOfMemoryError: Java heap space

    我们信控平台使用 Java 语言开发, Spring Cloud 微服务架构,采用容器化部署,所有服务都部署在 docker 里面,使用 docker-compose 进行管理,使用 portainer 进行监控 平台部署客户现场后,一切功能正常,客户已经使用三个月左右。最后一次更新时一个月前,代码版本也比较新 客户

    2024年02月15日
    浏览(12)
  • java.lang.OutOfMemoryError: GC overhead limit exceeded问题分析及解决

    java.lang.OutOfMemoryError: GC overhead limit exceeded问题分析及解决

    出现该问题的原因:当GC为释放很小空间占用大量时间时会抛出此异常,即(Sun 官方对此的定义,超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常)。一般是因为堆太小,导致异常的原因:没有足够的内存。 对于该项目我的启动命令如下:堆内存空间开辟的

    2024年01月21日
    浏览(22)
  • Java Heap Space问题解析与解决方案(InsCode AI 创作助手)

    Heap Space问题是Java开发中常见的内存溢出问题之一,我们需要理解其原因和表现形式,然后通过优化代码、增加JVM内存和使用垃圾回收机制等方法来解决。 一、常见报错 二、Heap Space问题的原因 对象创建过多:如果程序中创建了大量的对象,而这些对象又不能被垃圾回收机制

    2024年02月03日
    浏览(10)
  • java heap space解决方法

    在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError: Java heap space。 所以产生这个异样的原因通常有两种: 1.程序中出现了死循环 2.程序占用内存太多,超过了JVM堆设置的最大值。 对于第一种情况,需要自己查看程

    2024年02月07日
    浏览(13)
  • JAVA HEAP SPACE解决方法和JVM参数设置

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

    2024年02月06日
    浏览(12)
  • java.lang.OutOfMemoryError- unable to create new native thread 问题排查

    java.lang.OutOfMemoryError- unable to create new native thread 问题排查

    最近连续两天大约凌晨3点,线上服务开始异常,出现OOM报错。且服务所在的物理机只能ping通,但是无法登录。报错信息如下: 根据日志OOM报错,怀疑是内存不足或内存泄露的原因,需要查看内存的使用情况。考虑到 JConsole 或 VisualVM 具有可视化界面,能看出历史变化趋势,

    2023年04月13日
    浏览(17)
  • 解决Error:java: java.lang.OutOfMemoryError: WrappedJavaFileObject...GC overhead limit exceeded的错误

    解决Error:java: java.lang.OutOfMemoryError: WrappedJavaFileObject...GC overhead limit exceeded的错误

    今天在启动项目时,报出如下错误: 即 Error:java: java.lang.OutOfMemoryError: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:xxx.java]]@pos242:@pos242: GC overhead limit exceeded 将错误 Error:java: java.lang.OutOfMemoryError: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:xxx.java]]@pos242:@pos242: GC

    2024年02月04日
    浏览(11)
  • IDEA 编译项目时报错:java: java.lang.OutOfMemoryError:GC overhead limit exceeded解决方法

    IDEA 编译项目时报错:java: java.lang.OutOfMemoryError:GC overhead limit exceeded解决方法

    在Intellij IDEA下编译Java项目,报错:java.lang.OutOfMemoryError: …(此处忽略) GC overhead limit exceeded 错误是发生在编译阶段,而不是运行阶段。通过查询相关资料发现, 1.idea编译Java项目使用的虚拟机和idea软件自身使用的虚拟机是分开的(也就是独立的进程) 2.只需要给编译器使用的

    2024年02月05日
    浏览(15)
  • 【IDEA启动项目报错java: java.lang.OutOfMemoryError: GC overhead limit exceeded解决方案】

    【IDEA启动项目报错java: java.lang.OutOfMemoryError: GC overhead limit exceeded解决方案】

    使用IDEA启动Spring Boot项目时,报内存溢出错误,导致服务启动失败: Error:java: java.lang.OutOfMemoryError: GC overhead limit exceeded 报此错说明启动期间内存不够用了,把idea的启动进程堆内存值设大点就行了。 设置窗口:Settings —Build,Execution,Deployment— Complier 把 build process heap size 值改

    2024年02月02日
    浏览(27)
  • Java内存溢出(outofmemory:Java heap space)更改堆大小

    Java内存溢出(outofmemory:Java heap space)更改堆大小

    在跑一个项目的时候需要构建大量对象,导致出现内存溢出错误。去网上查需要修改堆大小,于是按照网上80%的方法修改了配置,结果依然内存溢出。于是,开启了半天的刨根问底之旅。 首先是按照网上说的方法,打开idea在上方找到help,然后点击edit custom vm options, 然后就

    2024年02月12日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包