在程序中频繁的手动调用是否会反而导致内存的使用量变大?从而导致系统当机?
比如对一个视频进行循环播放,在每次播放完毕后进行一次手动调用system.gc(),然后在进行从新播放,这样会对程序有影响吗?谁能帮帮忙~

解决方案 »

  1.   

    Sysytem.gc();只是告诉JVM垃圾回收,但是至于JVM是否会回收是没办法控制的。所以你调用不调用gc对系统来说没有太大的影响。
      

  2.   

    Sysytem.gc(); 这个只是通知JVM进行垃圾回收,但JVM具体什么时候回收是程序员无法控制的。
      

  3.   

    有吧,就比如一个系统,你登陆后用map保存一些你需要的临时数据,退出的时候必须用system.gc()进行摧毁,当然如果很久不用map里面的键值对就可以不用system.gc()了,jvm会自动清除的。
      

  4.   

    也就是说,果然程序的频繁调用GC,但是JVM没有到达要求,也不会去执行,虽然手动要求执行,但是系统内部还是要由JVM决定是吗?
      

  5.   

    恩  是的.JVM回收垃圾是其内部判断是否应该进行垃圾回收。而不受外部支配
      

  6.   

    这个就像你在饭店吃饭,你点好了菜,菜按顺序上的,你调了system.gc(),厨师看你催的急给你插个队,所以说不定要看CPU有没有调度时间给你。
      

  7.   

    我也看过一点,jvm方面的书。我猜测可能是这样的。有很多因素都会导致 jvm 进行垃圾回收。但是因素分为两种类型
    一种是触发型。这就好比你新new 一个对象,jvm发现eden区(你可以理解为堆中的某块区域)空间不够了。这个时候,jvm就会进行一次minorGC(你可以理解为一种垃圾回收程序)。一种是检查型。比如你虚拟机参数为当老年代(你可以理解为堆中的某块区域)中内存使用率达到了68%的时候就进行一次majorGC(你可以理解为一种垃圾回收程序)。
    对于触发型,是不得不gc的。
    而对于检查型,相当于一个线程,每隔一段时间就执行某段程序检查看需不需要gc.
    而System.gc()。就是建议虚拟机检查一下需不需要gc(也就是上面那个线程,每隔一段时间执行的那个程序).
    也就是说本来是30s之后看需不需要gc,而你在此时此刻就让他看需不需要gc.
    这是个人猜测,不一定对。
      

  8.   

    那也就是说,手动调用system.gc()还是会起作用的。那么如果频繁调用,如1分钟调用一次,当一个线程执行完一次,调用一次,是否会导致内存的使用反而增加?大家回复了这么多,我还是没有弄明白是否会内存有影响?会不会导致系统当机?
      

  9.   

    会有影响吧。你想想,一直催着jvm做事,搞不好它忙不过来而且又是相同的资源,可能很消耗内存
      

  10.   

    做过一个 试验,不一定准确,在一个并发比较高的程序中,每次线程结束都调用一下System.gc(),结果内存下来了,原来会上升到300M左右会被JVM给清理掉,现在会稳定在30M左右,但CPU由由原来的1.5%左右上升到了6%左右,跟踪了一下线程,发现会有好多堆栈跟踪的线程在频繁启动,所以个人感觉频繁调用System.gc()对资源还有一定消耗的。
      

  11.   

    static int i = 1;
    public RubbishRelease() {
    System.out.println(i++);
    } public void finalize() {
    System.out.println("finalize...");
    } public static void main(String[] args) {
    for (int i = 0; i < 100000; i++) {
    new RubbishRelease();
    new RubbishRelease();
    new RubbishRelease();
    System.gc();
    }
    System.out.println("over!");
    }试试这个~比较下速度,非常明显,所以gc还是不能随便适用嘀~
      

  12.   

    system.gc()只是建议jvm回收垃圾,但决定权还是在JVM手里,由她决定是否现在要回收垃圾。