java - java中CPU消耗高
问题描述
我有一个 java pc 应用程序,一旦加载了相应的配置数据,CPU 性能就会逐渐提高。
基本上有2个线程,一个主线程和一个辅助线程。在主线程中生成登录和数据加载,而在第二个线程中,每 10 秒生成一次查询。如果会话启动但未加载数据,则第二个线程继续查询但性能最低。CPU 消耗的增加是在数据加载后逐渐增加的。
此外,如果再次加载数据,消耗量会降至最低,一旦加载,消耗量会再次增加。
public static void main (String [] args)
{
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainWindow window = MainWindow.getInstance ();
window.get_headerPanel().get_buttonLoad().addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(window
,"Changes made will be lost \ nDo you want to continue?"
,"Load device configuration"
, JOptionPane.YES_NO_OPTION)) {
Device.getInstance().reset ();
window.reset();
if (CommManager.getInstance().load())
//Rest of the program
}
}
};
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
@Override
public void run() {
while (true) {
if (openSession && Protocol.command == false) {
System.out.print("MONITOR STATUS\n");
monitor_status ();
}
try {
Thread.sleep(10000);
}
catch (Exception e) {
// TODO: handle exception
}
catch (Throwable t) {
// TODO: handle exception
}
}
}
由于保密问题,我无法发布更多代码。而且我看不出 CPU 的提升是从哪里来的。EventQueue、ActionListener、垃圾收集器等这些项目中的任何一个都会导致这个问题吗?
对于 Java 垃圾收集器,我使用以下参数:
java -jar -XX:+UseG1GC -XX:MaxGCPauseMillis=5000 -XX:ParallelGCThreads=20 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=75 .\code.jar
解决方案
关于您发布的代码的唯一令人担忧的是,您似乎在ActionListener
方法中运行所有业务逻辑以响应按钮单击。如果// Rest of the program
需要很长时间,则 GUI 将冻结。然而,这似乎不是你在说什么。
根据您对症状的描述,我想说您提到的任何事情都不是罪魁祸首。
IMO,问题很可能出在您未向我们展示的某些代码中。例如,如果monitor_status()
在某个大数据结构中不断积累内存,而程序中的某些内容O(log N)
(或更糟)取决于数据结构的大小。
不断增长的数据结构也可能导致垃圾收集器每次运行时花费越来越多的时间。但是,我希望这会导致java.lang.OutOfMemoryError: GC overhead limit exceeded
CPU 持续升高而不是持续升高。
但是,请注意,这只是基于您提供给我们的限制信息的推测。
我的建议与其他人给出的建议相同:
- 使用 CPU 分析器尝试查找大部分 CPU 的使用位置。
- 使用内存分析器尝试查找内存泄漏的证据。
推荐阅读
- sql - 函数 PL/SQL ORACLE
- android - 如何从 Kotlin 的 recyclerview 获取 Checkbox isChecked 数据
- java - JAVA 正则表达式识别值并对路径参数进行分类
- angular - Angular 11(或 9+)I18n 在启动时设置语言环境
- java - 具有非 void 返回值的方法的 Java Spring 异步异常处理
- activemq - 如何通过命令行获取 Apache ActiveMQ 的统计信息
- node.js - Connect-mongodb-session: TypeError: Cannot read property 'Store' of undefined (mongodb, nodejs, connect-mongodb-session)
- powershell - 不同计算机语言的日期转换出错
- c# - 反序列化列表
使用运行时的类型 - c# - 我可以在 Dapper 中使用查询方法来插入和更新行吗?