小弟最近在搞一个JavaSwing的项目,程序运行久了,内存使用也越来愈高,从开始的200M一直飙到1G多。小弟甚为不解!JVM的GC到底有没有起作用,程序里我已经把不需要的对象滞空了,而且也监控到程序运行时GC的调用频率还是蛮高的,可是就是内存下不去求高手指教

解决方案 »

  1.   

    有些资源存在引用,无法释放吧
    对象在不用的时候,设为null,各种对象的应用也设置为null,对于各种资源的操作,如流,记得要关闭
      

  2.   

    用windows的任务管理器查看内存是一直往上飙的,可是用eclipse自带的JConsole监视堆内存的使用情况是有高有下的,最多不超过100M,这到底哪个准?
      

  3.   

    没用的对象我都null了,没用到文件流啊。
      

  4.   

    你用什么监控的内存,如果只是用自带的,比如windows的任务管理器,Linux的top命令,
    你看到的内存肯定是一直涨的,因为GC在内存不够的时候会继续申请内存,就算GC完了,你用这两个工具看到的内存还是扩大以后的,虽然有很多并没有用到
    要看实际用到的内存需要用System的totalMemory()-freeMemory(),
    这个才是当前用到的内存,
    好像有个参数可以设置在多少比例内存没有被使用的时候把内存归还给系统,
    我没用过,你可以google下
    不过看你说的,内存很高的时候GC都还是很频繁,那多半是有内存泄漏
    并不是没用的对象赋值null就能解决的,
    很肯能是有存活的对象引用到了没用的对象
    一样会造成没有释放掉,
    具体你可以dump下来用工具查一下就知道了
      

  5.   

    这个freeMemory()在每次调用一次GC之后就会变大
    中间的这个值是freeMemory()的变化
      

  6.   

    再看一下JConsole监视对内存的情况
    每次遇到峰值就会调用GC,然后就会下来。