【错误记录】运行 Java 程序报错 ( Exception in thread “Image Fetch“ java.lang.OutOfMemoryError: Java heap space )

2024-04-20 08:40:20 浏览数 (2)

一、报错信息

运行 从 Intellij IDEA 中导出的程序 , 报如下错误 :

代码语言:javascript复制
D:map_zkhw>java -jar TrunkScheduling.main.jar
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
        at java.awt.image.DataBufferInt.<init>(Unknown Source)
        at java.awt.image.Raster.createPackedRaster(Unknown Source)
        at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
        at sun.awt.image.ImageRepresentation.createBufferedImage(Unknown Source)
        at sun.awt.image.ImageRepresentation.setPixels(Unknown Source)
        at sun.awt.image.ImageDecoder.setPixels(Unknown Source)
        at sun.awt.image.JPEGImageDecoder.sendPixels(Unknown Source)
        at sun.awt.image.JPEGImageDecoder.readImage(Native Method)
        at sun.awt.image.JPEGImageDecoder.produceImage(Unknown Source)
        at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
        at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
        at sun.awt.image.ImageFetcher.run(Unknown Source)

二、错误分析

出现

代码语言:javascript复制
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space

错误 , 就意味着 Java 虚拟机 的堆内存区域不足 , 突然加载一张大图片 , 无法为 图片对象 在堆内存中分配内存空间 , 此时就会抛出 " Java heap space " 这个错误 ;

我加载的是一张 50M 左右的 地图图片 , 图片很大 ;

如果 在 程序中存在内存泄漏 , 一些大的数组 / 集合 / 数据对象 始终没有释放 , 会在运行的过程中 , 报该错误 ;

三、解决方案 - 针对内存不足问题

针对内存不足的问题 , 直接通过增加堆内存大小的方式解决 , 调整 Java 虚拟机 的 启动参数 增加堆内存的大小 ;

  • -Xms<size> 参数 可以设置 Java 虚拟机 起始堆大小 ;
  • -Xmx<size> 参数 可以设置 Java 虚拟机 最大堆大小 ;

下面的命令中 , 运行 jar 包 , 在命令中添加了 -Xms512m 参数 , 设置 JVM 起始堆大小 512M , 通过 -Xmx1024m 参数 设置最大堆大小 1024M ;

代码语言:javascript复制
java -Xms512m -Xmx1024m -jar jar包名称

如果内存还是不足 , 则将最大堆设置为 2048M ;

代码语言:javascript复制
java -Xms512m -Xmx2048m -jar jar包名称

四、解决方案 - 针对内存泄漏

如果 是由于 内存泄漏 导致的 在运行过程中 报出

代码语言:javascript复制
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space

错误 , 就需要检查代码中 的 内存泄漏 点 , 找出 哪些对象未能及时释放 , 或者无效的对象保留太久导致的内存堆积 ;

使用 如下 内存分析工具 , 查找内存泄漏 :

  • VisualVM
  • JProfiler
  • Eclipse Memory Analyzer (MAT)

找到内存泄漏的 对象后 , 针对没有回收的对象进行修复 , 及时清理不再使用的 数组 / 集合 / 数据对象 等占用大量内存的对象 ;

0 人点赞