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

news2024/11/17 23:50:21

这里写目录标题

  • 问题场景
  • 问题分析与解决
    • 1.优化项目代码
    • 2.提升Java heap size
    • 3.JVM参数配置
      • 配置参考
      • 堆区参数配置说明
      • 非堆区参数配置说明

问题场景

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

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.优化项目代码

根据报错信息定位到内存消耗较大的代码,然后对其进行重构或者优化算法。如果是在生产环境,务必要在内存消耗过大的代码出增加日志信息输出,否则容易像我定位一晚上才找到问题所在
在这里插入图片描述

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空间)

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

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

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

非堆区参数配置说明

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/592489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4蓝图学习篇(九)-- 人物重定向

在平常的游戏制作或者项目练习过程中&#xff0c;我们想使用其他比较好看的模型&#xff0c;但是却想使用小白人的动画&#xff0c;这个时候要怎么去处理呢&#xff1f; 这个时候就需要使用到重定向功能&#xff0c;让两者使用同一套骨骼&#xff0c;把小白人动画重定向到我们…

IMX6ULL裸机篇之I2C相关寄存器与AP3216C传感器

一. I2C实验 I2C时钟选择与传输速率 1. IMX6ULL的 I2C频率标准模式 100kbit/S&#xff0c;快速模式为 400Kbit/S 2. 时钟源选择 perclk_clk_rootipg_clk_root66MHz&#xff08;由之前的时钟实验章节可以知道是 66MHz&#xff09;。 二. I2C 寄存器配置 I2Cx_IFDR寄存器&…

常见的内存泄漏场景

console导致 console导致的内存泄漏 因为打印后的对象需要支持在控制台上查看&#xff0c;所以传递给console.log方法的对象是不能被垃圾回收的。我们需要避免在生产环境用console打印对象。 定时器 在组件初始化的时候设置了setInterval&#xff0c;那么在组件销毁之前记得…

张驰课堂:深入了解六西格玛绿带培训课程大纲的应用价值!

六西格玛绿带培训课程大纲的内容通常包括以下几个方面&#xff1a; 六西格玛介绍&#xff1a;介绍六西格玛的历史、目标和应用领域&#xff0c;以及其在质量管理中的作用。 统计学基础&#xff1a;介绍基本的统计概念和方法&#xff0c;包括描述统计、概率分布、抽样和检验等…

SpringBoot定义优雅全局统一Restful API 响应框架五

闲话不多说&#xff0c;继续优化 全局统一Restful API 响应框架 做到项目通用 接口可扩展。 如果没有看前面几篇文章请先看前面几篇 SpringBoot定义优雅全局统一Restful API 响应框架 SpringBoot定义优雅全局统一Restful API 响应框架二 SpringBoot定义优雅全局统一Restful…

开发微信小程序,常用的开发组件有哪些?

随着微信小程序开发的持续升温&#xff0c;小程序开发也变得越来越流行&#xff0c;因为小程序不仅能帮助企业解决推广的问题&#xff0c;还能为企业带来可观的收益。但是很多企业并不知道如何开发微信小程序&#xff0c;而市面上的开发组件又有很多种&#xff0c;不知道怎么选…

restful相关知识

一. 接口编程简介 1 背景 ​ 随着互联网的发展, 尤其是移动互联为代表的Web3.0时代. 客户端层出不穷, 以APP、微信、PC浏览器为代表, 服务端业务逻辑是基本一致的. ​ 那么有没有一种方式可以做到”一次编写,随时接入”呢? 目前比较流行的方案就是"接口编程" 2 …

DevOps - (3)使用SOPS 和Terraform来加密/解密敏感信息文件

一&#xff1a;背景 每个人都想将自己的敏感数据以加密格式存储在一个安全的地方。例如我们的数据库的账号密码&#xff0c;不能以纯文本的方式来记录。让我们利用Mozilla SOPS以一种安全的方式实现它。SOPS支持将文件加密为二进制文件&#xff0c;除此之外&#xff0c;它还具…

尘埃粒子计数器 审计追踪 权限管理 洁净室等级确认干货分享

尘埃粒子计数器实用干货汇总 随着我国医药行业的不断发展&#xff0c;越来越多的医药企业需要应用洁净技术以达到控制实验室安全卫生的目的。在医药、电子、机械微生物等行业中&#xff0c;需要严格把关空间的洁净度以符合相关的标准和产品的质量。其中包括对各种洁净等级的工作…

