javaSWing程序命令行和IDE运行没有问题,打包成jar后直接双击运行部分功能不行

编写的javaSWing程序打包成可运行的jar后通过命令行java -jar  xx.jar运行没有问题(在IDE中运行也没有问题),但是直接双击运行在进行其中的一步操作(图像校正)的时候没有任何反应,由于是直接双击的xx.jar运行的,也就无法看到程序是否抛出了异常(通过命令行运行如果有异常可以看到,但是通过命令行运行的时候没有问题)。在网上也搜了不少,有人遇到过同样的问题,但是没有人给出正确的解释,于是就按照网上的方法写了一个.bat批处理脚本,脚本还是运行java-jar xx.jar 只是将控制台隐藏起来了,但是在启动程序的时候控制台的黑窗口还是会一闪而过,感觉很挫。。。。好长一段时间由于忙于项目开发没有管它,到了后面要将程序发布成安装包,于是决定静下心来解决这个问题。

首先分析了一下:直接双击运行的时候在点击“校正”按钮的时候看不到任何反应,而通过命令行运行图像会更换为校正后的图,而且鼠标的形状也会变化(这是代码里加的功能)。也就是定位到问题就在这个按钮的响应部分。由于直接双击运行看不到任何的输出信息,于是先到在代码里面加上写文件输出,想到的最简单的方法就是在每句代码的前面加上一个写文件输出,比如输出此代码所在的行。然后双击运行,查看输出文件执行到了哪里出的问题,通过这个方法定位到了按钮事件响应中的一个函数有问题(remove.start()),在这个函数里面用同样的方法,定位到是这个函数里调用的一个库函数里的问题,通过这样一步一步的深入最终发现是库函数中一个转换图像格式的函数(ConvertBufferedImage.convertFromMulti())的问题,于是进入到这个函数里面,这个函数会新创建一个跟输入图像同样大小的对象用于保存转换后的数据,而最终定位到出错的地方居然是这个函数中通过new MultiSpectral()去创建这个对象的时候。感觉到很奇怪的同时又仔细想了想:输入图像是5184x3456分辨率的彩色图,转换前图像的格式是ImageFloat32格式的,也就是说图像的rgb值都是32loat型的值,于是算了一下这个图像是3通道的彩色图,数据量相当于是5184x3456x3的矩阵,每个数据是32float型的,所以每个float4个字节,也就是说这个对象至少占用了5184x3456x3x4个字节 = 209952KB = 205MB

 

到这里,于是怀疑是不是分配的内存不足导致通过new在堆上申请内存失败导致的,为了验证猜想,用了一个分辨率比较小的图片(640x480)进行操作,这个时候发现没有问题,总算是找到问题的原因了。最后又仔细想了下,为什么通过命令行运行的时候没有问题呢?我想原因应该是:命令行和直接双击运行时java虚拟机默认分配的堆的可用大小是不一样的。java虚拟机默认分配的最大堆内存为物理内存的1/4,我的机器物理内存为32G,默认分配的最大堆为8G,这应该是通过命令行运行时的最大可用的堆大小,所以通过命令行运行的时候没有问题。直接双击运行swing程序,默认是使用javaw,默认分配的最大堆内存是多少没有找到相关的说明,怀疑应该不是很大。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值