在java.io.BufferedWriter
中有一种方法:
/**
* Our own little min method, to avoid loading java.lang.Math if we've run
* out of file descriptors and we're trying to print a stack trace.
*/
private int min(int a, int b) {
if (a < b) return a;
return b;
}
这种方法有什么意义?加载java.lang.Math
所需的额外文件描述符?
如果我使用-verbose:class
public class Main {
public static void main(String[] args) {
}
}
我会得到日志:
[Loaded java.lang.Math from /opt/jdk/jdk1.8.0_65/jre/lib/rt.jar]
答案 0 :(得分:2)
错误是这样说:
如果在尝试打印堆栈跟踪时用完了文件描述符,并且调用了Math.min(a, b)
,并且类加载器尚未加载Math(不太可能,但可能会发生,例如在启动时),那么你甚至无法生成堆栈跟踪。因此,他们已将min
直接添加到BufferedWriter
类以避免这种情况。
答案 1 :(得分:2)
如果您的JVM很早就失败,Math可能尚未加载。在调用main
之前,您的JVM执行了大量工作并运行了大量代码。这意味着在你达到这一点之前很多事情都会出错。
例如,这个简单的程序
public class HowManyStrings {
public static void main(String[] args) throws IOException {
System.out.println("Hello world");
System.in.read();
}
}
创建大约10,000个对象。
http://vanillajava.blogspot.co.uk/2015/10/common-misconception-how-many-objects.html