Qt 助手简介

在探讨Qt帮助框架之前&#xff0c;我们先了解一下Qt帮助文档&#xff0c;可以让大家更好的理解。 当你使用Qt时&#xff0c;你可能会发现Qt帮助文档是一个非常有用的资源。Qt帮助文档提供了关于Qt框架和其各种组件的详细信息&#xff0c;包括类和函数的文档、示例代码和教程等…

抖音seo系统源码*SaaS+部署搭建(开源)

抖音seo源码&#xff0c;抖音seo系统源码&#xff0c;抖音seo系统搭建&#xff0c;部署 抖音作为一个全球性的短视频平台&#xff0c;用户数量已经超过了10亿。这也给企业带来了巨大的发展机遇。为了吸引更多的用户&#xff0c;企业可以通过抖音seo源码来提高自己的搜索引擎排…

有没有什么好的C++项目推荐?

据我粗略估计&#xff0c;问我“有没有什么好的C项目推荐“这个问题出现的频率仅次于“问我帅不帅“。 「C」是一门贴近底层的语言&#xff0c;不像「Java」那样能够快速搭建一个业务系统&#xff0c;比如「XX」秒杀系统、「XX」电商系统这种看着“高大上“的项目&#xff0c;「…

python按行写入json文件,每一行都是一个标准json对象,但是整体文件却非json对象

今天这篇文章主要是一个小小的偏向于应用的实践&#xff0c;为啥会写这个&#xff0c;还要回溯到2017年&#xff0c;那时候做项目的时候有一个是要做数据处理分析的工作&#xff0c;给到我的数据集我拿到的时候总觉得怪怪的&#xff0c;每一行都是一个字典对象&#xff0c;但是…

聊聊部署在K8S的项目如何获取客户端真实IP

前言 最近部门有个需求&#xff0c;需要对一些客户端IP做白名单&#xff0c;在白名单范围内&#xff0c;才能做一些业务操作。按我们的部门的一贯做法&#xff0c;我们会封装一个client包&#xff0c;提供给业务方使用。&#xff08;注&#xff1a; 我们的项目是运行在K8S上&a…

LAMP的实战应用之部署wordpress论坛,并实现正常访问登录论坛

目录 环境配置&#xff1a; 一、安装配置基础环境 步骤一&#xff1a;配置本地yun 步骤二&#xff1a;安装Remi 仓库配置包&#xff08;清华源获取&#xff09; 步骤三&#xff1a;配置Remi 仓库配置包 步骤四&#xff1a;安装php的加速器配置 步骤五&#xff1a;启动服…

Cesium实战 - 实现大气云层效果

Cesium实战 - 实现大气云层效果 Cesium 实现大气云层效果主要思路核心代码在线示例 Cesium 实现大气云层效果 在实际开发中&#xff0c;一般会有天气的效果&#xff0c;雨雪雾比较常见&#xff0c;相关的博客也很多&#xff0c;但是关于云层的天气效果还是比较少&#xff0c;而…

【调峰】储能辅助电力系统调峰的容量需求研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

经典神经网络(6)ResNet及其在Fashion-MNIST数据集上的应用

经典神经网络(6)ResNet及其在Fashion-MNIST数据集上的应用 1 ResNet的简述 ResNet 提出了一种残差学习框架来解决网络退化问题&#xff0c;从而训练更深的网络。这种框架可以结合已有的各种网络结构&#xff0c;充分发挥二者的优势。 ResNet以三种方式挑战了传统的神经网络架…

【LeetCode】342. 4的幂

342. 4的幂&#xff08;简单&#xff09; 方法一&#xff1a;二进制 思路 首先考虑一个数字是不是 2 的整数次方&#xff1a;如果一个数字 n 是 2 的整数次方&#xff0c;那么它的二进制一定是 0...010...0 这样的形式&#xff0c;将它和 -n 按位与的结果一定是它本身。如果 …

前沿质谱应用沙龙分享会暨苏州百趣落成仪式即将开幕!

质谱作为一项医学检验新技术&#xff0c;凭借高特异性、高灵敏度、多指标检测等优势&#xff0c;成为了体外诊断领域最富生命力的新技术之一。目前质谱技术能够准确的测定多种生物小分子代谢物&#xff0c;且质谱在大分子物质例如蛋白质方面也应用的非常广泛。目前&#xff0c;…