一、报错信息
运行 从 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 ;
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)
找到内存泄漏的 对象后 , 针对没有回收的对象进行修复 , 及时清理不再使用的 数组 / 集合 / 数据对象 等占用大量内存的对象 ;