1、JAVA在内存回收采用garbage collection(垃圾回收)机制,JVM对内存的使用采用堆和栈两种存储方式,堆主要用来动态对象申请,栈则负责管理静态的对象,垃圾回收的机制是针对堆回收使用的一种机制。对比下面两段代码中sb变量,哪一个在第一次垃圾回收之后仍然存在:(   ),如果这两段代码都执行了两次,等于整个过程申请了四个StringBuffer对象,那么你认为这四个对象在发生垃圾回收的时候都可以回收吗?(  )(可供的选择是或者否)
A:
public static String scopingExample(String string) { 
  StringBuffer sb = new StringBuffer(); 
  sb.append("hello ").append(string); 
  sb.append(", nice to see you!"); 
  return sb.toString(); 
} B:
static StringBuffer sb = new StringBuffer(); 
public static String scopingExample(String string) { 
  sb = new StringBuffer(); 
  sb.append("hello ").append(string); 
  sb.append(", nice to see you!"); 
  return sb.toString(); 
}2、下面两段代码,你认为那个可能会出现性能问题?(  )问题现象是什么?(            )
A:
private static Object bigObject;public static void test(int size) { 
  long startTime = System.currentTimeMillis(); 
  long numObjects = 0; 
  while (true) { 
    bigObject = new SizableObject(size); 
    long endTime = System.currentTimeMillis(); 
    ++numObjects; 
    // We print stats for every two seconds 
    if (endTime - startTime >= 2000) { 
      System.out.println("Objects created per 2 seconds = " + numObjects); 
      startTime = endTime; 
      numObjects = 0; 
    } 
  } 
} B:
private static Object bigObject;public static void test(int size) { 
  long startTime = System.currentTimeMillis(); 
  long numObjects = 0; 
  while (true) { 
    bigObject = null;
    bigObject = new SizableObject(size); 
    long endTime = System.currentTimeMillis(); 
    ++numObjects; 
    // We print stats for every two seconds 
    if (endTime - startTime >= 2000) { 
      System.out.println("Objects created per 2 seconds = " + numObjects); 
      startTime = endTime; 
      numObjects = 0; 
    } 
  } 
}

解决方案 »

  1.   

    A里面只有返回值的那个地方,有可能会在GC保留。B是static那个变量和返回值会保留。
    但是时间上不要相信JVM的GC。它根据引用情况查找对象,也会出现泄漏的。
      

  2.   

    第二个问题几乎是一样的。我知道,面试官以为那个循环内外定义变量有差别吧。
    在Java里这种差别不大,循环一次就是一个对象的引用期结束。
    它们都会出现耗内存过多的情况。然后gc。
    而不是因为第一个是static的,就会每一次循环,会立即释放一次,java哪那么像Python啊?
      

  3.   

    我觉得都会溢出 不断的再new
      

  4.   

    看错了第二个的代码,原来也是static ,但是我觉得是完全不影响什么的。