临时变量也要设成null?方法执行完了变量不就也被回收吗?

解决方案 »

  1.   

    启动参数-verbose:gc怎么使用?输出到哪里去了?
      

  2.   

    你需要更大的jvm内存启动参数
      

  3.   

    用C/C++。手动控制内存释放的。Java GC的机制必然不能让你手动控制。就算=null之后,GC也不是立刻就回收这个内存的。
      

  4.   

    对于Java的GC,有句话是这么说的,你可以手动调用gc函数,但是Java体系不保证gc立即执行.
      

  5.   

    对于java的回收机制,正如这位兄弟说的,所以我建议你,在操作完对象时,便设置为null,等待垃圾回收。当gc启动时,他会再第一时间找到没有被引用的对象,进行垃圾回收处理。
      

  6.   

    我发现对于Full GC (System.gc())。输出信息表明Full GC (System.gc())运行了,但是没有什么作用。待很长时间后,占用内存突然减小很大。为什么?是否说明,Full回收并不彻底?而另一种回收起了这个作用?
      

  7.   

    还发现把类中的静态的指向对象的变量设置为null,然后运行System.gc(),与不设置为null相比没有任何效果。
      

  8.   

    手动回收应该是做不到,不过楼主可以让继承WeakReference,在垃圾收集器工作时会被回收。
      

  9.   

    Full GC才是真正回收,仔细看一下所有Full GC信息,后面有内存大小的描述。
      

  10.   

    Full GC才是真正回收,仔细看一下所有Full GC信息,后面有内存大小的描述。
    输出信息:
    464.129: [Full GC (System.gc())  12511K->8380K(21296K), 0.0511006 secs]
    但是通过操作系统的任务管理器查看软件占用内存50M多。是不是这样的:这个回收并没有还给操作系统,而是仍然属于虚拟机。由于软件流程比较多,软件的内存占用就比较大,怎样才能让虚拟机不占有那么多内存,还给操作系统?测试表明启动参数-Xms30m没有效果。
      

  11.   

    这个方法不太好吧。如果上限真的有作用,那还麻烦了。————————————————————————————————————
    以官方软件netbeans 7.x为例。我打开1个项目,运行一下,内存占用150M。再打开5个项目,每个都运行一下,内存占用达到300M。把5个项目关闭,内存占用并不会回落到150M左右,用2个小时的时间也不会。
    这种虚拟机对操作系统申请内存的“只要不还”的问题怎么解决?
    我们经常讨论垃圾回收如何如何,网上也很多这种网文,都是说如何回收重用而不是再向操作系统申请新的空间。但是回收之后不还给操作系统,这不能不说是个问题吧。
      

  12.   

    我不是很懂,瞎猜一下吧:
    JVM这样管理内存是为了快,下一次再申请内存的时候不必通过操作系统,直接在JVM内部把内存分配给Java程序,省去了一次用户和内核空间切换的时间-Xmx 的意思就是说你最多让JVM管理多少堆空间,那么它就会认为占用这些空间都是合理的操作,所以并不会急着还给操作系统。这也是Java有时候会比C快的原因,内存分配和管理上JVM有天然优势,C你一调用malloc,内存就分配了,一调用free,内存就释放了,这些都是很耗时的操作,Java就有个缓冲其实为啥非要立即释放内存呢?只要不产生内存泄漏,占多一些也没所谓吧。你只要控制最大内存占用量即可
      

  13.   

    达到了多少?因为50M只是堆内存,还有JVM本身的内存占用
      

  14.   

    55M。参数的确有作用,设置为-Xmx1m不能启动。
      

  15.   

    55M。参数的确有作用,设置为-Xmx1m不能启动。这个上限没什么意义,我需要回落。
      

  16.   

    Full GC才是真正回收,仔细看一下所有Full GC信息,后面有内存大小的描述。
    输出信息:
    464.129: [Full GC (System.gc())  12511K->8380K(21296K), 0.0511006 secs]
    但是通过操作系统的任务管理器查看软件占用内存50M多。是不是这样的:这个回收并没有还给操作系统,而是仍然属于虚拟机。由于软件流程比较多,软件的内存占用就比较大,怎样才能让虚拟机不占有那么多内存,还给操作系统?测试表明启动参数-Xms30m没有效果。
    是的,Java虚拟机在内存在虚拟机启动时便已经分配,至于分配大小,自己配置参数来控制。还有要看Java虚拟机全部情况,如堆大小,栈大小,线程情况,可以运行jconsole来观察。
      

  17.   

    http://blog.chinaunix.net/uid-20554039-id-1625573.html
    这里的说明挺详细的。
      

  18.   

    你如果想精准地完全自主地控制内存占用,那Java并不是你想要的语言。用C/C++吧
      

  19.   

    请使用clear();可以减少对象的引用次数。GC有根据引用次数来判断是否有效对象的。
    对于作用域在结束位置置null跟不置是一样效果的。
    System.gc()不要写进代码。
      

  20.   

    sun.misc.Unsafe.allocateMemory(long); 
      

  21.   

    sun.misc.Unsafe.freeMemory(long); 
      

  22.   

    -Xmx只是指JVM最大可用堆内存,实际占用的内存还需要包含堆外的内存。就像你创建一个JAVA线程,堆里要用掉一点内存,同时堆外也会创建一个需要占用内存的系统线程。一般来说GC执行会将“世界”静止掉,所以尽量少和尽量快的执行GC才是正道。但有时候有些应用如果不自己来管理内存实现起来真的很不理想,比如缓存。所以这种情况而你又要用JAVA的话最好的性能就是自己管理内存了。BigMemory
    http://terracotta.org/products/bigmemory
    这个是利用ByteBuffer.allocateDirect方法申请一块内存然后自己来管理,缺点是放入的对象需要序例化。