在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响应。有人能指出我正确的方向吗?