非常慢的java应用程序启动
问题描述:
我有一个很奇怪的问题。我的Java应用程序启动非常慢。以下是一段代码:非常慢的java应用程序启动
public static void main(String[] args) {
System.out.println("Is this going to be printed really fast?");
if (args.length == 0) {
//other code below
事情是即使println语句不是即时打印它。我尝试了远程分析 - 无济于事,JVM显然不够快。我试着在println上设置一个断点,然后用调试器远程连接 - 断点在几分钟内不会被触发。我的JVM版本:
java -Xmx120m -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
我的操作系统是:Linux的2.6.27.45光泽-1.8.3.ddn3.3#1 SMP星期二10月19日15时02分53秒BST 2010 x86_64的GNU/Linux和我没有静态类。 我调用我的应用程序的方式 - java -Xmx120m -jar/path/to/app。如果我有代码中的错误 - 我会理解 - 昂贵的操作,片状逻辑 - 无论如何。但是,主班后的第一个声明,启动缓慢,我不认为这是正常的。
答
在你的代码中是否有大的静态类初始化?它们在main
的第一行之前执行。例如,下面的代码首先输出“Bark”,然后“我们现在在做吠叫吗?”第二。
public class Example
{
static Woof w = new Woof();
public static void main(String[] args)
{
System.out.println("Are we done barking now?");
}
}
class Woof
{
Woof()
{
System.out.println("Bark");
}
}
请注意,只有在显式调用构造函数时才会发生这种情况。
答
“主”方法不一定是第一个执行的代码。
静态初始化代码首先在加载类时执行,所以有可能这些静态初始化代码需要很长时间才能运行。
答
如果你认为它很慢,你的第一个行动是量化它。
例如,如果命令几乎立即执行并完成,则可以使用“time”命令来指定从加载开始到结束的命令的总时间。
例如: $ time java -cp。 MyClassInTrouble
假设问题很简单,但仍然遇到启动缓慢的问题。您可以看到strace在系统调用级别看到崩溃,并轻松地了解在JVM启动(而不是您的程序)上花费了多少时间。
你使用哪个操作系统? – neworld
你能定义“慢”吗?它有多慢? –
您可以尝试使用'java -verbose'或'java -verbose:class'运行它。如果您的其他代码需要加载很多类,则可能需要一些时间。 – Matteo