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;
}
}
}
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;
}
}
}
但是时间上不要相信JVM的GC。它根据引用情况查找对象,也会出现泄漏的。
在Java里这种差别不大,循环一次就是一个对象的引用期结束。
它们都会出现耗内存过多的情况。然后gc。
而不是因为第一个是static的,就会每一次循环,会立即释放一次,java哪那么像Python啊?