首页 > 解决方案 > 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

标签: javaeclipse

解决方案


关于您发布的代码的唯一令人担忧的是,您似乎在ActionListener方法中运行所有业务逻辑以响应按钮单击。如果// Rest of the program需要很长时间,则 GUI 将冻结。然而,这似乎不是你在说什么。

根据您对症状的描述,我想说您提到的任何事情都不是罪魁祸首

IMO,问题很可能出在您未向我们展示的某些代码中。例如,如果monitor_status()在某个大数据结构中不断积累内存,而程序中的某些内容O(log N)(或更糟)取决于数据结构的大小。

不断增长的数据结构也可能导致垃圾收集器每次运行时花费越来越多的时间。但是,我希望这会导致java.lang.OutOfMemoryError: GC overhead limit exceededCPU 持续升高而不是持续升高。

但是,请注意,这只是基于您提供给我们的限制信息的推测。


我的建议与其他人给出的建议相同:

  • 使用 CPU 分析器尝试查找大部分 CPU 的使用位置。
  • 使用内存分析器尝试查找内存泄漏的证据。

推荐阅读