问题描述:
我们的程序是建立在JBOSS应用服务器上的,服务端的堆内存最大为1GB。在服务端启动后,观察服务端JAVA进程占用了300多MB物理内存,然后执行一个批量导入程序,从excel文件中导入65000条数据到数据库中,服务端物理内存占用升到600多MB左右。后面频繁导入相同数量的数据多次,物理内存(包含了堆内存在内,是java进程一共占用的)一直维持在600-800多MB。后面不做任何操作经过10个小时左右,物理内存一直都在600MB左右。GC并没有释放掉不用堆内存,所以怀疑内存泄漏。但是我将服务端的堆内存改为最大350MB,然后启动服务端,并且执行如上导入操作多次,观察堆内存一直维持在340MB左右。例如某次导入完成后堆内存已经340MB了,后面在导入65000条数据,堆内存还是在340MB左右,整个服务端java进程也就450MB左右,只不过GC被频繁调用回收内存。感觉又不像是发生内存泄漏,否则泄漏的内存会不断增加而导致OutOfMemory。结合上述情况,请问各位高手看看是否导入操作发生了内存泄漏???为什么第一次导入操作会使得JAVA进程占用很多物理内存,看了代码不可能申请那么多内存的啊,后面也不释放?
我们的程序是建立在JBOSS应用服务器上的,服务端的堆内存最大为1GB。在服务端启动后,观察服务端JAVA进程占用了300多MB物理内存,然后执行一个批量导入程序,从excel文件中导入65000条数据到数据库中,服务端物理内存占用升到600多MB左右。后面频繁导入相同数量的数据多次,物理内存(包含了堆内存在内,是java进程一共占用的)一直维持在600-800多MB。后面不做任何操作经过10个小时左右,物理内存一直都在600MB左右。GC并没有释放掉不用堆内存,所以怀疑内存泄漏。但是我将服务端的堆内存改为最大350MB,然后启动服务端,并且执行如上导入操作多次,观察堆内存一直维持在340MB左右。例如某次导入完成后堆内存已经340MB了,后面在导入65000条数据,堆内存还是在340MB左右,整个服务端java进程也就450MB左右,只不过GC被频繁调用回收内存。感觉又不像是发生内存泄漏,否则泄漏的内存会不断增加而导致OutOfMemory。结合上述情况,请问各位高手看看是否导入操作发生了内存泄漏???为什么第一次导入操作会使得JAVA进程占用很多物理内存,看了代码不可能申请那么多内存的啊,后面也不释放?
我也在客户端遇上了这类问题
java和Excel(大小400K左右)交互复制粘贴的时候,每次内存涨2M,复制几回后内存就溢出了
但是通过jxl导入不会溢出
对于Java内存自动回收,用单个文件测试,确实到系统退出就全释放了
但是在实际项目中测试,测试环境IE+Swing,最多也只能释放75%多点
导致系统运行越来越慢
在网上苦寻良方,都是照着教科书乱说的
我通过txt复制也是一样的
逐行代码调试发现是Java操作系统粘贴板发生内存狂涨
但是如果数据量较少的时候没有这种情况
解决办法是写个线程,让数据库操作在后台处理,并且定期sleep,就好了
不知道你这个有没涉及到数据库~~~~