面支付宝的时候谈到垃圾回收,我说你可以调用方法进行垃圾回收,但jvm并不一定会立即执行垃圾回收,结果面试官问我jvm为什么设计成这样?就是说为什么不立即执行?怎么答?另外他问我struts与webwork实现机制有什么区别,我大概说了下,好像他不满意,他说什么struts的标签丰富什么的 汗

解决方案 »

  1.   

    如果只学了struts2 没接触过webwork也要问? 这面试官真
      

  2.   


    struts2 不就是整合了webwork嘛?
      

  3.   

    JVM之所以不马上回收垃圾 应该也是有个优先级问题吧 
      

  4.   

    jvm的这个问题还没有想过,不过是个很好的问题
      

  5.   

    在C 语言中,需要程序员自己调用方法销毁垃圾,但是出现了许多问题,比如说程序员忘记清理垃圾了那怎么办?
    那肯定会出现错误,而且在一个大项目中需要清理的东西很多,可在哪清理,什么时候清理是一个大难题,很麻烦。
    那为什么不交给系统自己清理呢?
     这样,在JAVA中就可以调用finalize()这个方法清理,当然这个方法只是提醒JVM需要清理,它有可能被清理,但这只是JVM 的事情,你控制不了它。
      

  6.   

    那个WebWrok 我不懂,不知道怎么回答
      

  7.   

    gc
    public static void gc()运行垃圾回收器。 
    调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。 调用 System.gc() 实际上等效于调用:  Runtime.getRuntime().gc()
    这个方法已经会“尽力”回收了。
      

  8.   

    我在哪个教程上看到说,jvm是在程序无内存可用的情况下才将不用的内存回收
      

  9.   

    jvm回收垃圾是一个线程(优先级比较低)!我们调用system.gc()只是把cpu立即分配给垃圾回收的线程 但是回收还是不回收gc他有自己的算法!
    个人观点 不代表权威 呵呵!!~~
      

  10.   

    不是对象被丢弃之后就立马回收的,虚拟机做垃圾回收有不小的系统开销,频繁的回收肯定会降低系统的效率。而且垃圾回收所在线程优先级低,一般是在系统空闲和jvm内存不足且有对象需要被回收时,才执行。垃圾回收,势必有一个时间与空间的平衡点。具体什么时候执行,算是未知数。其实减少JVM在垃圾回收上的开销和平时的编程习惯也有关系,少用临时变量,因为方法一旦执行完就被丢弃了;如13楼所说,也不要显式的去调用gc,让JVM去“尽力”做一些不应该现在做的事,等等……
      

  11.   

    跟垃圾收集使用的算法等相关,这里一个例子: 
    For an example of a garbage collector that would usually ignore
    the System.gc() suggestion completely, consider a copying
    collector. That kind of garbage collector doesn't collect
    until it fills up half of the heap. So if you heap doesn't
    happen to be half full when you call System.gc(), no objects
    will be reclaimed.
      

  12.   

    http://www.artima.com/legacy/design/cleanup/messages/36.html
      

  13.   

    这个知道,我是说学S2的时候不知道Webwork 完全没这个概念的时候
      

  14.   

    JVM的堆内存管理像管理一个队列似的,建一个对象就在堆里加一块,这样内存分配效率高,但是内存回收却相当费事,还要队列重排,