Java - 诊断高CPU使用率

时间:2014-11-09 20:49:37

标签: java linux

here稍微过了一点之后,我抓住了YourKit Java Profiler并将其与Eclipse很好地集成在一起。它向我展示了这个应用程序的一些内容,但由于我缺乏Java经验,现在我遇到了限制。

报告高CPU使用率(~49%)的第一个代码块如下。这会在套接字连接上读取字符串并将其移除。这一切似乎都很好。 但是,对Runtime.freeMemory()的调用本身就报告了41%的CPU使用率。为什么会这样?

protected void PerformGarbageCollection()
{
    long oldMem = m_runtime.freeMemory();
    if (oldMem < 4000000)
    {
        m_runtime.gc();
        m_runtime.freeMemory();
    }
}

@Override
public void run()
{
    ByteBuffer.allocate(BUFFER_SIZE);
    int loopCounter = 0;

    do
    {
        if (loopCounter++ > 10)
        {
            PerformGarbageCollection();
            loopCounter = 0;
        }

        try
        {
        //reading stuff...
        }
        catch (Throwable e)
        {
            System.out.println(e.getClass().getName() + " EXCEPTION in read loop: " + e.getMessage());
        }
    }
    while (true);
}

我的第一印象是对Runtime.freeMemory()的第二次调用毫无用处。在那之后,我的印象是,这种清理后的方式真的很粗糙。我在这里缺少一些Java的怪癖,还是只是马虎? 更重要的是,这可能是'正确'的方法吗?

如果我只是禁用垃圾收集,我结束EventDispatchThread.run()声称占用了71%的CPU。当我深入查看探查器中的第一个Java系统调用时,我发现Window.setVisible()占用了7%的CPU全部都是寂寞的。

public final void CreateOTable(int x, int y, int xx, int yy, String suffix)
{
    JFrame oframe = new JFrame(OTable.title);
    OTable ot = new OTable(oframe);

    ot.setOpaque(true);
    ot.SetTScreen(m_TScreen);
    oframe.setContentPane(ot);
    oframe.setJMenuBar(new OTableMenu(ot));
    LoadOTable(ot, x, y, xx, yy, suffix);
    oframe.setSize(x, y);
    oframe.setLocation(xx, yy);
//==========================
    oframe.setVisible(true);  //This line
//==========================
    ScreenListener.otv.add(ot);
    oframe.addWindowListener(owner);
}

同样,我不确定这里发生了什么。将UI元素设置为可见只是一次性完成的函数调用,对吗?

同样,即使在使用对话框加载配置文件后,以下对JOptionPane.showInputDialog()的调用也会提高28%。

String filename = config_file;
if (filename == "")
{
    filename = JOptionPane.showInputDialog("Please enter config file.");
    if (filename == null)
        filename = "";
}

这里到底发生了什么?这似乎不应该吞噬系统资源,但我的最终用户报告了缓慢的GUI响应。有人能指出我正确的方向吗?

0 个答案:

没有答案